diff --git a/app/build.gradle b/app/build.gradle index ef9de9b..b0eb84b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,17 +1,18 @@ plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' + id 'org.jetbrains.kotlin.plugin.serialization' } android { namespace 'hat.holo.token' - compileSdk 33 + compileSdk 34 defaultConfig { applicationId "hat.holo.token" minSdk 28 - targetSdk 33 + targetSdk 34 versionCode 1 versionName "1.0" vectorDrawables { @@ -42,6 +43,9 @@ android { } kotlinOptions { jvmTarget = '1.8' + freeCompilerArgs += [ + "-Xcontext-receivers" + ] } buildFeatures { compose true @@ -58,17 +62,18 @@ android { dependencies { - implementation "androidx.core:core-ktx:1.9.0" - implementation "androidx.appcompat:appcompat:1.5.1" - implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.5.1" - implementation "androidx.compose.ui:ui:1.3.1" - implementation "androidx.compose.material:material:1.3.1" - implementation "androidx.activity:activity-compose:1.6.1" + implementation "androidx.core:core-ktx:1.13.0" + implementation "androidx.appcompat:appcompat:1.6.1" + implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.7.0" + implementation "androidx.compose.ui:ui:1.6.6" + implementation "androidx.compose.material:material:1.6.6" + implementation "androidx.activity:activity-compose:1.9.0" implementation "androidx.constraintlayout:constraintlayout-compose:1.0.1" - implementation "com.google.accompanist:accompanist-systemuicontroller:0.27.1" - implementation "com.google.code.gson:gson:2.10" - implementation "com.squareup.okhttp3:okhttp:5.0.0-alpha.2" - implementation "com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.2" + implementation "com.google.accompanist:accompanist-systemuicontroller:0.34.0" + implementation "com.squareup.okhttp3:okhttp:5.0.0-alpha.14" + implementation "com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.14" + implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1" compileOnly files("libs/api-82.jar") } diff --git a/app/src/main/java/hat/holo/token/ModuleMain.kt b/app/src/main/java/hat/holo/token/ModuleMain.kt index a724563..2d44c1a 100644 --- a/app/src/main/java/hat/holo/token/ModuleMain.kt +++ b/app/src/main/java/hat/holo/token/ModuleMain.kt @@ -52,27 +52,18 @@ class ModuleMain : IXposedHookLoadPackage, IXposedHookZygoteInit { appendToClassPath(app.applicationContext) } }) - val u = loadClass("com.mihoyo.hyperion.user_profile.UserProfileFragment") - val rng = loadClass("rn.g") // FragmentUserProfileBinding.java - findAndHookMethod(u, "onViewCreated", android.view.View::class.java, android.os.Bundle::class.java, object : XC_MethodHook() { + val fragmentKlass = loadClass("com.mihoyo.hyperion.user_profile.UserProfileFragment") + findAndHookMethod(fragmentKlass, "onViewCreated", android.view.View::class.java, android.os.Bundle::class.java, object : XC_MethodHook() { override fun afterHookedMethod(p: MethodHookParam) { - val getBinding = u.getDeclaredMethod("getBinding") - getBinding.isAccessible = true - val bindingInstance = getBinding.invoke(p.thisObject) - val getLinearLayout = rng.getDeclaredField("b") - getLinearLayout.isAccessible = true - val linearLayout = getLinearLayout.get(bindingInstance) as LinearLayout + val fragmentBinding = p.thisObject.invokeMethod("getBinding") + val linearLayout = fragmentBinding.visitField("b") val ctx = linearLayout.context - val getScanButton = rng.getDeclaredField("w") - getScanButton.isAccessible = true - val scanButton = getScanButton.get(bindingInstance) as ImageView - val tokenBtn = ImageView(ctx) tokenBtn.id = XResources.getFakeResId("getTokenIv") tokenBtn.setImageDrawable(Res.iconToken) val size = Dimension.convertDpToPixel(32f, ctx).roundToInt() tokenBtn.layoutParams = ViewGroup.LayoutParams(size, size) - tokenBtn.setPadding(10, 6, 0, 6) + tokenBtn.setPadding(20, 6, 0, 6) tokenBtn.scaleType = ImageView.ScaleType.FIT_XY tokenBtn.setOnClickListener { if (AccountManager.isLogin) { @@ -91,7 +82,7 @@ class ModuleMain : IXposedHookLoadPackage, IXposedHookZygoteInit { AppUtils.showToast("未登录") } } - + val scanButton = fragmentBinding.visitField("w") linearLayout.addView(tokenBtn, linearLayout.indexOfChild(scanButton) + 1) for (i in 0 until linearLayout.childCount) { val view = linearLayout.getChildAt(i) diff --git a/app/src/main/java/hat/holo/token/utils/ReflectUtils.kt b/app/src/main/java/hat/holo/token/utils/ReflectUtils.kt index d8404a8..fff9b44 100644 --- a/app/src/main/java/hat/holo/token/utils/ReflectUtils.kt +++ b/app/src/main/java/hat/holo/token/utils/ReflectUtils.kt @@ -5,3 +5,17 @@ import java.lang.reflect.AccessibleObject fun T.setAccess() = apply { isAccessible = true } + +@Suppress("UNCHECKED_CAST") +fun Any.invokeMethod(methodName: String, vararg args: Any?) : R { + val method = this.javaClass.getDeclaredMethod(methodName) + method.isAccessible = true + return method.invoke(this, *args) as R +} + +@Suppress("UNCHECKED_CAST") +fun Any.visitField(fieldName: String) : T { + val field = this.javaClass.getDeclaredField(fieldName) + field.isAccessible = true + return field.get(this) as T +} diff --git a/app/src/main/java/hat/holo/token/utils/Res.kt b/app/src/main/java/hat/holo/token/utils/Res.kt index 5f3692f..a53e89f 100644 --- a/app/src/main/java/hat/holo/token/utils/Res.kt +++ b/app/src/main/java/hat/holo/token/utils/Res.kt @@ -7,7 +7,7 @@ import java.util.* object Res { val iconToken: Drawable? get() { - val s = "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" + val s = "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" return Base64.getDecoder().decode(s).inputStream().use { stream -> Drawable.createFromStream(stream, null) } diff --git a/build.gradle b/build.gradle index 7a245ba..906b883 100644 --- a/build.gradle +++ b/build.gradle @@ -1,10 +1,11 @@ buildscript { ext { - compose_ui_version = '1.3.1' + compose_ui_version = '1.5.12' } }// Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id 'com.android.application' version '7.3.0' apply false - id 'com.android.library' version '7.3.0' apply false - id 'org.jetbrains.kotlin.android' version '1.7.10' apply false + id 'com.android.application' version '8.3.2' apply false + id 'com.android.library' version '8.3.2' apply false + id 'org.jetbrains.kotlin.android' version '1.9.23' apply false + id 'org.jetbrains.kotlin.plugin.serialization' version '1.9.23' apply false } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3fcf90b..9ebed9f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Nov 18 22:27:22 CST 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME