Skip to content

Commit 267a41b

Browse files
committed
support force stop, improve recording logic
1 parent d3b7a0b commit 267a41b

9 files changed

Lines changed: 104 additions & 61 deletions

File tree

src/app/src/main/java/com/alipay/hulu/replay/AbstractStepProvider.java

Lines changed: 63 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,27 @@
1515
*/
1616
package com.alipay.hulu.replay;
1717

18+
import android.app.ActivityManager;
1819
import android.content.Context;
1920
import android.content.DialogInterface;
2021
import androidx.appcompat.app.AlertDialog;
22+
23+
import android.os.Build;
2124
import android.view.View;
2225

2326
import com.alipay.hulu.R;
2427
import com.alipay.hulu.bean.ReplayResultBean;
2528
import com.alipay.hulu.bean.ReplayStepInfoBean;
29+
import com.alipay.hulu.common.application.LauncherApplication;
30+
import com.alipay.hulu.common.tools.BackgroundExecutor;
31+
import com.alipay.hulu.common.tools.CmdTools;
2632
import com.alipay.hulu.common.utils.LogUtil;
2733
import com.alipay.hulu.service.CaseReplayManager;
34+
import com.alipay.hulu.shared.node.action.PerformActionEnum;
2835
import com.alipay.hulu.shared.node.tree.export.bean.OperationStep;
36+
import com.alipay.hulu.util.DialogUtils;
2937

38+
import java.io.IOException;
3039
import java.util.Arrays;
3140
import java.util.Date;
3241
import java.util.List;
@@ -93,12 +102,62 @@ public List<ReplayResultBean> genReplayResult() {
93102
public abstract void onStepInfo(ReplayStepInfoBean bean);
94103

95104
public void onFloatClick(Context context, final CaseReplayManager manager) {
96-
showFunctionView(context, "是否终止回放", new Runnable() {
105+
DialogUtils.showFunctionView(context, Arrays.asList(PerformActionEnum.NORMAL_EXIT, PerformActionEnum.FORCE_STOP), new DialogUtils.FunctionViewCallback<PerformActionEnum>() {
106+
107+
@Override
108+
public void onExecute(DialogInterface dialog, PerformActionEnum action) {
109+
if (action == PerformActionEnum.NORMAL_EXIT) {
110+
manager.stopRunning();
111+
} else if (action == PerformActionEnum.FORCE_STOP) {
112+
// 移除所有Task
113+
ActivityManager am = (ActivityManager) LauncherApplication.getInstance()
114+
.getSystemService(Context.ACTIVITY_SERVICE);
115+
if (am != null && Build.VERSION.SDK_INT >= 21) {
116+
try {
117+
List<ActivityManager.AppTask> tasks = am.getAppTasks();
118+
for (ActivityManager.AppTask task: tasks) {
119+
task.finishAndRemoveTask();
120+
}
121+
} catch (Exception e) {
122+
e.printStackTrace();
123+
}
124+
}
125+
BackgroundExecutor.execute(new Runnable() {
126+
@Override
127+
public void run() {
128+
int pid = android.os.Process.myPid();
129+
String command = "kill -9 "+ pid;
130+
try {
131+
Runtime.getRuntime().exec(command);
132+
} catch (IOException e) {
133+
LogUtil.e(TAG, "强制关闭进程失败");
134+
}
135+
// adb强杀
136+
try {
137+
String cmd = "am force-stop " + LauncherApplication.getInstance().getPackageName();
138+
CmdTools.execCmd(cmd + " && " + cmd);
139+
} catch (Throwable e) {
140+
LogUtil.w(TAG, "force-stop fail??", e);
141+
}
142+
}
143+
}, 200);
144+
145+
// System exit
146+
System.exit(0);
147+
}
148+
dialog.dismiss();
149+
}
150+
151+
@Override
152+
public void onCancel(DialogInterface dialog) {
153+
dialog.dismiss();
154+
}
155+
97156
@Override
98-
public void run() {
99-
manager.stopRunning();
157+
public void onDismiss(DialogInterface dialog) {
158+
100159
}
101-
}, null);
160+
});
102161
}
103162

104163
/**
@@ -109,45 +168,4 @@ public void run() {
109168
public View provideView(Context context) {
110169
return null;
111170
}
112-
113-
/**
114-
* 展示操作dialog
115-
* @param message 消息
116-
* @param confirmAction 确定动作
117-
* @param cancelAction 取消动作
118-
*/
119-
protected void showFunctionView(Context context, String message, final Runnable confirmAction, final Runnable cancelAction) {
120-
try {
121-
AlertDialog dialog = new AlertDialog.Builder(context, R.style.SimpleDialogTheme)
122-
.setMessage(message)
123-
.setPositiveButton(R.string.constant__confirm, new DialogInterface.OnClickListener() {
124-
@Override
125-
public void onClick(DialogInterface dialog, int which) {
126-
if (confirmAction != null) {
127-
confirmAction.run();
128-
}
129-
dialog.dismiss();
130-
}
131-
})
132-
.setNegativeButton(R.string.constant__cancel, new DialogInterface.OnClickListener() {
133-
@Override
134-
public void onClick(DialogInterface dialog, int which) {
135-
if (cancelAction != null) {
136-
cancelAction.run();
137-
}
138-
dialog.dismiss();
139-
}
140-
}).setOnCancelListener(new DialogInterface.OnCancelListener() {
141-
@Override
142-
public void onCancel(DialogInterface dialog) {
143-
dialog.dismiss();
144-
}
145-
}).create();
146-
dialog.getWindow().setType(com.alipay.hulu.common.constant.Constant.TYPE_ALERT);
147-
dialog.setCanceledOnTouchOutside(false);
148-
dialog.show();
149-
} catch (Exception e) {
150-
LogUtil.e(TAG, e.getMessage());
151-
}
152-
}
153171
}

src/app/src/main/java/com/alipay/hulu/service/CaseRecordManager.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1378,7 +1378,7 @@ public void onProcessFunction(final OperationMethod method, final AbstractNodeTr
13781378
CmdTools.switchToIme("com.alipay.hulu/.common.tools.AdbIME");
13791379

13801380
// 等悬浮窗消失了再操作
1381-
LauncherApplication.getInstance().runOnUiThread(new Runnable() {
1381+
BackgroundExecutor.execute(new Runnable() {
13821382
@Override
13831383
public void run() {
13841384
// 返回是否处理完毕
@@ -1490,6 +1490,7 @@ protected boolean processAction(OperationMethod method, AbstractNodeTree node, f
14901490
}
14911491

14921492
if (!processed) {
1493+
binder.restoreFloat();
14931494
// 恢复悬浮窗
14941495
binder.restoreFloat();
14951496
Intent intent = new Intent(context, NewRecordActivity.class);

src/app/src/main/java/com/alipay/hulu/upgrade/PatchRequest.java

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,9 @@ public static void updatePatchList(final LoadPatchCallback callback) {
7474
return;
7575
}
7676

77+
String cpuAbi = DeviceInfoUtil.getCPUABIInArm();
7778
// 替换ABI参数
78-
String realUrl = StringUtil.patternReplace(storedUrl, "<abi>", filterAcceptAbi(DeviceInfoUtil.getCPUABI()));
79+
String realUrl = StringUtil.patternReplace(storedUrl, "<abi>", cpuAbi);
7980

8081
LogUtil.i(TAG, "Start request patch list on: " + realUrl);
8182

@@ -230,18 +231,6 @@ public void run() {
230231
}
231232
};
232233

233-
/**
234-
* 过滤可用ABI
235-
* @param abi
236-
* @return
237-
*/
238-
private static String filterAcceptAbi(String abi) {
239-
if (ACCEPT_ABI.contains(abi)) {
240-
return abi;
241-
}
242-
return "armeabi-v7a";
243-
}
244-
245234
public interface LoadPatchCallback {
246235
void onLoaded();
247236
void onFailed();

src/common/src/main/java/com/alipay/hulu/common/utils/DeviceInfoUtil.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@
2828
import java.net.InetAddress;
2929
import java.net.NetworkInterface;
3030
import java.net.SocketException;
31+
import java.util.Arrays;
3132
import java.util.Enumeration;
33+
import java.util.List;
3234

3335

3436
/**
@@ -99,6 +101,27 @@ public static String getCPUABI() {
99101
}
100102
}
101103

104+
/**
105+
* 兼容X86的arm64-v8a或armeabi-v7a,兜底armeabi
106+
* @return
107+
*/
108+
public static String getCPUABIInArm() {
109+
List<String> supportAbis;
110+
if (Build.VERSION.SDK_INT < 21) {
111+
String originAbi = Build.CPU_ABI;
112+
String secondAbi = Build.CPU_ABI2;
113+
supportAbis = Arrays.asList(originAbi, secondAbi);
114+
} else {
115+
supportAbis = Arrays.asList(Build.SUPPORTED_ABIS);
116+
}
117+
if (supportAbis.contains("arm64-v8a")) {
118+
return "arm64-v8a";
119+
} else if (supportAbis.contains("armeabi-v7a")) {
120+
return "armeabi-v7a";
121+
}
122+
return "armeabi";
123+
}
124+
102125
public static String getIP() {
103126
InetAddress ip = getLocalInetAddress();
104127
return ip == null ? "" : ip.getHostAddress();

src/common/src/main/java/com/alipay/hulu/common/utils/StringUtil.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ public static String getString(Context context, @StringRes int res, Object... ar
367367
* @param contents
368368
* @return
369369
*/
370-
public static String join(CharSequence joiner, List<String> contents) {
370+
public static String join(CharSequence joiner, List<? extends Object> contents) {
371371
if (contents == null || contents.size() == 0) {
372372
return "";
373373
}
@@ -385,7 +385,7 @@ public static String join(CharSequence joiner, List<String> contents) {
385385
* @param contents
386386
* @return
387387
*/
388-
public static String join(CharSequence joiner, CharSequence... contents) {
388+
public static <T extends Object> String join(CharSequence joiner, T... contents) {
389389
if (contents == null || contents.length == 0) {
390390
return "";
391391
}

src/shared/src/main/java/com/alipay/hulu/shared/event/touch/CmdTouchService.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.alipay.hulu.common.service.base.LocalService;
2525
import com.alipay.hulu.common.tools.CmdTools;
2626
import com.alipay.hulu.common.utils.LogUtil;
27+
import com.alipay.hulu.common.utils.MiscUtil;
2728

2829
/**
2930
* Created by qiaoruikai on 2019/12/2 2:22 PM.
@@ -44,11 +45,16 @@ public void press(int x, int y, int pressTime) {
4445

4546
@Override
4647
public void scroll(int x1, int y1, int x2, int y2, int scrollTime) {
48+
long currentTime = System.currentTimeMillis();
4749
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN_MR2) {
4850
CmdTools.execHighPrivilegeCmd("input swipe " + x1 + " " + y1 + " " + x2 + " " + y2);
4951
} else {
5052
CmdTools.execHighPrivilegeCmd("input swipe " + x1 + " " + y1 + " " + x2 + " " + y2 + " " + scrollTime);
5153
}
54+
long timeToSleep = currentTime + scrollTime - System.currentTimeMillis();
55+
if (timeToSleep > 0) {
56+
MiscUtil.sleep(timeToSleep);
57+
}
5258
}
5359

5460
@Override

src/shared/src/main/java/com/alipay/hulu/shared/node/action/PerformActionEnum.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ public enum PerformActionEnum {
9999
/**
100100
* 本地模式专用 5
101101
*/
102+
FORCE_STOP("forceStop", R.string.action__force_stop, 6, 2, R.drawable.dialog_action_drawable_cancel),
103+
NORMAL_EXIT("slaveExit", R.string.action__normal_exit, 6, 2, R.drawable.dialog_action_drawable_cancel),
102104

103105
/**
104106
* 内部操作,不对外

src/shared/src/main/res/values-zh/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@
120120
<string name="action__pinch_in">全局缩小</string>
121121
<string name="action_param__gesture_path">手势路径</string>
122122
<string name="action_param__gesture_filter">手势操作间隔</string>
123+
<string name="action__force_stop">强制关闭</string>
124+
<string name="action__normal_exit">结束回放</string>
123125
<string name="running_mode__accessibility_mode">通用模式</string>
124126
<string name="running_mode__capture_mode">图像查找模式</string>
125127
<string name="action__resume">恢复</string>

src/shared/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@
120120
<string name="action__pinch_in">Pinch In</string>
121121
<string name="action_param__gesture_path">Gesture path</string>
122122
<string name="action_param__gesture_filter">Gesture interval</string>
123+
<string name="action__force_stop">Force Stop</string>
124+
<string name="action__normal_exit">Exit Replay</string>
123125
<string name="running_mode__accessibility_mode">Accessibility Mode</string>
124126
<string name="running_mode__capture_mode">Screenshot Mode</string>
125127
<string name="action__resume">Resume</string>

0 commit comments

Comments
 (0)