From 1ffa4b5fe449a8e807e2612254c18a364252b328 Mon Sep 17 00:00:00 2001 From: 5ec1cff <56485584+5ec1cff@users.noreply.github.com> Date: Thu, 6 Jul 2023 17:47:34 +0800 Subject: [PATCH] Fix LayoutInflater not working on LSPosedContext (#2606) --- .../org/lsposed/lspd/impl/LSPosedContext.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/lsposed/lspd/impl/LSPosedContext.java b/core/src/main/java/org/lsposed/lspd/impl/LSPosedContext.java index 13f56c4b..94b6b90f 100644 --- a/core/src/main/java/org/lsposed/lspd/impl/LSPosedContext.java +++ b/core/src/main/java/org/lsposed/lspd/impl/LSPosedContext.java @@ -1,5 +1,6 @@ package org.lsposed.lspd.impl; +import android.annotation.SuppressLint; import android.app.ActivityThread; import android.app.LoadedApk; import android.content.BroadcastReceiver; @@ -7,6 +8,7 @@ import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; import android.content.ContextParams; +import android.content.ContextWrapper; import android.content.Intent; import android.content.IntentFilter; import android.content.IntentSender; @@ -69,6 +71,8 @@ import io.github.libxposed.api.XposedModuleInterface; import io.github.libxposed.api.errors.HookFailedError; import io.github.libxposed.api.utils.DexParser; + +@SuppressLint("NewApi") public class LSPosedContext extends XposedContext { private static final String TAG = "LSPosedContext"; @@ -115,6 +119,7 @@ public class LSPosedContext extends XposedContext { } } + @SuppressLint("DiscouragedPrivateApi") public static boolean loadModule(ActivityThread at, Module module) { try { Log.d(TAG, "Loading module " + module.packageName); @@ -160,7 +165,26 @@ public class LSPosedContext extends XposedContext { } args[i] = null; } - var ctx = new LSPosedContext((Context) ctor.newInstance(args), module.packageName, module.apkPath, module.service); + var ci = (Context) ctor.newInstance(args); + var ctx = new LSPosedContext(ci, module.packageName, module.apkPath, module.service); + var setOuterContext = c.getDeclaredMethod("setOuterContext", Context.class); + setOuterContext.setAccessible(true); + setOuterContext.invoke(ci, new ContextWrapper(ci) { + @Override + public Resources getResources() { + return ctx.getResources(); + } + + @Override + public Resources.Theme getTheme() { + return ctx.getTheme(); + } + + @Override + public void setTheme(int resid) { + ctx.setTheme(resid); + } + }); for (var entry : module.file.moduleClassNames) { var moduleClass = ctx.getClassLoader().loadClass(entry); Log.d(TAG, " Loading class " + moduleClass);