Skip to content

Commit 8c30b50

Browse files
committed
优化: 使资源钩子支持color类型
1 parent 0212beb commit 8c30b50

7 files changed

Lines changed: 130 additions & 119 deletions

File tree

app/src/main/java/com/sevtinge/hyperceiler/XposedInit.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import com.sevtinge.hyperceiler.module.hook.systemframework.CleanShareMenu;
3232
import com.sevtinge.hyperceiler.module.hook.systemframework.ScreenRotation;
3333
import com.sevtinge.hyperceiler.module.hook.systemsettings.VolumeSeparateControlForSettings;
34-
import com.sevtinge.hyperceiler.module.hook.systemui.navigation.HandleLineCustom;
3534
import com.sevtinge.hyperceiler.module.hook.tsmclient.AutoNfc;
3635

3736
import de.robv.android.xposed.IXposedHookInitPackageResources;
@@ -67,7 +66,7 @@ public void initZygote(IXposedHookZygoteInit.StartupParam startupParam) throws T
6766
@Override
6867
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
6968
if ("com.miui.contentcatcher".equals(lpparam.packageName) ||
70-
"com.miui.catcherpatch".equals(lpparam.packageName)) {
69+
"com.miui.catcherpatch".equals(lpparam.packageName)) {
7170
return;
7271
}
7372
init(lpparam);
@@ -97,12 +96,6 @@ public void handleInitPackageResources(XC_InitPackageResources.InitPackageResour
9796
SidebarLineCustom.INSTANCE.initResource(resparam);
9897
}
9998
break;
100-
101-
case "com.android.systemui":
102-
if (mPrefsMap.getBoolean("system_ui_navigation_handle_custom")) {
103-
HandleLineCustom.INSTANCE.initResource(resparam);
104-
}
105-
break;
10699
}
107100
}
108101
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package com.sevtinge.hyperceiler.module.app;
22

33
import com.sevtinge.hyperceiler.module.base.BaseModule;
4-
import com.sevtinge.hyperceiler.module.hook.demo.CrashDemo;
4+
import com.sevtinge.hyperceiler.module.hook.demo.ColorTest;
55
import com.sevtinge.hyperceiler.module.hook.demo.ToastTest;
66

77
public class Demo extends BaseModule {
88
@Override
99
public void handleLoadPackage() {
1010
initHook(new ToastTest(), true);
11-
initHook(new CrashDemo(), true);
11+
// initHook(new CrashDemo(), true);
12+
initHook(new ColorTest(), true);
1213
}
1314
}

app/src/main/java/com/sevtinge/hyperceiler/module/app/SystemUI.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ public void handleLoadPackage() {
264264
initHook(new StatusBarIconPositionAdjust(), isStatusBarIconAtRightEnable);
265265

266266
// 导航栏
267-
initHook(HandleLineCustom.INSTANCE, mPrefsMap.getBoolean("system_ui_navigation_handle_custom"));
267+
initHook(new HandleLineCustom(), mPrefsMap.getBoolean("system_ui_navigation_handle_custom"));
268268
initHook(new NavigationCustom(), mPrefsMap.getBoolean("system_ui_navigation_custom"));
269269
initHook(new HideNavigationBar(), mPrefsMap.getBoolean("system_ui_hide_navigation_bar"));
270270
initHook(new RotationButton(), mPrefsMap.getStringAsInt("system_framework_other_rotation_button_int", 0) != 0);

app/src/main/java/com/sevtinge/hyperceiler/module/base/tool/ResourcesTool.java

Lines changed: 83 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,14 @@
2929
import android.content.res.AssetManager;
3030
import android.content.res.Configuration;
3131
import android.content.res.Resources;
32+
import android.content.res.TypedArray;
3233
import android.content.res.loader.ResourcesLoader;
3334
import android.content.res.loader.ResourcesProvider;
3435
import android.os.Build;
3536
import android.os.Handler;
3637
import android.os.ParcelFileDescriptor;
3738
import android.util.Pair;
39+
import android.util.TypedValue;
3840

3941
import com.sevtinge.hyperceiler.XposedInit;
4042
import com.sevtinge.hyperceiler.utils.ContextUtils;
@@ -208,33 +210,52 @@ private void applyHooks() {
208210
switch (method.getName()) {
209211
case "getInteger", "getLayout", "getBoolean",
210212
"getDimension", "getDimensionPixelOffset",
211-
"getDimensionPixelSize", "getText",
213+
"getDimensionPixelSize", "getText", "getFloat",
212214
"getIntArray", "getStringArray",
213215
"getTextArray", "getAnimation" -> {
214216
if (method.getParameterTypes().length == 1
215217
&& method.getParameterTypes()[0].equals(int.class)) {
216-
hookResMethod(method.getName(), int.class, hookBefore);
218+
hookResMethod(method.getName(), int.class, hookResBefore);
219+
}
220+
}
221+
case "getColor" -> {
222+
if (method.getParameterTypes().length == 2) {
223+
hookResMethod(method.getName(), int.class, Resources.Theme.class, hookResBefore);
217224
}
218225
}
219226
case "getFraction" -> {
220227
if (method.getParameterTypes().length == 3) {
221-
hookResMethod(method.getName(), int.class, int.class, int.class, hookBefore);
228+
hookResMethod(method.getName(), int.class, int.class, int.class, hookResBefore);
222229
}
223230
}
224231
case "getDrawableForDensity" -> {
225232
if (method.getParameterTypes().length == 3) {
226-
hookResMethod(method.getName(), int.class, int.class, Resources.Theme.class, hookBefore);
233+
hookResMethod(method.getName(), int.class, int.class, Resources.Theme.class, hookResBefore);
227234
}
228235
}
229236
}
230237
}
238+
239+
Method[] typedMethod = TypedArray.class.getDeclaredMethods();
240+
for (Method method : typedMethod) {
241+
switch (method.getName()) {
242+
case "getColor" -> {
243+
hookTypedMethod(method.getName(), int.class, int.class, hookTypedBefore);
244+
}
245+
}
246+
}
231247
}
232248

233249
private void hookResMethod(String name, Object... args) {
234250
XC_MethodHook.Unhook unhook = HookTool.findAndHookMethod(Resources.class, name, args);
235251
unhooks.add(unhook);
236252
}
237253

254+
private void hookTypedMethod(String name, Object... args) {
255+
XC_MethodHook.Unhook unhook = HookTool.findAndHookMethod(TypedArray.class, name, args);
256+
unhooks.add(unhook);
257+
}
258+
238259
public void unHookRes() {
239260
if (unhooks.isEmpty()) {
240261
isInit = false;
@@ -247,7 +268,27 @@ public void unHookRes() {
247268
isInit = false;
248269
}
249270

250-
private final HookTool.MethodHook hookBefore = new HookTool.MethodHook() {
271+
private final HookTool.MethodHook hookTypedBefore = new HookTool.MethodHook() {
272+
@Override
273+
protected void before(MethodHookParam param) {
274+
Resources mResources = (Resources) XposedHelpers.getObjectField(param.thisObject, "mResources");
275+
int index = (int) param.args[0];
276+
int[] mData = (int[]) XposedHelpers.getObjectField(param.thisObject, "mData");
277+
int type = mData[index + 0];
278+
if (type == TypedValue.TYPE_NULL) {
279+
return;
280+
}
281+
int id = mData[index + 3];
282+
if (id != 0) {
283+
Object value = getTypedArrayReplacement(mResources, id);
284+
if (value != null) {
285+
param.setResult(value);
286+
}
287+
}
288+
}
289+
};
290+
291+
private final HookTool.MethodHook hookResBefore = new HookTool.MethodHook() {
251292
@Override
252293
protected void before(MethodHookParam param) {
253294
Context context;
@@ -397,4 +438,41 @@ else if ("getDrawableForDensity".equals(method) || "getFraction".equals(method))
397438
}
398439
return null;
399440
}
441+
442+
private Object getTypedArrayReplacement(Resources resources, int id) {
443+
if (id != 0) {
444+
String pkgName = null;
445+
String resType = null;
446+
String resName = null;
447+
try {
448+
pkgName = resources.getResourcePackageName(id);
449+
resType = resources.getResourceTypeName(id);
450+
resName = resources.getResourceEntryName(id);
451+
} catch (Throwable ignore) {
452+
}
453+
if (pkgName == null || resType == null || resName == null) return null;
454+
455+
try {
456+
String resFullName = pkgName + ":" + resType + "/" + resName;
457+
String resAnyPkgName = "*:" + resType + "/" + resName;
458+
459+
Pair<ReplacementType, Object> replacement = null;
460+
if (replacements.containsKey(resFullName)) {
461+
replacement = replacements.get(resFullName);
462+
} else if (replacements.containsKey(resAnyPkgName)) {
463+
replacement = replacements.get(resAnyPkgName);
464+
}
465+
if (replacement != null) {
466+
switch (replacement.first) {
467+
case OBJECT -> {
468+
return replacement.second;
469+
}
470+
}
471+
}
472+
} catch (Throwable e) {
473+
XposedLogUtils.logE("getTypedArrayReplacement", e);
474+
}
475+
}
476+
return null;
477+
}
400478
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.sevtinge.hyperceiler.module.hook.demo;
2+
3+
import android.graphics.Color;
4+
5+
import com.sevtinge.hyperceiler.module.base.BaseHook;
6+
7+
public class ColorTest extends BaseHook {
8+
@Override
9+
public void init() throws NoSuchMethodException {
10+
findAndHookMethod("com.hchen.demo.MainActivity", "setColor",
11+
new MethodHook() {
12+
@Override
13+
protected void before(MethodHookParam param) {
14+
mResHook.setObjectReplacement("com.hchen.demo", "color", "my_test_color", Color.RED);
15+
}
16+
}
17+
);
18+
}
19+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.sevtinge.hyperceiler.module.hook.systemui.navigation;
2+
3+
import com.sevtinge.hyperceiler.module.base.BaseHook;
4+
5+
public class HandleLineCustom extends BaseHook {
6+
@Override
7+
public void init() throws NoSuchMethodException {
8+
float mNavigationHandleRadius = (float) mPrefsMap.getInt("system_ui_navigation_handle_custom_thickness", 185) / 100;
9+
try {
10+
mResHook.setDensityReplacement("com.android.systemui", "dimen", "navigation_handle_radius", mNavigationHandleRadius);
11+
} catch (Exception e) {
12+
logE(TAG, e.toString());
13+
}
14+
int mNavigationHandleLightColor =
15+
mPrefsMap.getInt("system_ui_navigation_handle_custom_color", -872415232);
16+
int mNavigationHandleDarkColor =
17+
mPrefsMap.getInt("system_ui_navigation_handle_custom_color_dark", -1);
18+
mResHook.setObjectReplacement("com.android.systemui", "color",
19+
"navigation_bar_home_handle_dark_color", mNavigationHandleDarkColor);
20+
mResHook.setObjectReplacement("com.android.systemui", "color",
21+
"navigation_bar_home_handle_light_color", mNavigationHandleLightColor);
22+
}
23+
}

app/src/main/java/com/sevtinge/hyperceiler/module/hook/systemui/navigation/HandleLineCustom.kt

Lines changed: 0 additions & 103 deletions
This file was deleted.

0 commit comments

Comments
 (0)