diff --git a/app/src/main/java/com/xypower/mpapp/MainActivity.java b/app/src/main/java/com/xypower/mpapp/MainActivity.java
index 2b169230..42594c9a 100644
--- a/app/src/main/java/com/xypower/mpapp/MainActivity.java
+++ b/app/src/main/java/com/xypower/mpapp/MainActivity.java
@@ -222,7 +222,7 @@ public class MainActivity extends AppCompatActivity {
binding.network.setSelection(appConfig.network);
}
- this.binding.startServBtn.setOnClickListener(new View.OnClickListener() {
+ this.binding.btnStartServ.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
@@ -242,16 +242,17 @@ public class MainActivity extends AppCompatActivity {
return;
}
+ binding.logs.setText("");
MicroPhotoContext.AppConfig curAppConfig = retrieveAndSaveAppConfig();
startMicroPhotoService(MainActivity.this, appConfig, mMessenger);
- binding.startServBtn.setEnabled(false);
- binding.stopServBtn.setEnabled(true);
+ binding.btnStartServ.setEnabled(false);
+ binding.btnStopServ.setEnabled(true);
}
});
- this.binding.saveCfg.setOnClickListener(new View.OnClickListener() {
+ this.binding.btnSaveCfg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
@@ -259,25 +260,25 @@ public class MainActivity extends AppCompatActivity {
}
});
- this.binding.takePhotoBtn.setOnClickListener(new View.OnClickListener() {
+ this.binding.btnTakePhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MicroPhotoService.takePhoto(view.getContext().getApplicationContext(), 1, 255, true);
}
});
- this.binding.takePhotoBtn2.setOnClickListener(new View.OnClickListener() {
+ this.binding.btnTakePhoto2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MicroPhotoService.takePhoto(view.getContext().getApplicationContext(), 2, 255, true);
}
});
- this.binding.takePhotoBtn3.setOnClickListener(new View.OnClickListener() {
+ this.binding.btnTakePhoto3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MicroPhotoService.takePhoto(view.getContext().getApplicationContext(), 3, 255, true);
}
});
- this.binding.takePhotoBtn4.setOnClickListener(new View.OnClickListener() {
+ this.binding.btnTakePhoto4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MicroPhotoService.takePhoto(view.getContext().getApplicationContext(), 4, 255, true);
@@ -309,17 +310,19 @@ public class MainActivity extends AppCompatActivity {
}
});
- this.binding.stopServBtn.setOnClickListener(new View.OnClickListener() {
+ this.binding.btnStopServ.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- Intent intent = new Intent(MainActivity.this, MicroPhotoService.class);
- intent.setAction(MicroPhotoService.ACTION_STOP);
+ // Intent intent = new Intent(MainActivity.this, MicroPhotoService.class);
+ // intent.setAction(MicroPhotoService.ACTION_STOP);
- MainActivity.this.stopService(intent);
+ // MainActivity.this.stopService(intent);
- binding.startServBtn.setEnabled(true);
- binding.stopServBtn.setEnabled(false);
+ MicroPhotoService.stopTerminalService(getApplicationContext());
+
+ binding.btnStartServ.setEnabled(true);
+ binding.btnStopServ.setEnabled(false);
}
});
@@ -407,8 +410,8 @@ public class MainActivity extends AppCompatActivity {
Runnable runnable = new Runnable() {
@Override
public void run() {
- if (binding.startServBtn.isEnabled()) {
- binding.startServBtn.performClick();
+ if (binding.btnStartServ.isEnabled()) {
+ binding.btnStartServ.performClick();
}
}
};
diff --git a/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java b/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java
index 307636f7..a6a741dc 100644
--- a/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java
+++ b/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java
@@ -169,6 +169,7 @@ public class MicroPhotoService extends Service {
intentFilter.addAction(ACTION_HEARTBEAT_MANUALLY);
intentFilter.addAction(ACTION_MSG_BROADCAST);
intentFilter.addAction(ACTION_VIDEO_FINISHED);
+ intentFilter.addAction(ACTION_STOP);
getApplicationContext().registerReceiver(mAlarmReceiver, intentFilter);
// IntentFilter intentFilter2 = new IntentFilter(ACTION_MSG_BROADCAST);
@@ -214,8 +215,10 @@ public class MicroPhotoService extends Service {
Log.w(TAG, "MicroPhotoService::onDestroy called");
- uninit(mNativeHandle);
- mNativeHandle = 0;
+ if (mNativeHandle != 0) {
+ uninit(mNativeHandle);
+ mNativeHandle = 0;
+ }
getApplicationContext().unregisterReceiver(mAlarmReceiver);
unregisterReceiver(mScreenaAtionReceiver);
@@ -406,6 +409,8 @@ public class MicroPhotoService extends Service {
Log.i(TAG, "Recording received(" + Long.toString(videoId) + "):" + path);
mService.recordingFinished(mService.mNativeHandle, result, path, videoId);
+ } else if (TextUtils.equals(ACTION_STOP, action)) {
+ mService.stopTerminalService();
}
}
}
@@ -712,8 +717,11 @@ public class MicroPhotoService extends Service {
break;
case ACTION_STOP:
- unregisterReceiver(mScreenaAtionReceiver);
+ try {
+ unregisterReceiver(mScreenaAtionReceiver);
+ } catch (Exception ex) {
+ }
stopForeground(true);
stopSelf();
break;
@@ -727,44 +735,95 @@ public class MicroPhotoService extends Service {
private void startTerminalService(Intent intent) {
- String appPath = MicroPhotoContext.buildAppDir(this.getApplicationContext());
+ if (MicroPhotoService.this.mNativeHandle != 0) {
+ return;
+ }
- String server = intent.getStringExtra("server");
- int port = intent.getIntExtra("port", 0);
- String cmdid = intent.getStringExtra("cmdid");
- int protocol = intent.getIntExtra("protocol", 0);
- int networkProtocol = intent.getIntExtra("networkProtocol", 0);
+ final String appPath = MicroPhotoContext.buildAppDir(this.getApplicationContext());
- if (!InetAddressUtils.isIPv4Address(server) && !InetAddressUtils.isIPv6Address(server)) {
- // It is a domain
- InetAddress addr = null;
- try {
- addr = InetAddress.getByName(server);
- } catch (Exception e) {
- e.printStackTrace();
- }
- if (addr != null) {
- server = addr.getHostAddress();
+ final String server = intent.getStringExtra("server");
+ final int port = intent.getIntExtra("port", 0);
+ final String cmdid = intent.getStringExtra("cmdid");
+ final int protocol = intent.getIntExtra("protocol", 0);
+ final int networkProtocol = intent.getIntExtra("networkProtocol", 0);
+
+ Runnable runnable = new Runnable() {
+ public void run() {
+
+ String ip = server;
+ if (!InetAddressUtils.isIPv4Address(ip) && !InetAddressUtils.isIPv6Address(ip)) {
+ // It is a domain
+ InetAddress addr = null;
+ try {
+ addr = InetAddress.getByName(server);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ if (addr != null) {
+ ip = addr.getHostAddress();
+ }
+ }
+
+ Log.i(TAG, "AppPath=" + appPath + " Server=" + ip + ":" + port + " cmdid=" + cmdid + " Protocol=" + protocol + " Network=" + networkProtocol);
+
+ MicroPhotoService service = MicroPhotoService.this;
+
+ service.mNativeHandle = init(appPath, server, port, cmdid, protocol, networkProtocol, 0);
+
+ if (service.mNativeHandle !=0) {
+ service.mCmdid = cmdid;
+ Date date = new Date();
+ long nowTs = date.getTime() / 1000;
+ date.setHours(0);
+ date.setMinutes(0);
+ date.setSeconds(0);
+ long startTime = date.getTime() / 1000;
+ long baseTime = nowTs - startTime;
+
+ service.registerCaptureSchedule(startTime, baseTime);
+ }
}
- }
- Log.i(TAG, "AppPath=" + appPath + " Server=" + server + ":" + port + " cmdid=" + cmdid + " Protocol=" + protocol + " Network=" + networkProtocol);
+ };
+
+ Thread th = new Thread(runnable);
+ th.start();
+ }
+
+ public static void stopTerminalService(Context context) {
- MicroPhotoService service = MicroPhotoService.this;
+ Intent alarmIntent = new Intent();
+
+ alarmIntent.setPackage(context.getPackageName());
+ alarmIntent.setAction(ACTION_STOP);
+ PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);
- service.mNativeHandle = init(appPath, server, port, cmdid, protocol, networkProtocol, 0);
+ AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
+ alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 100, pendingIntent);
+ }
- if (service.mNativeHandle !=0) {
- service.mCmdid = cmdid;
- Date date = new Date();
- long nowTs = date.getTime() / 1000;
- date.setHours(0);
- date.setMinutes(0);
- date.setSeconds(0);
- long startTime = date.getTime() / 1000;
- long baseTime = nowTs - startTime;
+ public void stopTerminalService() {
- service.registerCaptureSchedule(startTime, baseTime);
+ if (mNativeHandle == 0) {
+ return;
}
+
+ Runnable runnable = new Runnable() {
+ public void run() {
+ uninit(mNativeHandle);
+ mNativeHandle = 0;
+
+ try {
+ unregisterReceiver(mScreenaAtionReceiver);
+ } catch (Exception ex) {
+
+ }
+ stopForeground(true);
+ stopSelf();
+ }
+ };
+
+ Thread thread = new Thread(runnable);
+ thread.start();
}
public void requestWakelock(String name, long timeout) {
diff --git a/app/src/main/res/layout-land/activity_main.xml b/app/src/main/res/layout-land/activity_main.xml
index 4e1ead39..1731812c 100644
--- a/app/src/main/res/layout-land/activity_main.xml
+++ b/app/src/main/res/layout-land/activity_main.xml
@@ -11,7 +11,7 @@
android:id="@+id/textViewCmdId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginLeft="8dp"
+ android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:text="CMDID"
app:layout_constraintBottom_toBottomOf="@+id/cmdid"
app:layout_constraintStart_toStartOf="parent"
@@ -21,8 +21,8 @@
android:id="@+id/cmdid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginLeft="4dp"
- android:layout_marginTop="8dp"
+ android:layout_marginLeft="@dimen/activity_horizontal_margin_small"
+ android:layout_marginTop="@dimen/activity_vertical_margin"
android:ems="10"
android:imeOptions="actionDone"
android:inputType="text"
@@ -44,10 +44,9 @@
app:layout_constraintTop_toTopOf="@+id/cmdid" />
+ app:layout_constraintTop_toTopOf="@+id/heartbeat" />
+ app:layout_constraintStart_toEndOf="@+id/btnStopServ"
+ app:layout_constraintTop_toTopOf="@+id/btnStartServ" />
+ app:layout_constraintStart_toEndOf="@+id/btnSaveCfg"
+ app:layout_constraintTop_toTopOf="@+id/btnStartServ" />
+ app:layout_constraintTop_toBottomOf="@+id/btnStartServ" />
+ app:layout_constraintStart_toEndOf="@+id/btnTakePhoto"
+ app:layout_constraintTop_toTopOf="@+id/btnTakePhoto" />
+ app:layout_constraintStart_toEndOf="@+id/btnTakePhoto2"
+ app:layout_constraintTop_toTopOf="@+id/btnTakePhoto" />
+ app:layout_constraintStart_toEndOf="@+id/btnTakePhoto3"
+ app:layout_constraintTop_toTopOf="@+id/btnTakePhoto" />
+ app:layout_constraintTop_toBottomOf="@+id/btnTakePhoto" />
@@ -263,8 +258,8 @@
android:id="@+id/takeVideoBtn3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="8dp"
- android:minWidth="@dimen/activity_min_width"
+ android:layout_marginStart="@dimen/activity_horizontal_margin"
+ android:minWidth="@dimen/activity_btn_min_width"
android:text="@string/btn_tv_ch3"
app:layout_constraintStart_toEndOf="@+id/takeVideoBtn2"
app:layout_constraintTop_toTopOf="@+id/takeVideoBtn" />
@@ -273,8 +268,8 @@
android:id="@+id/takeVideoBtn4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginStart="8dp"
- android:minWidth="@dimen/activity_min_width"
+ android:layout_marginStart="@dimen/activity_horizontal_margin"
+ android:minWidth="@dimen/activity_btn_min_width"
android:text="@string/btn_tv_ch4"
app:layout_constraintStart_toEndOf="@+id/takeVideoBtn3"
app:layout_constraintTop_toTopOf="@+id/takeVideoBtn" />
@@ -284,9 +279,9 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/main_send_hb"
- android:layout_marginStart="8dp"
- android:layout_marginTop="8dp"
- android:minWidth="@dimen/activity_min_width"
+ android:layout_marginStart="@dimen/activity_horizontal_margin"
+ android:layout_marginTop="@dimen/activity_vertical_margin_small"
+ android:minWidth="@dimen/activity_btn_min_width"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/takeVideoBtn" />
@@ -295,8 +290,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/main_restart_app"
- android:layout_marginStart="8dp"
- android:minWidth="@dimen/activity_min_width"
+ android:layout_marginStart="@dimen/activity_horizontal_margin"
+ android:minWidth="@dimen/activity_btn_min_width"
app:layout_constraintStart_toEndOf="@+id/btnSendHb"
app:layout_constraintTop_toTopOf="@+id/btnSendHb" />
@@ -305,8 +300,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/main_reboot"
- android:layout_marginStart="8dp"
- android:minWidth="@dimen/activity_min_width"
+ android:layout_marginStart="@dimen/activity_horizontal_margin"
+ android:minWidth="@dimen/activity_btn_min_width"
app:layout_constraintStart_toEndOf="@+id/btnRestartApp"
app:layout_constraintTop_toTopOf="@+id/btnSendHb" />
@@ -320,7 +315,7 @@
android:text="sim卡获取"
android:visibility="gone"
app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/startServBtn" />
+ app:layout_constraintTop_toBottomOf="@+id/btnStartServ" />
+ app:layout_constraintTop_toBottomOf="@+id/btnStartServ" />
@@ -397,7 +392,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:barrierDirection="right"
- app:constraint_referenced_ids="textViewCmdId,cmdid,protocol,networkProtocol,saveCfg,takePhotoBtn4,btnChannels,network,takeVideoBtn4"
+ app:constraint_referenced_ids="textViewCmdId,cmdid,protocol,networkProtocol,btnSaveCfg,btnTakePhoto4,btnChannels,network,takeVideoBtn4"
tools:layout_editor_absoluteX="46dp" />
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index fe4b0b8e..7159ad26 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -39,7 +39,7 @@
app:layout_constraintTop_toTopOf="@+id/cmdid" />
+ app:layout_constraintStart_toEndOf="@+id/btnStopServ"
+ app:layout_constraintTop_toTopOf="@+id/btnStartServ" />
+ app:layout_constraintTop_toBottomOf="@+id/btnStartServ" />
+ app:layout_constraintTop_toBottomOf="@+id/btnStartServ" />
+ app:layout_constraintTop_toBottomOf="@+id/btnStartServ" />
+ app:layout_constraintTop_toBottomOf="@+id/btnTakePhoto" />
@@ -269,7 +269,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
- android:minWidth="@dimen/activity_min_width"
+ android:minWidth="@dimen/activity_btn_min_width"
android:text="@string/btn_tv_ch3"
app:layout_constraintStart_toEndOf="@+id/takeVideoBtn2"
app:layout_constraintTop_toTopOf="@+id/takeVideoBtn" />
@@ -279,7 +279,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
- android:minWidth="@dimen/activity_min_width"
+ android:minWidth="@dimen/activity_btn_min_width"
android:text="@string/btn_tv_ch4"
app:layout_constraintStart_toEndOf="@+id/takeVideoBtn3"
app:layout_constraintTop_toTopOf="@+id/takeVideoBtn" />
@@ -300,7 +300,7 @@
android:text="@string/main_restart_app"
android:layout_marginStart="8dp"
app:layout_constraintStart_toEndOf="@+id/btnSendHb"
- app:layout_constraintTop_toBottomOf="@+id/takePhotoBtn" />
+ app:layout_constraintTop_toBottomOf="@+id/btnTakePhoto" />
+ app:layout_constraintTop_toBottomOf="@+id/btnTakePhoto" />
+ app:layout_constraintTop_toBottomOf="@+id/btnTakePhoto4" />
4dp
8dp
8dp
- 72dp
+ 72dp
diff --git a/common/src/main/java/com/xypower/common/InetAddressUtils.java b/common/src/main/java/com/xypower/common/InetAddressUtils.java
index 3cf0bd46..859cd810 100644
--- a/common/src/main/java/com/xypower/common/InetAddressUtils.java
+++ b/common/src/main/java/com/xypower/common/InetAddressUtils.java
@@ -1,5 +1,7 @@
package com.xypower.common;
+import android.text.TextUtils;
+
import java.util.regex.Pattern;
public class InetAddressUtils {
@@ -11,18 +13,30 @@ public class InetAddressUtils {
private static final Pattern IPV6_HEX_COMPRESSED_PATTERN = Pattern.compile("^((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)::((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)$");
public static boolean isIPv4Address(final String input) {
+ if (TextUtils.isEmpty(input)) {
+ return false;
+ }
return IPV4_PATTERN.matcher(input).matches();
}
public static boolean isIPv6StdAddress(final String input) {
+ if (TextUtils.isEmpty(input)) {
+ return false;
+ }
return IPV6_STD_PATTERN.matcher(input).matches();
}
public static boolean isIPv6HexCompressedAddress(final String input) {
+ if (TextUtils.isEmpty(input)) {
+ return false;
+ }
return IPV6_HEX_COMPRESSED_PATTERN.matcher(input).matches();
}
public static boolean isIPv6Address(final String input) {
+ if (TextUtils.isEmpty(input)) {
+ return false;
+ }
return isIPv6StdAddress(input) || isIPv6HexCompressedAddress(input);
}
}