diff --git a/android_client/app/src/main/AndroidManifest.xml b/android_client/app/src/main/AndroidManifest.xml index 89f74e6e3..dae81fc7d 100644 --- a/android_client/app/src/main/AndroidManifest.xml +++ b/android_client/app/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@ - + @@ -69,6 +68,7 @@ = Build.VERSION_CODES.O) { + startForegroundService(intent); + } else { + startService(intent); + } handler.postDelayed(updateButtonState, 1000); //moveTaskToBack(true); diff --git a/android_client/app/src/main/java/com/microsoft/hydralab/android/client/ScreenRecorderService.java b/android_client/app/src/main/java/com/microsoft/hydralab/android/client/ScreenRecorderService.java index 94dcc473b..b910ba1a3 100644 --- a/android_client/app/src/main/java/com/microsoft/hydralab/android/client/ScreenRecorderService.java +++ b/android_client/app/src/main/java/com/microsoft/hydralab/android/client/ScreenRecorderService.java @@ -6,6 +6,7 @@ import static android.media.MediaFormat.MIMETYPE_VIDEO_AVC; import android.app.Activity; +import android.app.Notification; import android.app.Service; import android.content.ComponentName; import android.content.Context; @@ -182,6 +183,8 @@ public int onStartCommand(Intent intent, int flags, int startId) { dstPath = new File(getSavingDir(), fileName).getAbsolutePath(); } + startForeground(Notifications.id, mNotifications.createRecordingNotification()); + if (mMediaProjection == null) { Intent data = intent.getParcelableExtra("data"); int resultCode = intent.getIntExtra("resultCode", 0); @@ -205,8 +208,6 @@ public int onStartCommand(Intent intent, int flags, int startId) { mAudioEncoder = audio == null ? null : new MicRecorder(audio); start(); - - startForeground(Notifications.id, mNotifications.createRecordingNotification()); } return START_STICKY; } diff --git a/common/src/main/java/com/microsoft/hydralab/common/entity/common/TestTaskSpec.java b/common/src/main/java/com/microsoft/hydralab/common/entity/common/TestTaskSpec.java index 566427b3d..469e0dcfb 100644 --- a/common/src/main/java/com/microsoft/hydralab/common/entity/common/TestTaskSpec.java +++ b/common/src/main/java/com/microsoft/hydralab/common/entity/common/TestTaskSpec.java @@ -63,6 +63,9 @@ public void updateWithDefaultValues() { if (StringUtils.isBlank(testSuiteClass)) { testSuiteClass = pkgName; } + if (enableNetworkMonitor && StringUtils.isBlank(networkMonitorRule)) { + networkMonitorRule = pkgName; + } } private void determineScopeOfTestCase() { diff --git a/common/src/main/java/com/microsoft/hydralab/common/management/listener/impl/PreInstallListener.java b/common/src/main/java/com/microsoft/hydralab/common/management/listener/impl/PreInstallListener.java index e09d25a5a..28d41036f 100644 --- a/common/src/main/java/com/microsoft/hydralab/common/management/listener/impl/PreInstallListener.java +++ b/common/src/main/java/com/microsoft/hydralab/common/management/listener/impl/PreInstallListener.java @@ -50,7 +50,6 @@ public void onDeviceConnected(DeviceInfo deviceInfo) { try { FlowUtil.retryAndSleepWhenFalse(3, 10, () -> deviceDriverManager.installApp(deviceInfo, appFile.getAbsolutePath(), classLogger)); classLogger.info("Pre-Install {} successfully", appFile.getAbsolutePath()); - break; } catch (Exception e) { String errorMessage = String.format("Pre-Install %s failed", appFile.getAbsolutePath()); classLogger.error(errorMessage, e); diff --git a/common/src/main/java/com/microsoft/hydralab/common/network/AndroidNetworkMonitor.java b/common/src/main/java/com/microsoft/hydralab/common/network/AndroidNetworkMonitor.java index fa5c48f94..e7d674fae 100644 --- a/common/src/main/java/com/microsoft/hydralab/common/network/AndroidNetworkMonitor.java +++ b/common/src/main/java/com/microsoft/hydralab/common/network/AndroidNetworkMonitor.java @@ -48,10 +48,14 @@ public void start() { logger.info("Start VPN service"); // launch vpn - String command_launch = "adb shell am start"; + String command_launch = "am start"; command_launch += " -a com.microsoft.hydralab.android.client.vpn.START"; command_launch += " -n com.microsoft.hydralab.android.client/.VpnActivity"; - ShellUtils.execLocalCommandWithResult(command_launch, logger); + try { + adbOperateUtil.execOnDevice(deviceInfo, command_launch, new MultiLineNoCancelLoggingReceiver(logger), logger); + } catch (Exception e) { + logger.error(e.getMessage(), e); + } while (true) { ThreadUtils.safeSleep(1000); boolean clicked = grantPermissionClick(); @@ -61,12 +65,16 @@ public void start() { } // start vpn - String command_start = "adb shell am start"; + String command_start = "am start"; command_start += " -a com.microsoft.hydralab.android.client.vpn.START"; command_start += " -n com.microsoft.hydralab.android.client/.VpnActivity"; command_start += String.format(" --es \"apps\" \"%s\"", rule); command_start += " --es \"output\" \"" + AndroidDumpPath + "\""; - ShellUtils.execLocalCommandWithResult(command_start, logger); + try { + adbOperateUtil.execOnDevice(deviceInfo, command_start, new MultiLineNoCancelLoggingReceiver(logger), logger); + } catch (Exception e) { + logger.error(e.getMessage(), e); + } while (true) { ThreadUtils.safeSleep(1000); boolean clicked = grantPermissionClick(); @@ -82,10 +90,14 @@ public void stop() { try { // stop vpn - String command_stop = "adb shell am start"; + String command_stop = "am start"; command_stop += " -a com.microsoft.hydralab.android.client.vpn.STOP"; command_stop += " -n com.microsoft.hydralab.android.client/.VpnActivity"; - ShellUtils.execLocalCommandWithResult(command_stop, logger); + try { + adbOperateUtil.execOnDevice(deviceInfo, command_stop, new MultiLineNoCancelLoggingReceiver(logger), logger); + } catch (Exception e) { + logger.error(e.getMessage(), e); + } ThreadUtils.safeSleep(2000); // pull result @@ -113,7 +125,7 @@ public void stop() { } private boolean grantPermissionClick() { - String[] possibleTexts = { "Start now", "Allow", "允许" }; + String[] possibleTexts = { "Start now", "Allow", "OK", "允许" }; String dump = dumpView(deviceInfo, logger); // classLogger.info("Dump on {}: {}", adbDeviceInfo.getSerialNum(), dump); if (StringUtils.isBlank(dump)) {