Skip to content

Commit 5ad1a1b

Browse files
committed
2 parents 7bd3233 + 8672ffd commit 5ad1a1b

3 files changed

Lines changed: 83 additions & 47 deletions

File tree

app/src/main/java/com/sevtinge/hyperceiler/module/hook/home/gesture/QuickBack.java

Lines changed: 55 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,23 @@
3838
*/
3939
public class QuickBack extends BaseHC {
4040
private static final HashMap<String, Integer> mResMap = new HashMap<>();
41+
private static int[] values = null;
4142

4243
@Override
4344
protected void init() {
45+
try {
46+
Class<?> mReadyStateClass = findClass("com.miui.home.recents.GestureBackArrowView$ReadyState").get();
47+
Enum<?> READY_STATE_BACK = (Enum<?>) getStaticField(mReadyStateClass, "READY_STATE_BACK");
48+
Enum<?> READY_STATE_RECENT = (Enum<?>) getStaticField(mReadyStateClass, "READY_STATE_RECENT");
49+
Enum<?> READY_STATE_NONE = (Enum<?>) getStaticField(mReadyStateClass, "READY_STATE_NONE");
50+
values = new int[((Object[]) callStaticMethod(mReadyStateClass, "values")).length];
51+
values[READY_STATE_BACK.ordinal()] = 1;
52+
values[READY_STATE_RECENT.ordinal()] = 2;
53+
values[READY_STATE_NONE.ordinal()] = 3;
54+
} catch (Throwable e) {
55+
logE(TAG, e);
56+
}
57+
4458
hookMethod("com.miui.home.recents.GestureStubView",
4559
"isDisableQuickSwitch",
4660
returnResult(false)
@@ -60,8 +74,16 @@ public void before() {
6074
Object getCurrentState = callMethod(mGestureBackArrowView, "getCurrentState");
6175

6276
int ordinal = (int) callMethod(getCurrentState, "ordinal");
63-
int[] mState = (int[]) getStaticField("com.miui.home.recents.GestureStubView$4", "$SwitchMap$com$miui$home$recents$GestureBackArrowView$ReadyState");
64-
ordinal = mState[ordinal];
77+
if (values == null) {
78+
Class<?> mGestureStubView$X = existsClass("com.miui.home.recents.GestureStubView$4") ?
79+
findClass("com.miui.home.recents.GestureStubView$4").get()
80+
: findClass("com.miui.home.recents.GestureStubView$5").get();
81+
int[] mState = (int[]) getStaticField(mGestureStubView$X, "$SwitchMap$com$miui$home$recents$GestureBackArrowView$ReadyState");
82+
ordinal = mState[ordinal];
83+
84+
} else
85+
ordinal = values[ordinal];
86+
6587
if (ordinal == 2) {
6688
callMethod(mGestureStubView, "onBackCancelled");
6789
logI(TAG, "call onBackCancelled");
@@ -84,69 +106,65 @@ public void before() {
84106
Object createLoadPlan = callMethod(taskLoader, "createLoadPlan", context);
85107
callMethod(taskLoader, "preloadTasks", createLoadPlan, -1);
86108
Object taskStack = callMethod(createLoadPlan, "getTaskStack");
87-
ActivityOptions activityOptions = null;
109+
88110
if (taskStack == null || (int) callMethod(taskStack, "getTaskCount") == 0 ||
89111
(runningTask = (ActivityManager.RunningTaskInfo) callMethod(recentsModel, "getRunningTask")) == null) {
90-
setResult(null);
112+
setResult(null); // 后台无其他任务
91113
return;
92114
}
115+
93116
ArrayList<?> stackTasks = (ArrayList<?>) callMethod(taskStack, "getStackTasks");
94-
int size = stackTasks.size();
95117
Object task = null;
96-
int i2 = 0;
97-
while (true) {
98-
if (i2 >= size - 1) {
118+
for (int i = 0; i < stackTasks.size() - 1; i++) {
119+
Object t = stackTasks.get(i);
120+
if ((int) getField(getField(t, "key"), "id") == runningTask.id) {
121+
task = stackTasks.get(i + 1);
99122
break;
100-
} else if ((int) getField(getField(stackTasks.get(i2), "key"), "id") == runningTask.id) {
101-
task = stackTasks.get(i2 + 1);
102-
break;
103-
} else {
104-
i2++;
105123
}
106124
}
107-
if (task == null && size >= 1 && "com.miui.home".equals(runningTask.baseActivity.getPackageName())) {
125+
if (task == null && !stackTasks.isEmpty() && "com.miui.home".equals(runningTask.baseActivity.getPackageName())) {
108126
task = stackTasks.get(0);
109127
}
128+
110129
if (task != null && getField(task, "icon") == null) {
111-
setField(task, "icon", callMethod(taskLoader, "getAndUpdateActivityIcon",
112-
getField(task, "key"),
113-
getField(task, "taskDescription"),
114-
context.getResources(), true
115-
));
130+
setField(task, "icon",
131+
callMethod(taskLoader, "getAndUpdateActivityIcon",
132+
getField(task, "key"),
133+
getField(task, "taskDescription"),
134+
context.getResources(),
135+
true
136+
)
137+
);
116138
}
117139
if (!(boolean) getArgs(1) || task == null) {
118140
setResult(task);
119141
return;
120142
}
121-
int i = (int) getArgs(2);
122-
if (i == 0) {
143+
144+
ActivityOptions activityOptions = null;
145+
int mGestureStubPos = (int) getArgs(2);
146+
if (mGestureStubPos == 0) {
123147
activityOptions = ActivityOptions.makeCustomAnimation(context,
124148
getAnimId(context, "recents_quick_switch_left_enter"),
125149
getAnimId(context, "recents_quick_switch_left_exit"));
126-
} else if (i == 1) {
150+
} else if (mGestureStubPos == 1) {
127151
activityOptions = ActivityOptions.makeCustomAnimation(context,
128152
getAnimId(context, "recents_quick_switch_right_enter"),
129153
getAnimId(context, "recents_quick_switch_right_exit"));
130154
}
131155
Object iActivityManager = callStaticMethod("android.app.ActivityManagerNative", "getDefault");
132156
if (iActivityManager != null) {
133-
try {
134-
if ((int) getField(getField(task, "key"), "windowingMode") == 3) {
135-
if (activityOptions == null) {
136-
activityOptions = ActivityOptions.makeBasic();
137-
}
138-
activityOptions.getClass().getMethod("setLaunchWindowingMode", Integer.class).invoke(activityOptions, 4);
157+
if ((int) getField(getField(task, "key"), "windowingMode") == 3) {
158+
if (activityOptions == null) {
159+
activityOptions = ActivityOptions.makeBasic();
139160
}
140-
callMethod(iActivityManager, "startActivityFromRecents",
141-
getField(getField(task, "key"), "id"),
142-
activityOptions == null ? null : activityOptions.toBundle());
143-
setResult(task);
144-
return;
145-
} catch (Exception e) {
146-
logE(TAG, "Error: " + e);
147-
setResult(task);
148-
return;
161+
callMethod(activityOptions, "setLaunchWindowingMode", 4);
149162
}
163+
callMethod(iActivityManager, "startActivityFromRecents",
164+
getField(getField(task, "key"), "id"),
165+
activityOptions == null ? null : activityOptions.toBundle());
166+
setResult(task);
167+
return;
150168
}
151169
setResult(task);
152170
}

app/src/main/java/com/sevtinge/hyperceiler/module/hook/various/clipboard/ClipboardList.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ public void init() {
6767
@Override
6868
protected void after(MethodHookParam param) {
6969
// logE(TAG, "get class: " + param.args[0]);
70-
filePath = "/data/user/0/" + lpparam.packageName + "/files/clipboard_data.dat";
71-
lastFilePath = "/data/user/0/" + lpparam.packageName + "/files/last_clipboard_data_list.dat";
70+
filePath = lpparam.appInfo.dataDir + "/files/clipboard_data.dat";
71+
lastFilePath = lpparam.appInfo.dataDir + "/files/last_clipboard_data_list.dat";
7272
// logE(TAG, "run: " + param.args[0]);
7373
getNoExpiredData((ClassLoader) param.args[0]);
7474
getView((ClassLoader) param.args[0]);

app/src/main/java/com/sevtinge/hyperceiler/module/hook/various/clipboard/NewClipboardList.java

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,6 @@
1919

2020
package com.sevtinge.hyperceiler.module.hook.various.clipboard;
2121

22-
import static com.sevtinge.hyperceiler.utils.log.XposedLogUtils.logD;
23-
import static com.sevtinge.hyperceiler.utils.log.XposedLogUtils.logE;
24-
import static com.sevtinge.hyperceiler.utils.log.XposedLogUtils.logI;
25-
import static com.sevtinge.hyperceiler.utils.log.XposedLogUtils.logW;
26-
2722
import android.content.ClipData;
2823
import android.content.Context;
2924
import android.net.Uri;
@@ -38,10 +33,16 @@
3833
import com.hchen.hooktool.tool.ParamTool;
3934
import com.sevtinge.hyperceiler.utils.ContentModel;
4035
import com.sevtinge.hyperceiler.utils.FileHelper;
36+
import com.sevtinge.hyperceiler.utils.log.XposedLogUtils;
37+
38+
import org.json.JSONArray;
4139

4240
import java.util.ArrayList;
4341
import java.util.stream.Collectors;
4442

43+
import de.robv.android.xposed.XC_MethodHook;
44+
import de.robv.android.xposed.XposedHelpers;
45+
4546
/**
4647
* 解除常用语剪贴板时间限制,条数限制和字数限制。
4748
* from <a href="https://github.com/HChenX/ClipboardList">ClipboardList</a>
@@ -60,11 +61,11 @@ public class NewClipboardList extends BaseHC implements LoadInputMethodDex.OnInp
6061
public void load(ClassLoader classLoader) {
6162
mGson = new GsonBuilder().setPrettyPrinting().create();
6263
mDataPath = lpparam.appInfo.dataDir + "/files/clipboard_data.dat";
63-
logI(TAG, "class loader: " + classLoader);
64+
XposedLogUtils.logI(TAG, "class loader: " + classLoader);
6465

6566
FileHelper.TAG = TAG;
6667
if (!FileHelper.exists(mDataPath)) {
67-
logE(TAG, "file create failed!");
68+
XposedLogUtils.logE(TAG, "file create failed!");
6869
return;
6970
}
7071

@@ -193,6 +194,23 @@ public void before() {
193194
}
194195
})
195196
);
197+
XposedHelpers.findAndHookMethod("com.miui.inputmethod.MiuiClipboardManager", classLoader, "buildClipboardModelDataType", "com.miui.inputmethod.ClipboardContentModel", new XC_MethodHook() {
198+
@Override
199+
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
200+
final boolean[] isSkip = {false};
201+
XposedHelpers.findAndHookConstructor(JSONArray.class, String.class, new XC_MethodHook() {
202+
@Override
203+
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
204+
String json = (String) param.args[0];
205+
if (TextUtils.isEmpty(json) || json == null) {
206+
isSkip[0] = true;
207+
XposedLogUtils.logW(TAG, lpparam.packageName, "Got null string, skip run. String = " + param.args[0]);
208+
}
209+
}
210+
});
211+
if (isSkip[0]) param.setResult(null);
212+
}
213+
});
196214

197215
}
198216

@@ -222,7 +240,7 @@ private void addClipboard(String add, int type, Context context) {
222240
}
223241
ArrayList<ContentModel> readData = toContentModelList(FileHelper.read(mDataPath));
224242
if (readData.isEmpty()) {
225-
logW(TAG, "can't read any data!");
243+
XposedLogUtils.logW(TAG, "can't read any data!");
226244
} else {
227245
if (readData.stream().anyMatch(contentModel -> contentModel.content.equals(add))) {
228246
readData.removeIf(contentModel -> contentModel.content.equals(add));

0 commit comments

Comments
 (0)