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" />