diff --git a/.idea/appInsightsSettings.xml b/.idea/appInsightsSettings.xml new file mode 100644 index 0000000..371f2e2 --- /dev/null +++ b/.idea/appInsightsSettings.xml @@ -0,0 +1,26 @@ + + + + + + \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9d078c5..9e27afd 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -12,8 +12,8 @@ android { applicationId = "cocobo1.pupu.xposed" minSdk = 22 targetSdk = 36 - versionCode = 1000 - versionName = "1.0.0" + versionCode = 1010 + versionName = "1.0.1" } buildTypes { @@ -29,10 +29,10 @@ android { } compileOptions { sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_21 } kotlinOptions { - jvmTarget = "17" + jvmTarget = "21" } buildFeatures { buildConfig = true diff --git a/app/src/main/kotlin/io/github/pupu/xposed/FontsModule.kt b/app/src/main/kotlin/io/github/pupu/xposed/FontsModule.kt index fef587b..0c96a9d 100644 --- a/app/src/main/kotlin/io/github/pupu/xposed/FontsModule.kt +++ b/app/src/main/kotlin/io/github/pupu/xposed/FontsModule.kt @@ -50,11 +50,15 @@ class FontsModule: PupuModule() { } } - override fun onInit(packageParam: XC_LoadPackage.LoadPackageParam) = with (packageParam) { - XposedHelpers.findAndHookMethod("com.facebook.react.views.text.ReactFontManager", classLoader, "createAssetTypeface", + private fun hookClass(classLoader: ClassLoader, className: String) { + XposedHelpers.findAndHookMethod( + className, + classLoader, + "createAssetTypeface", String::class.java, Int::class.java, - "android.content.res.AssetManager", object : XC_MethodReplacement() { + "android.content.res.AssetManager", + object : XC_MethodReplacement() { override fun replaceHookedMethod(param: MethodHookParam): Typeface? { val fontFamilyName: String = param.args[0].toString() val style: Int = param.args[1] as Int @@ -62,8 +66,34 @@ class FontsModule: PupuModule() { return createAssetTypeface(fontFamilyName, style, assetManager) } }) + } - val fontDefFile = File(appInfo.dataDir, "files/pupu/fonts.json") +// override fun onInit(packageParam: XC_LoadPackage.LoadPackageParam) = with (packageParam) { +// XposedHelpers.findAndHookMethod("com.facebook.react.views.text.ReactFontManager", classLoader, "createAssetTypeface", +// String::class.java, +// Int::class.java, +// "android.content.res.AssetManager", object : XC_MethodReplacement() { +// override fun replaceHookedMethod(param: MethodHookParam): Typeface? { +// val fontFamilyName: String = param.args[0].toString() +// val style: Int = param.args[1] as Int +// val assetManager: AssetManager = param.args[2] as AssetManager +// return createAssetTypeface(fontFamilyName, style, assetManager) +// } +// }) + + override fun onInit(packageParam: XC_LoadPackage.LoadPackageParam) = with (packageParam) { + try { + // Try to hook on versions (280201+) + hookClass(classLoader, "com.facebook.react.views.text.ReactFontManager\$Companion") + } catch (e: Throwable) { + when (e) { + // Hook old class (280200-) + is NoClassDefFoundError, is XposedHelpers.ClassNotFoundError -> hookClass(classLoader, "com.facebook.react.views.text.ReactFontManager") + else -> throw e + } + } + + val fontDefFile = File(appInfo.dataDir, "files/pyon/fonts.json") if (!fontDefFile.exists()) return@with val fontDef = try { @@ -71,7 +101,7 @@ class FontsModule: PupuModule() { json.decodeFromString(fontDefFile.readText()) } catch (_: Throwable) { return@with } - fontsDownloadsDir = File(appInfo.dataDir, "files/pupu/downloads/fonts").apply { mkdirs() } + fontsDownloadsDir = File(appInfo.dataDir, "files/pyon/downloads/fonts").apply { mkdirs() } fontsDir = File(fontsDownloadsDir, fontDef.name!!).apply { mkdirs() } fontsAbsPath = fontsDir.absolutePath + "/"