diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 3fc4af8..0000000 --- a/.editorconfig +++ /dev/null @@ -1,12 +0,0 @@ -[*] -charset = utf-8 -end_of_line = lf -indent_size = 4 -indent_style = space -insert_final_newline = true -max_line_length = 150 -tab_width = 4 -trim_trailing_whitespace = false - -[{*.yml,*.yaml}] -indent_size = 2 diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index faa300a..0000000 --- a/.gitattributes +++ /dev/null @@ -1,3 +0,0 @@ -*.bat text eol=crlf -*.cmd text eol=crlf -*.sh text eol=lf diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 5ace460..0000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,6 +0,0 @@ -version: 2 -updates: - - package-ecosystem: "github-actions" - directory: "/" - schedule: - interval: "weekly" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index d614860..0000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,80 +0,0 @@ -name: Build & Upload APKs - -on: - push: - -permissions: - contents: read - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Setup Java - uses: actions/setup-java@v5 - with: - distribution: temurin - java-version: 21 - - - name: Checkout - uses: actions/checkout@v7 - with: - fetch-depth: 0 - - - name: Cache Gradle - uses: actions/cache@v6 - with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - key: gradle-cache-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties', 'gradle/libs.versions.toml') }} - restore-keys: gradle-cache- - - - name: Prepare files - run: | - chmod +x gradlew - - - name: Compile - run: ./gradlew assembleDebug - - - name: Upload Result (all APKs) - uses: actions/upload-artifact@v7 - with: - name: all-apks.zip - path: '*/build/outputs/apk/debug/*-debug.apk' - if-no-files-found: error - - - name: Find APKs and set matrix - id: find_apks - run: | - set -euo pipefail - apks=$(find . -type f -path "*/build/outputs/apk/debug/*-debug.apk" -printf '{"path":"%p","name":"%f"},' | sed 's/,$//' | awk '{print "[" $0 "]"}') - if [ -z "$apks" ] || [ "$apks" = "[]" ]; then - echo "No APKs found!" - exit 1 - fi - echo "artifact_paths=$apks" >> $GITHUB_OUTPUT - cat $GITHUB_OUTPUT - - outputs: - artifact-paths: ${{ steps.find_apks.outputs.artifact_paths }} - - upload_individual_apks: - needs: build - runs-on: ubuntu-latest - strategy: - matrix: - apk: ${{ fromJson(needs.build.outputs.artifact-paths) }} - steps: - - name: Download all-apks artifact - uses: actions/download-artifact@v8 - with: - name: all-apks.zip - - - name: Upload single APK - uses: actions/upload-artifact@v7 - with: - name: ${{ matrix.apk.name }} - path: ${{ matrix.apk.path }} - archive: false - if-no-files-found: error diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 5390d65..0000000 --- a/.gitignore +++ /dev/null @@ -1,47 +0,0 @@ -# Gradle files -.gradle -**/build/ -!src/**/build/ - -# Ignore Gradle GUI config -gradle-app.setting - -# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) -!gradle-wrapper.jar - -# Avoid ignore Gradle wrappper properties -!gradle-wrapper.properties - -# Local configuration file (sdk path, etc) -local.properties -keystore.properties -github.properties - -# Log/OS Files -*.log - -# Android Studio generated files and folders -captures/ -.externalNativeBuild/ -.cxx/ -*.apk -output.json -.kotlin/ - -# IntelliJ -*.iml -.idea/ -misc.xml -deploymentTargetDropDown.xml -render.experimental.xml -!/.idea/codeStyles/* - -# Keystore files -*.jks -*.keystore - -# Google Services (e.g. APIs or Firebase) -google-services.json - -# Android Profiling -*.hprof diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml deleted file mode 100644 index 4d0cdf6..0000000 --- a/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,259 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index 0f7bc51..0000000 --- a/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - diff --git a/template/metadata/package/en-US/full_description.txt b/.nojekyll similarity index 100% rename from template/metadata/package/en-US/full_description.txt rename to .nojekyll diff --git a/AlwaysAllowChargingFeedback/Readme.md b/AlwaysAllowChargingFeedback/Readme.md deleted file mode 100644 index 2f668a2..0000000 --- a/AlwaysAllowChargingFeedback/Readme.md +++ /dev/null @@ -1,4 +0,0 @@ -# AlwaysAllowChargingFeedback - -Always allow charging feedback, -even when the device is in Do-not-Disturb mode. diff --git a/AlwaysAllowChargingFeedback/build.gradle.kts b/AlwaysAllowChargingFeedback/build.gradle.kts deleted file mode 100644 index 8b19b6e..0000000 --- a/AlwaysAllowChargingFeedback/build.gradle.kts +++ /dev/null @@ -1,15 +0,0 @@ -plugins { - alias(libs.plugins.buildlogic.android.application) - alias(libs.plugins.buildlogic.kotlin.android) -} - -android { - namespace = "de.binarynoise.AlwaysAllowChargingFeedback" - - defaultConfig { - minSdk = 28 - targetSdk = 36 - } -} - -dependencies {} diff --git a/AlwaysAllowChargingFeedback/src/main/AndroidManifest.xml b/AlwaysAllowChargingFeedback/src/main/AndroidManifest.xml deleted file mode 100644 index 1a5a909..0000000 --- a/AlwaysAllowChargingFeedback/src/main/AndroidManifest.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - diff --git a/AlwaysAllowChargingFeedback/src/main/assets/xposed_init b/AlwaysAllowChargingFeedback/src/main/assets/xposed_init deleted file mode 100644 index ffb29ca..0000000 --- a/AlwaysAllowChargingFeedback/src/main/assets/xposed_init +++ /dev/null @@ -1 +0,0 @@ -de.binarynoise.AlwaysAllowChargingFeedback.Hook diff --git a/AlwaysAllowChargingFeedback/src/main/java/de/binarynoise/AlwaysAllowChargingFeedback/Hook.kt b/AlwaysAllowChargingFeedback/src/main/java/de/binarynoise/AlwaysAllowChargingFeedback/Hook.kt deleted file mode 100644 index ebfc45b..0000000 --- a/AlwaysAllowChargingFeedback/src/main/java/de/binarynoise/AlwaysAllowChargingFeedback/Hook.kt +++ /dev/null @@ -1,27 +0,0 @@ -package de.binarynoise.AlwaysAllowChargingFeedback - -import android.content.Context -import android.provider.Settings -import de.robv.android.xposed.IXposedHookLoadPackage -import de.robv.android.xposed.XC_MethodReplacement -import de.robv.android.xposed.XposedHelpers -import de.robv.android.xposed.callbacks.XC_LoadPackage - -class Hook : IXposedHookLoadPackage { - - override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) { - if (lpparam.packageName != "android") return - - val NotifierClass = XposedHelpers.findClass("com.android.server.power.Notifier", lpparam.classLoader) - XposedHelpers.findAndHookMethod(NotifierClass, "isChargingFeedbackEnabled", Int::class.java, object : XC_MethodReplacement() { - override fun replaceHookedMethod(param: MethodHookParam): Boolean { - val userId = param.args[0] as Int - val context = XposedHelpers.getObjectField(param.thisObject, "mContext") as Context - // charging_sounds_enabled comes from Settings.Secure.CHARGING_SOUNDS_ENABLED which is @hide - return XposedHelpers.callStaticMethod( - Settings.Secure::class.java, "getIntForUser", context.contentResolver, "charging_sounds_enabled", 1, userId - ) != 0 - } - }) - } -} diff --git a/AlwaysAllowChargingFeedback/src/main/res/values/arrays.xml b/AlwaysAllowChargingFeedback/src/main/res/values/arrays.xml deleted file mode 100644 index db6e46a..0000000 --- a/AlwaysAllowChargingFeedback/src/main/res/values/arrays.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - android - - diff --git a/AnimationScaleMod/Readme.md b/AnimationScaleMod/Readme.md deleted file mode 100644 index 63b3515..0000000 --- a/AnimationScaleMod/Readme.md +++ /dev/null @@ -1,7 +0,0 @@ -# AnimationScaleMod - -This XPosed module adds more animation scale multipliers -to the animation scale configuration in the development options. - -Before/Later Comparison: \ - diff --git a/AnimationScaleMod/build.gradle.kts b/AnimationScaleMod/build.gradle.kts deleted file mode 100644 index 94219c3..0000000 --- a/AnimationScaleMod/build.gradle.kts +++ /dev/null @@ -1,12 +0,0 @@ -plugins { - alias(libs.plugins.buildlogic.android.application) -} - -android { - namespace = "com.programminghoch10.AnimationScaleMod" - - defaultConfig { - minSdk = 24 - targetSdk = 35 - } -} diff --git a/AnimationScaleMod/src/main/AndroidManifest.xml b/AnimationScaleMod/src/main/AndroidManifest.xml deleted file mode 100644 index 748ade1..0000000 --- a/AnimationScaleMod/src/main/AndroidManifest.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - diff --git a/AnimationScaleMod/src/main/assets/xposed_init b/AnimationScaleMod/src/main/assets/xposed_init deleted file mode 100644 index c5b7a7c..0000000 --- a/AnimationScaleMod/src/main/assets/xposed_init +++ /dev/null @@ -1 +0,0 @@ -com.programminghoch10.AnimationScaleMod.ScaleHook diff --git a/AnimationScaleMod/src/main/java/com/programminghoch10/AnimationScaleMod/ScaleHook.java b/AnimationScaleMod/src/main/java/com/programminghoch10/AnimationScaleMod/ScaleHook.java deleted file mode 100644 index 26b5248..0000000 --- a/AnimationScaleMod/src/main/java/com/programminghoch10/AnimationScaleMod/ScaleHook.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.programminghoch10.AnimationScaleMod; - -import android.content.res.XModuleResources; -import android.content.res.XResources; - -import java.util.Arrays; - -import de.robv.android.xposed.IXposedHookInitPackageResources; -import de.robv.android.xposed.IXposedHookZygoteInit; -import de.robv.android.xposed.callbacks.XC_InitPackageResources; - -public class ScaleHook implements IXposedHookInitPackageResources, IXposedHookZygoteInit { - private static final String PACKAGE_SETTINGS = "com.android.settings"; - private final static String[] arrayResourceNames = { "window_animation", "transition_animation", "animator_duration", }; - private static String modulePath = null; - - @Override - public void handleInitPackageResources(XC_InitPackageResources.InitPackageResourcesParam resparam) { - if (!resparam.packageName.equals(PACKAGE_SETTINGS)) return; - XResources resources = resparam.res; - XModuleResources moduleResources = XModuleResources.createInstance(modulePath, resources); - for (String arrayResourceName : arrayResourceNames) { - arrayResourceName += "_scale"; - resources.setReplacement(PACKAGE_SETTINGS, "array", arrayResourceName + "_values", moduleResources.fwd(R.array.animation_scale_values)); - String animationOff = resources.getStringArray(resources.getIdentifier(arrayResourceName + "_entries", "array", PACKAGE_SETTINGS))[0]; - String[] entries = resources.getStringArray(resources.getIdentifier(arrayResourceName + "_values", "array", PACKAGE_SETTINGS)); - entries = Arrays.stream(entries).map(entry -> Float.parseFloat(entry) + "x").toArray(String[]::new); - entries[0] = animationOff; - resources.setReplacement(PACKAGE_SETTINGS, "array", arrayResourceName + "_entries", entries); - } - } - - @Override - public void initZygote(StartupParam startupParam) { - modulePath = startupParam.modulePath; - } -} diff --git a/AnimationScaleMod/src/main/res/values/arrays.xml b/AnimationScaleMod/src/main/res/values/arrays.xml deleted file mode 100644 index 713855e..0000000 --- a/AnimationScaleMod/src/main/res/values/arrays.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - com.android.settings - - - - 0 - .25 - .5 - .75 - 1 - 1.5 - 2 - 2.5 - 3 - 4 - 5 - 7.5 - 10 - - diff --git a/AntiBrightnessChange/README.md b/AntiBrightnessChange/README.md deleted file mode 100644 index 8e5231e..0000000 --- a/AntiBrightnessChange/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# AntiBrightnessChange - -This Xposed module prevents selected apps from overwriting the screen brightness. - -If applied to System Framework (`android`), -it will prevent every app from changing the screen brightness. diff --git a/AntiBrightnessChange/build.gradle.kts b/AntiBrightnessChange/build.gradle.kts deleted file mode 100644 index 8c85853..0000000 --- a/AntiBrightnessChange/build.gradle.kts +++ /dev/null @@ -1,12 +0,0 @@ -plugins { - alias(libs.plugins.buildlogic.android.application) -} - -android { - namespace = "com.programminghoch10.AntiBrightnessChange" - - defaultConfig { - minSdk = 17 - targetSdk = 36 - } -} diff --git a/AntiBrightnessChange/src/main/AndroidManifest.xml b/AntiBrightnessChange/src/main/AndroidManifest.xml deleted file mode 100644 index 288ffee..0000000 --- a/AntiBrightnessChange/src/main/AndroidManifest.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - diff --git a/AntiBrightnessChange/src/main/assets/xposed_init b/AntiBrightnessChange/src/main/assets/xposed_init deleted file mode 100644 index bb3b42b..0000000 --- a/AntiBrightnessChange/src/main/assets/xposed_init +++ /dev/null @@ -1 +0,0 @@ -com.programminghoch10.AntiBrightnessChange.Hook diff --git a/AntiBrightnessChange/src/main/java/com/programminghoch10/AntiBrightnessChange/Hook.java b/AntiBrightnessChange/src/main/java/com/programminghoch10/AntiBrightnessChange/Hook.java deleted file mode 100644 index 0ebf37b..0000000 --- a/AntiBrightnessChange/src/main/java/com/programminghoch10/AntiBrightnessChange/Hook.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.programminghoch10.AntiBrightnessChange; - -import static android.view.WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE; - -import android.os.Build; -import android.view.WindowManager; - -import de.robv.android.xposed.IXposedHookLoadPackage; -import de.robv.android.xposed.XC_MethodHook; -import de.robv.android.xposed.XposedHelpers; -import de.robv.android.xposed.callbacks.XC_LoadPackage; - -public class Hook implements IXposedHookLoadPackage { - @Override - public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) { - if (lpparam.packageName.equals("android") && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - XposedHelpers.findAndHookMethod( - "com.android.server.wm.RootWindowContainer", - lpparam.classLoader, - "handleNotObscuredLocked", - "com.android.server.wm.WindowState", - boolean.class, - boolean.class, - new XC_MethodHook() { - @Override - protected void afterHookedMethod(MethodHookParam param) { - XposedHelpers.setFloatField(param.thisObject, "mScreenBrightnessOverride", Float.NaN); - } - } - ); - return; - } - - XposedHelpers.findAndHookMethod( - WindowManager.LayoutParams.class, "copyFrom", WindowManager.LayoutParams.class, new XC_MethodHook() { - @Override - protected void beforeHookedMethod(MethodHookParam param) { - WindowManager.LayoutParams layoutParams = (WindowManager.LayoutParams) param.args[0]; - layoutParams.screenBrightness = BRIGHTNESS_OVERRIDE_NONE; - layoutParams.buttonBrightness = BRIGHTNESS_OVERRIDE_NONE; - } - } - ); - } -} diff --git a/AntiWakeLock/Readme.md b/AntiWakeLock/Readme.md deleted file mode 100644 index a806757..0000000 --- a/AntiWakeLock/Readme.md +++ /dev/null @@ -1,5 +0,0 @@ -# AntiWakeLock - -Disable WAKE_LOCK and FLAG_KEEP_SCREEN_ON. - -Can be applied to selected apps or the whole system. diff --git a/AntiWakeLock/build.gradle.kts b/AntiWakeLock/build.gradle.kts deleted file mode 100644 index 1452cf6..0000000 --- a/AntiWakeLock/build.gradle.kts +++ /dev/null @@ -1,17 +0,0 @@ -plugins { - alias(libs.plugins.buildlogic.android.application) - alias(libs.plugins.buildlogic.kotlin.android) -} - -android { - namespace = "com.programminghoch10.AntiWakeLock" - - defaultConfig { - minSdk = 14 - targetSdk = 36 - } -} - -dependencies { - implementation(projects.logger) -} diff --git a/AntiWakeLock/src/main/AndroidManifest.xml b/AntiWakeLock/src/main/AndroidManifest.xml deleted file mode 100644 index 441c151..0000000 --- a/AntiWakeLock/src/main/AndroidManifest.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - diff --git a/AntiWakeLock/src/main/assets/xposed_init b/AntiWakeLock/src/main/assets/xposed_init deleted file mode 100644 index db2ca61..0000000 --- a/AntiWakeLock/src/main/assets/xposed_init +++ /dev/null @@ -1,3 +0,0 @@ -com.programminghoch10.AntiWakeLock.PowerManagerHook -com.programminghoch10.AntiWakeLock.PowerManagerServiceHook -com.programminghoch10.AntiWakeLock.WindowHook diff --git a/AntiWakeLock/src/main/java/com/programminghoch10/AntiWakeLock/PowerManagerHook.kt b/AntiWakeLock/src/main/java/com/programminghoch10/AntiWakeLock/PowerManagerHook.kt deleted file mode 100644 index d832091..0000000 --- a/AntiWakeLock/src/main/java/com/programminghoch10/AntiWakeLock/PowerManagerHook.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.programminghoch10.AntiWakeLock - -import java.util.concurrent.* -import android.os.Build -import android.os.PowerManager -import android.os.WorkSource -import de.robv.android.xposed.IXposedHookLoadPackage -import de.robv.android.xposed.XC_MethodReplacement.DO_NOTHING -import de.robv.android.xposed.XC_MethodReplacement.returnConstant -import de.robv.android.xposed.XposedHelpers -import de.robv.android.xposed.callbacks.XC_LoadPackage - -class PowerManagerHook : IXposedHookLoadPackage { - override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) { - XposedHelpers.findAndHookMethod(PowerManager.WakeLock::class.java, "acquire", DO_NOTHING) - XposedHelpers.findAndHookMethod(PowerManager.WakeLock::class.java, "acquire", Long::class.java, DO_NOTHING) - - // optional hooks for completeness - XposedHelpers.findAndHookMethod(PowerManager.WakeLock::class.java, "isHeld", returnConstant(false)) - XposedHelpers.findAndHookMethod(PowerManager.WakeLock::class.java, "release", DO_NOTHING) - XposedHelpers.findAndHookMethod(PowerManager.WakeLock::class.java, "release", Int::class.java, DO_NOTHING) - XposedHelpers.findAndHookMethod(PowerManager.WakeLock::class.java, "setReferenceCounted", Boolean::class.java, DO_NOTHING) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) XposedHelpers.findAndHookMethod( - PowerManager.WakeLock::class.java, - "setStateListener", - Executor::class.java, - PowerManager.WakeLockStateListener::class.java, - DO_NOTHING, - ) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) XposedHelpers.findAndHookMethod( - PowerManager.WakeLock::class.java, - "setWorkSource", - WorkSource::class.java, - DO_NOTHING, - ) - } -} diff --git a/AntiWakeLock/src/main/java/com/programminghoch10/AntiWakeLock/PowerManagerServiceHook.kt b/AntiWakeLock/src/main/java/com/programminghoch10/AntiWakeLock/PowerManagerServiceHook.kt deleted file mode 100644 index 49976b3..0000000 --- a/AntiWakeLock/src/main/java/com/programminghoch10/AntiWakeLock/PowerManagerServiceHook.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.programminghoch10.AntiWakeLock - -import android.os.Build -import de.robv.android.xposed.IXposedHookLoadPackage -import de.robv.android.xposed.XC_MethodReplacement -import de.robv.android.xposed.XposedBridge -import de.robv.android.xposed.XposedHelpers -import de.robv.android.xposed.callbacks.XC_LoadPackage - -class PowerManagerServiceHook : IXposedHookLoadPackage { - fun disableMethodByName(clazz: Class<*>, name: String) { - val method = clazz.declaredMethods.single { it.name == name } - XposedBridge.hookMethod(method, XC_MethodReplacement.DO_NOTHING) - } - - override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) { - if (lpparam.packageName != "android") return - - val PowerManagerServiceClass = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) XposedHelpers.findClass("com.android.server.power.PowerManagerService", lpparam.classLoader) - else XposedHelpers.findClass("com.android.server.PowerManagerService", lpparam.classLoader) - - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) { - disableMethodByName(PowerManagerServiceClass, "acquireWakeLock") - disableMethodByName(PowerManagerServiceClass, "releaseWakeLock") - } - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - disableMethodByName(PowerManagerServiceClass, "acquireWakeLockInternal") - disableMethodByName(PowerManagerServiceClass, "releaseWakeLockInternal") - } - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - val BinderServiceClass = XposedHelpers.findClass("${PowerManagerServiceClass.name}\$BinderService", lpparam.classLoader) - disableMethodByName(BinderServiceClass, "acquireWakeLock") - disableMethodByName(BinderServiceClass, "releaseWakeLock") - } - } -} diff --git a/AntiWakeLock/src/main/java/com/programminghoch10/AntiWakeLock/WindowHook.kt b/AntiWakeLock/src/main/java/com/programminghoch10/AntiWakeLock/WindowHook.kt deleted file mode 100644 index cd42e5f..0000000 --- a/AntiWakeLock/src/main/java/com/programminghoch10/AntiWakeLock/WindowHook.kt +++ /dev/null @@ -1,79 +0,0 @@ -package com.programminghoch10.AntiWakeLock - -import android.os.Build -import android.view.SurfaceView -import android.view.View -import android.view.Window -import android.view.WindowManager -import de.binarynoise.logger.Logger.log -import de.robv.android.xposed.IXposedHookLoadPackage -import de.robv.android.xposed.XC_MethodHook -import de.robv.android.xposed.XC_MethodReplacement.DO_NOTHING -import de.robv.android.xposed.XposedHelpers -import de.robv.android.xposed.callbacks.XC_LoadPackage - -class WindowHook : IXposedHookLoadPackage { - fun filterKeepScreenOnFlag(flags: Int): Int { - return flags and WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON.inv() - } - - override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) { - XposedHelpers.findAndHookMethod( - Window::class.java, - "addFlags", - Int::class.java, - object : XC_MethodHook() { - override fun beforeHookedMethod(param: MethodHookParam) { - log("removing FLAG_KEEP_SCREEN_ON from addFlags") - param.args[0] = filterKeepScreenOnFlag(param.args[0] as Int) - } - }, - ) - XposedHelpers.findAndHookMethod( - Window::class.java, - "setFlags", Int::class.java, Int::class.java, - object : XC_MethodHook() { - override fun beforeHookedMethod(param: MethodHookParam) { - log("removing FLAG_KEEP_SCREEN_ON from setFlags") - param.args[0] = filterKeepScreenOnFlag(param.args[0] as Int) - param.args[1] = filterKeepScreenOnFlag(param.args[1] as Int) - } - }, - ) - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { - try { - val AttachInfoClass = Class.forName(View::class.java.name + "\$AttachInfo", false, lpparam.classLoader) - XposedHelpers.findAndHookMethod( - SurfaceView::class.java, - "performCollectViewAttributes", - AttachInfoClass, - Int::class.java, - object : XC_MethodHook() { - override fun afterHookedMethod(param: MethodHookParam) { - val attachInfo = param.args[0] - XposedHelpers.setBooleanField(attachInfo, "mKeepScreenOn", false) - } - }, - ) - } catch (e: Throwable) { - log("failed to hook SurfaceView.performCollectViewAttributes", e) - } - } - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - try { - val ViewRootImplClass = Class.forName("android.view.ViewRootImpl", false, lpparam.classLoader) - XposedHelpers.findAndHookMethod( - ViewRootImplClass, - "applyKeepScreenOnFlag", - WindowManager.LayoutParams::class.java, - DO_NOTHING, - ) - log("hooked applyKeepScreenOnFlag to do nothing") - } catch (e: Throwable) { - log("failed to hook ViewRootImpl.applyKeepScreenOnFlag", e) - } - } - } -} diff --git a/AutomaticAdvancedSettingsExpander/.gitignore b/AutomaticAdvancedSettingsExpander/.gitignore deleted file mode 100644 index 42afabf..0000000 --- a/AutomaticAdvancedSettingsExpander/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/AutomaticAdvancedSettingsExpander/README.md b/AutomaticAdvancedSettingsExpander/README.md deleted file mode 100644 index 0e164a7..0000000 --- a/AutomaticAdvancedSettingsExpander/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# Automatic Advanced Settings Expander - -This Xposed module automatically expands the advanced settings in the Settings app by hooking PreferenceGroup and ExpandablePreference. -I hate to always expand them myself every time. - -Should work on all Android versions where the Settings app uses one of - -- androidx.preference.PreferenceGroup -- android.preference.PreferenceGroup -- android.support.v7.preference.PreferenceGroup -- com.android.settingslib.widget.ExpandablePreference - -Please report where it stops working so that I can edit the minSdkVersion or add missing classes. - -This is an Xposed module [part of the LSPosed Module Repo](https://github.com/Xposed-Modules-Repo/de.binarynoise.automaticadvancedsettingsexpander) or -in the LSPosed App. - -| `before` | `after ` | -|--------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------| -| ![before](../metadata/de.binarynoise.AutomaticAdvancedSettingsExpander/en-US/images/phoneScreenshots/1-before.png) | ![after](../metadata/de.binarynoise.AutomaticAdvancedSettingsExpander/en-US/images/phoneScreenshots/2-after.png) | diff --git a/AutomaticAdvancedSettingsExpander/build.gradle.kts b/AutomaticAdvancedSettingsExpander/build.gradle.kts deleted file mode 100644 index 39d4825..0000000 --- a/AutomaticAdvancedSettingsExpander/build.gradle.kts +++ /dev/null @@ -1,31 +0,0 @@ -plugins { - alias(libs.plugins.buildlogic.android.application) - alias(libs.plugins.buildlogic.kotlin.android) -} - -android { - namespace = "de.binarynoise.AutomaticAdvancedSettingsExpander" - - defaultConfig { - minSdk = 16 - targetSdk = 36 - - buildConfigField("String", "SHARED_PREFERENCES_NAME", "\"automatic_advanced_settings_expander\"") - } - - buildFeatures { - buildConfig = true - } - - signingConfigs { - maybeCreate("release").apply { - keyAlias = "automaticadvancedsettingsexpander" - } - } -} - -dependencies { - implementation(projects.logger) -// implementation(libs.androidx.fragment.ktx) - implementation(libs.androidx.preference.ktx) -} diff --git a/AutomaticAdvancedSettingsExpander/src/main/AndroidManifest.xml b/AutomaticAdvancedSettingsExpander/src/main/AndroidManifest.xml deleted file mode 100644 index 199f9e2..0000000 --- a/AutomaticAdvancedSettingsExpander/src/main/AndroidManifest.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/AutomaticAdvancedSettingsExpander/src/main/assets/xposed_init b/AutomaticAdvancedSettingsExpander/src/main/assets/xposed_init deleted file mode 100644 index 3fa17e3..0000000 --- a/AutomaticAdvancedSettingsExpander/src/main/assets/xposed_init +++ /dev/null @@ -1,2 +0,0 @@ -de.binarynoise.AutomaticAdvancedSettingsExpander.ExpandablePreferenceHook -de.binarynoise.AutomaticAdvancedSettingsExpander.PreferenceGroupChildrenHook diff --git a/AutomaticAdvancedSettingsExpander/src/main/java/de/binarynoise/AutomaticAdvancedSettingsExpander/ExpandablePreferenceHook.kt b/AutomaticAdvancedSettingsExpander/src/main/java/de/binarynoise/AutomaticAdvancedSettingsExpander/ExpandablePreferenceHook.kt deleted file mode 100644 index de6a545..0000000 --- a/AutomaticAdvancedSettingsExpander/src/main/java/de/binarynoise/AutomaticAdvancedSettingsExpander/ExpandablePreferenceHook.kt +++ /dev/null @@ -1,25 +0,0 @@ -package de.binarynoise.AutomaticAdvancedSettingsExpander - -import android.content.Context -import android.os.Build -import android.util.AttributeSet -import de.robv.android.xposed.IXposedHookLoadPackage -import de.robv.android.xposed.XC_MethodHook -import de.robv.android.xposed.XposedHelpers -import de.robv.android.xposed.callbacks.XC_LoadPackage - -class ExpandablePreferenceHook : IXposedHookLoadPackage { - override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.BAKLAVA) return - - val ExpandablePreferenceClass = XposedHelpers.findClass("com.android.settingslib.widget.ExpandablePreference", lpparam.classLoader) - XposedHelpers.findAndHookConstructor( - ExpandablePreferenceClass, Context::class.java, AttributeSet::class.java, Int::class.java, Int::class.java, - object : XC_MethodHook() { - override fun afterHookedMethod(param: MethodHookParam) { - XposedHelpers.setBooleanField(param.thisObject, "isExpanded", true) - } - }, - ) - } -} diff --git a/AutomaticAdvancedSettingsExpander/src/main/java/de/binarynoise/AutomaticAdvancedSettingsExpander/PreferenceGroupChildrenHook.kt b/AutomaticAdvancedSettingsExpander/src/main/java/de/binarynoise/AutomaticAdvancedSettingsExpander/PreferenceGroupChildrenHook.kt deleted file mode 100644 index 6190767..0000000 --- a/AutomaticAdvancedSettingsExpander/src/main/java/de/binarynoise/AutomaticAdvancedSettingsExpander/PreferenceGroupChildrenHook.kt +++ /dev/null @@ -1,42 +0,0 @@ -package de.binarynoise.AutomaticAdvancedSettingsExpander - -import de.binarynoise.logger.Logger.log -import de.robv.android.xposed.IXposedHookLoadPackage -import de.robv.android.xposed.XposedHelpers -import de.robv.android.xposed.callbacks.XC_LoadPackage -import de.robv.android.xposed.XC_MethodHook as MethodHook - - -class PreferenceGroupChildrenHook : IXposedHookLoadPackage { - override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) { - val packages = arrayOf( - "androidx.preference", - "android.preference", - "android.support.v7.preference", - ) - - val classes = arrayOf("PreferenceGroup") - - val hook = object : MethodHook() { - override fun beforeHookedMethod(param: MethodHookParam) { - log("expandedCount would have been set to ${param.args[0]}, but setting to Int.MAX_VALUE instead") - param.args[0] = Int.MAX_VALUE - } - } - - packages.forEach { pkg -> - classes.forEach { cls -> - try { - XposedHelpers.findAndHookMethod("$pkg.$cls", lpparam.classLoader, "setInitialExpandedChildrenCount", Int::class.java, hook) - log("Hooked $pkg.$cls") - } catch (_: NoSuchMethodError) { - } catch (_: NoSuchMethodException) { - } catch (_: XposedHelpers.ClassNotFoundError) { - } catch (_: ClassNotFoundException) { - } catch (e: Exception) { - log("failed to hook", e) - } - } - } - } -} diff --git a/AutomaticAdvancedSettingsExpander/src/main/java/de/binarynoise/AutomaticAdvancedSettingsExpander/SettingsActivity.kt b/AutomaticAdvancedSettingsExpander/src/main/java/de/binarynoise/AutomaticAdvancedSettingsExpander/SettingsActivity.kt deleted file mode 100644 index 6ccc296..0000000 --- a/AutomaticAdvancedSettingsExpander/src/main/java/de/binarynoise/AutomaticAdvancedSettingsExpander/SettingsActivity.kt +++ /dev/null @@ -1,88 +0,0 @@ -package de.binarynoise.AutomaticAdvancedSettingsExpander - -import kotlin.contracts.ExperimentalContracts -import kotlin.contracts.InvocationKind -import kotlin.contracts.contract -import android.os.Build -import android.os.Bundle -import androidx.fragment.app.FragmentActivity -import androidx.preference.Preference -import androidx.preference.PreferenceFragmentCompat -import androidx.preference.PreferenceGroup -import androidx.preference.SwitchPreference -import androidx.preference.children -import de.binarynoise.AutomaticAdvancedSettingsExpander.BuildConfig.SHARED_PREFERENCES_NAME - -class SettingsActivity : FragmentActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.settings_activity) - if (savedInstanceState == null) { - supportFragmentManager.beginTransaction().replace(R.id.settings, SettingsFragment()).commit() - } - actionBar?.setDisplayHomeAsUpEnabled(true) - } - - override fun onNavigateUp(): Boolean { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - finishAndRemoveTask() - } - return true - } - - class SettingsFragment : PreferenceFragmentCompat() { - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - preferenceManager.sharedPreferencesName = SHARED_PREFERENCES_NAME - preferenceManager.sharedPreferencesMode = MODE_WORLD_READABLE - - val ctx = preferenceManager.context - preferenceScreen = preferenceManager.createPreferenceScreen(ctx) - preferenceScreen.apply { - addPreference(SwitchPreference(ctx)) { - key = "PreferenceGroupChildrenHook" - title = "Automatically show all children in PreferenceGroups" - setDefaultValue(true) - summary = "Found quite often in the Settings on older Androids" - } - - addPreference(SwitchPreference(ctx)) { - key = "ExpandablePreferenceHook" - title = "Automatically expand ExpandablePreferences" - val canUse = Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA - setDefaultValue(canUse) - isEnabled = canUse - summary = "Found in newer Androids (16+) in the Notification Settings" - } - - setIconSpaceReservedRecursive(false) - } - } - - - @OptIn(ExperimentalContracts::class) - inline fun PreferenceGroup.addPreference(preference: T, setup: T.() -> Unit) { - contract { - callsInPlace(setup, InvocationKind.EXACTLY_ONCE) - } - - val isPreferenceGroup = preference is PreferenceGroup - - if (isPreferenceGroup) { - // PreferenceGroup needs to be added to the tree before other preferences can be added to it - addPreference(preference) - } - - preference.apply(setup) - - if (!isPreferenceGroup) { - // normal preferences need the setup applied before being added to the tree - addPreference(preference) - } - } - - private fun Preference.setIconSpaceReservedRecursive(iconSpaceReserved: Boolean = false) { - this.isIconSpaceReserved = iconSpaceReserved - if (this is PreferenceGroup) this.children.forEach { it.setIconSpaceReservedRecursive(iconSpaceReserved) } - } - } -} diff --git a/AutomaticAdvancedSettingsExpander/src/main/res/layout/settings_activity.xml b/AutomaticAdvancedSettingsExpander/src/main/res/layout/settings_activity.xml deleted file mode 100644 index 620409c..0000000 --- a/AutomaticAdvancedSettingsExpander/src/main/res/layout/settings_activity.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - diff --git a/AutomaticAdvancedSettingsExpander/src/main/res/values-v21/styles.xml b/AutomaticAdvancedSettingsExpander/src/main/res/values-v21/styles.xml deleted file mode 100644 index a71c438..0000000 --- a/AutomaticAdvancedSettingsExpander/src/main/res/values-v21/styles.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/BetterBluetoothDeviceSort/README.md b/BetterBluetoothDeviceSort/README.md deleted file mode 100644 index 97bcbe2..0000000 --- a/BetterBluetoothDeviceSort/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Better Bluetooth device sort - -This Xposed module sorts Bluetooth devices by name instead of last connected to get a stable order. -Takes effect in the settings app and the media device picker. diff --git a/BetterBluetoothDeviceSort/build.gradle.kts b/BetterBluetoothDeviceSort/build.gradle.kts deleted file mode 100644 index 08035d8..0000000 --- a/BetterBluetoothDeviceSort/build.gradle.kts +++ /dev/null @@ -1,18 +0,0 @@ -plugins { - alias(libs.plugins.buildlogic.android.application) - alias(libs.plugins.buildlogic.kotlin.android) -} - -android { - namespace = "de.binarynoise.betterBluetoothDeviceSort" - - defaultConfig { - minSdk = 30 - targetSdk = 33 - } -} - -dependencies { - implementation(projects.logger) - implementation(projects.reflection) -} diff --git a/BetterBluetoothDeviceSort/src/debug/AndroidManifest.xml b/BetterBluetoothDeviceSort/src/debug/AndroidManifest.xml deleted file mode 100644 index 95f2315..0000000 --- a/BetterBluetoothDeviceSort/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/BetterBluetoothDeviceSort/src/debug/java/RestartSettingsActivity.kt b/BetterBluetoothDeviceSort/src/debug/java/RestartSettingsActivity.kt deleted file mode 100644 index 39e3d5f..0000000 --- a/BetterBluetoothDeviceSort/src/debug/java/RestartSettingsActivity.kt +++ /dev/null @@ -1,26 +0,0 @@ -package de.binarynoise.betterBluetoothDeviceSort - -import kotlin.concurrent.thread -import android.app.Activity -import android.content.ActivityNotFoundException -import android.content.Intent -import android.os.Bundle -import android.provider.Settings - -class RestartSettingsActivity : Activity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - thread { - Runtime.getRuntime().exec("su -c am force-stop com.android.bluetooth").waitFor() - runOnUiThread { - try { - startActivity(Intent(Settings.ACTION_BLUETOOTH_SETTINGS).apply { - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - }) - } catch (_: ActivityNotFoundException) { - } - finish() - } - } - } -} diff --git a/BetterBluetoothDeviceSort/src/main/AndroidManifest.xml b/BetterBluetoothDeviceSort/src/main/AndroidManifest.xml deleted file mode 100644 index 16331f4..0000000 --- a/BetterBluetoothDeviceSort/src/main/AndroidManifest.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - diff --git a/BetterBluetoothDeviceSort/src/main/assets/xposed_init b/BetterBluetoothDeviceSort/src/main/assets/xposed_init deleted file mode 100644 index 8ba0d20..0000000 --- a/BetterBluetoothDeviceSort/src/main/assets/xposed_init +++ /dev/null @@ -1 +0,0 @@ -de.binarynoise.betterBluetoothDeviceSort.Hook diff --git a/BetterBluetoothDeviceSort/src/main/java/de/binarynoise/betterBluetoothDeviceSort/Hook.kt b/BetterBluetoothDeviceSort/src/main/java/de/binarynoise/betterBluetoothDeviceSort/Hook.kt deleted file mode 100644 index 2cef0b2..0000000 --- a/BetterBluetoothDeviceSort/src/main/java/de/binarynoise/betterBluetoothDeviceSort/Hook.kt +++ /dev/null @@ -1,58 +0,0 @@ -package de.binarynoise.betterBluetoothDeviceSort - -import android.bluetooth.BluetoothDevice -import de.binarynoise.logger.Logger.log -import de.binarynoise.reflection.cast -import de.robv.android.xposed.IXposedHookLoadPackage -import de.robv.android.xposed.XposedHelpers -import de.robv.android.xposed.callbacks.XC_LoadPackage -import de.robv.android.xposed.XC_MethodHook as MethodHook - -class Hook : IXposedHookLoadPackage { - - @Suppress("RemoveExplicitTypeArguments") // Comparator.naturalOrder() does need type info so the other lambda gets inferred correctly - override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) { - - XposedHelpers.findAndHookMethod( - "com.android.bluetooth.btservice.storage.DatabaseManager", lpparam.classLoader, "getMostRecentlyConnectedDevices", - object : MethodHook() { - override fun afterHookedMethod(param: MethodHookParam) { - log("called getMostRecentlyConnectedDevices") - with(param) { - if (throwable != null || result == null) return - @Suppress("UNCHECKED_CAST") - val unsorted = result as MutableList - log("${unsorted.size} devices") - - val mAdapterService = XposedHelpers.getObjectField(param.thisObject, "mAdapterService") - val mRemoteDevices = XposedHelpers.getObjectField(mAdapterService, "mRemoteDevices") - val map = unsorted.associateWith { XposedHelpers.callMethod(mRemoteDevices, "getDeviceProperties", it) } - - val mMetadataCache = XposedHelpers.getObjectField(param.thisObject, "mMetadataCache").cast>() - val (bonded, others) = unsorted.partition { mMetadataCache.containsKey(it.address) } - log("${bonded.size} bonded, ${others.size} others") - - val comparator = Comparator.comparing({ - val properties = map[it] ?: run { - log("${it.address} not found") - return@comparing null - } - val mAlias = XposedHelpers.getObjectField(properties, "mAlias") as? String? - val mName = XposedHelpers.getObjectField(properties, "mName") as? String? - log("alias: $mAlias | name: $mName") - return@comparing mAlias ?: mName - }, Comparator.nullsLast(Comparator.naturalOrder())) - - val res = ArrayList() - res.addAll(bonded.toSortedSet(comparator)) - res.addAll(others) - - result = res - } - } - }, - ) - - log("Hooked getMostRecentlyConnectedDevices") - } -} diff --git a/BetterBluetoothDeviceSort/src/main/res/values/arrays.xml b/BetterBluetoothDeviceSort/src/main/res/values/arrays.xml deleted file mode 100644 index 02694d5..0000000 --- a/BetterBluetoothDeviceSort/src/main/res/values/arrays.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - com.android.bluetooth - - diff --git a/BetterVerboseWiFiLogging/README.md b/BetterVerboseWiFiLogging/README.md deleted file mode 100644 index 44de388..0000000 --- a/BetterVerboseWiFiLogging/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# Better Verbose WiFi Logging - -This Xposed module makes the verbose Wi-Fi information (enabled in the developer settings) more readable, -adds some and hides some useless information. - -*Before:* - -``` -Name of the Network -Connected / f = 2422 aa:bb:cc:dd:ee:ff standard = Wi-Fi 4 rssi = -44 score = 60 tx=0.0, 0.0, 0.0 rx=0.0 hasInternet:true, isDefaultNetwork:true, isLowQuality:false [(1) {aa:bb:cc:dd:ee:ff*=,-44,Wi-Fi 4,2s};;;] -``` - -Notice how it is all one long line that gets wrapped at your screen to make it fit. - -*After:* - -``` -Name of the Network -Connected / 2422 MHz (3), bssid:aa:bb:cc:dd:ee:ff, standard=4, rssi=-35dBm, hasInternet:true, isDefaultNetwork:true, isLowQuality:false -[{aa:bb:cc:dd:ee:ff*, 2422 MHz (3), -26 dBm}] -``` - -This one is split into multiple lines: one for the general status info, one for _each_ network. -In parentheses, you find the channel number because that is usually more interesting than the frequency itself. -Everything that has units now displays those units. -What you don't see is that elements that belong together have no break spaces between them -so that they are always displayed in one line next to each other. diff --git a/BetterVerboseWiFiLogging/build.gradle.kts b/BetterVerboseWiFiLogging/build.gradle.kts deleted file mode 100644 index 12469be..0000000 --- a/BetterVerboseWiFiLogging/build.gradle.kts +++ /dev/null @@ -1,18 +0,0 @@ -plugins { - alias(libs.plugins.buildlogic.android.application) - alias(libs.plugins.buildlogic.kotlin.android) -} - -android { - namespace = "de.binarynoise.betterVerboseWiFiLogging" - - defaultConfig { - minSdk = 30 - targetSdk = 33 - } -} - -dependencies { - implementation(projects.reflection) - implementation(libs.hiddenapibypass) -} diff --git a/BetterVerboseWiFiLogging/src/debug/AndroidManifest.xml b/BetterVerboseWiFiLogging/src/debug/AndroidManifest.xml deleted file mode 100644 index 95f2315..0000000 --- a/BetterVerboseWiFiLogging/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/BetterVerboseWiFiLogging/src/debug/java/RestartSettingsActivity.kt b/BetterVerboseWiFiLogging/src/debug/java/RestartSettingsActivity.kt deleted file mode 100644 index 132933d..0000000 --- a/BetterVerboseWiFiLogging/src/debug/java/RestartSettingsActivity.kt +++ /dev/null @@ -1,26 +0,0 @@ -package de.binarynoise.betterVerboseWiFiLogging - -import kotlin.concurrent.thread -import android.app.Activity -import android.content.ActivityNotFoundException -import android.content.Intent -import android.os.Bundle -import android.provider.Settings - -class RestartSettingsActivity : Activity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - thread { - Runtime.getRuntime().exec("su -c am force-stop com.android.settings").waitFor() - runOnUiThread { - try { - startActivity(Intent(Settings.ACTION_WIFI_SETTINGS).apply { - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - }) - } catch (_: ActivityNotFoundException) { - } - finish() - } - } - } -} diff --git a/BetterVerboseWiFiLogging/src/main/AndroidManifest.xml b/BetterVerboseWiFiLogging/src/main/AndroidManifest.xml deleted file mode 100644 index 2a2b130..0000000 --- a/BetterVerboseWiFiLogging/src/main/AndroidManifest.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - diff --git a/BetterVerboseWiFiLogging/src/main/assets/xposed_init b/BetterVerboseWiFiLogging/src/main/assets/xposed_init deleted file mode 100644 index f05a59f..0000000 --- a/BetterVerboseWiFiLogging/src/main/assets/xposed_init +++ /dev/null @@ -1 +0,0 @@ -de.binarynoise.betterVerboseWiFiLogging.Hook diff --git a/BetterVerboseWiFiLogging/src/main/java/de/binarynoise/betterVerboseWiFiLogging/Hook.kt b/BetterVerboseWiFiLogging/src/main/java/de/binarynoise/betterVerboseWiFiLogging/Hook.kt deleted file mode 100644 index 5c71b02..0000000 --- a/BetterVerboseWiFiLogging/src/main/java/de/binarynoise/betterVerboseWiFiLogging/Hook.kt +++ /dev/null @@ -1,79 +0,0 @@ -package de.binarynoise.betterVerboseWiFiLogging - -import android.os.Build -import de.binarynoise.betterVerboseWiFiLogging.StandardWifiEntry.newGetScanResultDescription -import de.binarynoise.betterVerboseWiFiLogging.Utils.wifiTrackerLibUtilsClass -import de.binarynoise.betterVerboseWiFiLogging.WifiEntry.getNetworkCapabilityDescription -import de.binarynoise.betterVerboseWiFiLogging.WifiEntry.getNetworkCapabilityDescriptionFallback -import de.binarynoise.betterVerboseWiFiLogging.WifiEntry.getNetworkSelectionDescription -import de.binarynoise.betterVerboseWiFiLogging.WifiEntry.getWifiInfoDescription -import de.binarynoise.betterVerboseWiFiLogging.WifiEntry.newGetWifiInfoDescription -import de.binarynoise.betterVerboseWiFiLogging.WifiEntry.wifiEntryClass -import de.binarynoise.reflection.cast -import de.robv.android.xposed.IXposedHookLoadPackage -import de.robv.android.xposed.XposedBridge -import de.robv.android.xposed.XposedHelpers -import de.robv.android.xposed.callbacks.XC_LoadPackage -import de.robv.android.xposed.XC_MethodHook as MethodHook - -class Hook : IXposedHookLoadPackage { - - override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) { - Wrapper.classLoader = lpparam.classLoader - - if (getWifiInfoDescription != null) { - XposedBridge.hookMethod(getWifiInfoDescription, object : MethodHook() { - override fun beforeHookedMethod(param: MethodHookParam) { - with(param) { - result = newGetWifiInfoDescription(thisObject) - } - } - }) - } - - run { - val hook = object : MethodHook() { - override fun beforeHookedMethod(param: MethodHookParam) { - with(param) { - result = newGetScanResultDescription(thisObject) - } - } - } - listOf(WifiEntry.getScanResultDescription, StandardWifiEntry.getScanResultDescription).forEach { - try { - XposedBridge.hookMethod(it, hook) - } catch (e: IllegalArgumentException) { - // ignore IllegalArgumentException: Cannot hook abstract methods - if (e.message?.contains("abstract") != true) throw e - } - } - } - - val verboseMethod = if (Build.VERSION.SDK_INT < 34) { - XposedHelpers.findMethodExact(wifiTrackerLibUtilsClass, "getVerboseLoggingDescription", wifiEntryClass) - } else { - XposedHelpers.findMethodExact(wifiTrackerLibUtilsClass, "getVerboseSummary", wifiEntryClass) - } - - XposedBridge.hookMethod(verboseMethod, object : MethodHook() { - override fun beforeHookedMethod(param: MethodHookParam) { - with(param) { - val wifiEntry = args[0] - - if (!BaseWifiTracker.isVerboseLoggingEnabled() || wifiEntry == null) { - result = "" - return - } - - result = listOf( - newGetWifiInfoDescription(wifiEntry), - (getNetworkCapabilityDescription?.invoke(wifiEntry) ?: getNetworkCapabilityDescriptionFallback(wifiEntry))?.cast() - ?.replace(":", ":\u00A0"), // can stay as is - newGetScanResultDescription(wifiEntry), - getNetworkSelectionDescription.invoke(wifiEntry)?.cast(), // TODO - ).filterNot { it.isNullOrBlank() }.joinToString(",\n").trim() - } - } - }) - } -} diff --git a/BetterVerboseWiFiLogging/src/main/java/de/binarynoise/betterVerboseWiFiLogging/Wrapper.kt b/BetterVerboseWiFiLogging/src/main/java/de/binarynoise/betterVerboseWiFiLogging/Wrapper.kt deleted file mode 100644 index 17883ef..0000000 --- a/BetterVerboseWiFiLogging/src/main/java/de/binarynoise/betterVerboseWiFiLogging/Wrapper.kt +++ /dev/null @@ -1,350 +0,0 @@ -package de.binarynoise.betterVerboseWiFiLogging - -import java.lang.reflect.Method -import android.net.wifi.ScanResult -import android.net.wifi.WifiConfiguration -import android.net.wifi.WifiInfo -import android.os.Build -import de.binarynoise.betterVerboseWiFiLogging.WifiEntry.mWifiInfoField -import de.binarynoise.betterVerboseWiFiLogging.Wrapper.classLoader -import de.binarynoise.reflection.findDeclaredField -import de.binarynoise.reflection.findDeclaredMethod -import de.binarynoise.reflection.findDeclaredMethodOrNull -import de.robv.android.xposed.XposedHelpers -import org.lsposed.hiddenapibypass.HiddenApiBypass - -const val wifitrackerlib = "com.android.wifitrackerlib" - -object Wrapper { - lateinit var classLoader: ClassLoader -} - -object BaseWifiTracker { - fun isVerboseLoggingEnabled(): Boolean { - if (Build.VERSION.SDK_INT < 34) { - val baseWiFiTrackerClass: Class<*> = XposedHelpers.findClass("$wifitrackerlib.BaseWifiTracker", classLoader) - return baseWiFiTrackerClass.getDeclaredMethod("isVerboseLoggingEnabled").invoke(null) as Boolean - } else { - // that actually is the fix, the original code doesn't check for this either anymore - // https://cs.android.com/android/_/android/platform/frameworks/opt/net/wifi/+/main:libs/WifiTrackerLib/src/com/android/wifitrackerlib/Utils.java;l=529;bpv=0;bpt=0 - return true - } - } -} - -object Utils { - val wifiTrackerLibUtilsClass: Class<*> get() = classLoader.loadClass("$wifitrackerlib.Utils") -} - -val channelMap = mapOf( - // 2.4 GHz (802.11b/g/n/ax) - 2412 to 1, - 2417 to 2, - 2422 to 3, - 2427 to 4, - 2432 to 5, - 2437 to 6, - 2442 to 7, - 2447 to 8, - 2452 to 9, - 2457 to 10, - 2462 to 11, - 2467 to 12, - 2472 to 13, - 2484 to 14, - // 5 GHz (802.11a/h/n/ac/ax) - 5160 to 32, - 5180 to 36, - 5190 to 38, - 5200 to 40, - 5210 to 42, - 5220 to 44, - 5230 to 46, - 5240 to 48, - 5250 to 50, - 5260 to 52, - 5270 to 54, - 5280 to 56, - 5290 to 58, - 5300 to 60, - 5310 to 62, - 5320 to 64, - 5340 to 68, - 5480 to 96, - 5500 to 100, - 5510 to 102, - 5520 to 104, - 5530 to 106, - 5540 to 108, - 5550 to 110, - 5560 to 112, - 5570 to 114, - 5580 to 116, - 5590 to 118, - 5600 to 120, - 5610 to 122, - 5620 to 124, - 5630 to 126, - 5640 to 128, - 5660 to 132, - 5670 to 134, - 5680 to 136, - 5690 to 138, - 5700 to 140, - 5710 to 142, - 5720 to 144, - 5745 to 149, - 5755 to 151, - 5765 to 153, - 5775 to 155, - 5785 to 157, - 5795 to 159, - 5805 to 161, - 5815 to 163, - 5825 to 165, - 5835 to 167, - 5845 to 169, - 5855 to 171, - 5865 to 173, - 5875 to 175, - 5885 to 177, - // 6 GHz (802.11ax and 802.11be) - 5935 to 2, - 5955 to 1, - 5975 to 5, - 5995 to 9, - 6015 to 13, - 6035 to 17, - 6055 to 21, - 6075 to 25, - 6095 to 29, - 6115 to 33, - 6135 to 37, - 6155 to 41, - 6175 to 45, - 6195 to 49, - 6215 to 53, - 6235 to 57, - 6255 to 61, - 6275 to 65, - 6295 to 69, - 6315 to 73, - 6335 to 77, - 6355 to 81, - 6375 to 85, - 6395 to 89, - 6415 to 93, - 6435 to 97, - 6455 to 101, - 6475 to 105, - 6495 to 109, - 6515 to 113, - 6535 to 117, - 6555 to 121, - 6575 to 125, - 6595 to 129, - 6615 to 133, - 6635 to 137, - 6655 to 141, - 6675 to 145, - 6695 to 149, - 6715 to 153, - 6735 to 157, - 6755 to 161, - 6775 to 165, - 6795 to 169, - 6815 to 173, - 6835 to 177, - 6855 to 181, - 6875 to 185, - 6895 to 189, - 6915 to 193, - 6935 to 197, - 6955 to 201, - 6975 to 205, - 6995 to 209, - 7015 to 213, - 7035 to 217, - 7055 to 221, - 7075 to 225, - 7095 to 229, - 7115 to 233, - - // 3.65 GHz (802.11y) - 3660 to 132, - 3665 to 133, - 3670 to 134, - 3680 to 136, - 3685 to 137, - 3690 to 138, - // 4.9–5.0 GHz (802.11j) - 4920 to 184, - 4940 to 188, - 4960 to 192, - 4980 to 196, - 5040 to 8, - 5060 to 12, - 5080 to 16, - // 5.9 GHz (802.11p) - 5860 to 172, - 5870 to 174, - 5880 to 176, - 5890 to 178, - 5900 to 180, - 5910 to 182, - 5915 to 183, - 5920 to 184, - 5935 to 187, - 5940 to 188, - 5945 to 189, - 5960 to 192, - 5980 to 196, -) - -object WifiEntry { - val wifiEntryClass: Class<*> = classLoader.loadClass("$wifitrackerlib.WifiEntry") - - // inlined by r8 in SystemUI - val getWifiInfoDescription: Method? = wifiEntryClass.findDeclaredMethodOrNull("getWifiInfoDescription") - - private const val CONNECTED_STATE_CONNECTED = 2 - fun newGetWifiInfoDescription(wifiEntry: Any): String { - val mWifiInfo = mWifiInfoField[wifiEntry] as WifiInfo? - - if (getConnectedState(wifiEntry) != CONNECTED_STATE_CONNECTED || mWifiInfo == null) { - return "" - } - with(mWifiInfo) { - return buildString { - append("$frequency\u202FMHz") - channelMap[frequency]?.let { - append("\u202F($it)") - } - append(", ") - append("bssid:${mWifiInfo.bssid}") - append(", ") - append("standard=${mWifiInfo.wifiStandard}") - append(", ") - append("rssi=$rssi\u202FdBm") - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - append(", ") -// append("securityType=") - append(securityTypeToString(currentSecurityType)) - } - } - } - } - - val getNetworkCapabilityDescription = wifiEntryClass.findDeclaredMethodOrNull("getNetworkCapabilityDescription") - - /** - * Fallback for getNetworkCapabilityDescription when it is inlined by r8 - */ - fun getNetworkCapabilityDescriptionFallback(wifiEntry: Any): String? { - val getConnectedState = wifiEntryClass.findDeclaredMethodOrNull("getConnectedState") ?: return null - val hasInternetAccess = wifiEntryClass.findDeclaredMethodOrNull("hasInternetAccess") ?: return null - val isDefaultNetwork = wifiEntryClass.findDeclaredMethodOrNull("isDefaultNetwork") ?: return null - val isLowQuality = wifiEntryClass.findDeclaredMethodOrNull("isLowQuality") ?: return null - - return buildString { - if (getConnectedState(wifiEntry) == CONNECTED_STATE_CONNECTED) { - append("hasInternet:") - append(hasInternetAccess(wifiEntry)) - append(", isDefaultNetwork:") - append(isDefaultNetwork(wifiEntry)) - append(", isLowQuality:") - append(isLowQuality(wifiEntry)) - } - } - } - - val getNetworkSelectionDescription = wifiEntryClass.findDeclaredMethod("getNetworkSelectionDescription") - - val getScanResultDescription = wifiEntryClass.findDeclaredMethod("getScanResultDescription") // -> StandardWifiEntry - - val getConnectedState = wifiEntryClass.findDeclaredMethod("getConnectedState") - - val mWifiInfoField = wifiEntryClass.findDeclaredField("mWifiInfo") - - - @Suppress("DEPRECATION") - val getSecurityTypeNameMethod = WifiConfiguration::class.java.getDeclaredMethod("getSecurityTypeName", Int::class.java) - - @Suppress("DEPRECATION") - val WifiConfigurationFields = HiddenApiBypass.getStaticFields(WifiConfiguration::class.java); - - val SECURITY_TYPE_PASSPOINT_R1_R2 = WifiConfigurationFields.first { it.name == "SECURITY_TYPE_PASSPOINT_R1_R2" }.getInt(null) - val SECURITY_TYPE_PASSPOINT_R3 = WifiConfigurationFields.first { it.name == "SECURITY_TYPE_PASSPOINT_R3" }.getInt(null) - - @Suppress("DEPRECATION") - fun convertWifiConfigurationSecurityTypeBack(/* @WifiInfo.SecurityType */ wifiInfoSecurity: Int): /* @WifiAnnotations.SecurityType */ Int = - when (wifiInfoSecurity) { - WifiInfo.SECURITY_TYPE_OPEN -> WifiConfiguration.SECURITY_TYPE_OPEN - WifiInfo.SECURITY_TYPE_WEP -> WifiConfiguration.SECURITY_TYPE_WEP - WifiInfo.SECURITY_TYPE_PSK -> WifiConfiguration.SECURITY_TYPE_PSK - WifiInfo.SECURITY_TYPE_EAP -> WifiConfiguration.SECURITY_TYPE_EAP - WifiInfo.SECURITY_TYPE_SAE -> WifiConfiguration.SECURITY_TYPE_SAE - WifiInfo.SECURITY_TYPE_OWE -> WifiConfiguration.SECURITY_TYPE_OWE - WifiInfo.SECURITY_TYPE_WAPI_PSK -> WifiConfiguration.SECURITY_TYPE_WAPI_PSK - WifiInfo.SECURITY_TYPE_WAPI_CERT -> WifiConfiguration.SECURITY_TYPE_WAPI_CERT - WifiInfo.SECURITY_TYPE_EAP_WPA3_ENTERPRISE -> WifiConfiguration.SECURITY_TYPE_EAP_WPA3_ENTERPRISE - WifiInfo.SECURITY_TYPE_EAP_WPA3_ENTERPRISE_192_BIT -> WifiConfiguration.SECURITY_TYPE_EAP_WPA3_ENTERPRISE_192_BIT - WifiInfo.SECURITY_TYPE_PASSPOINT_R1_R2 -> SECURITY_TYPE_PASSPOINT_R1_R2 - WifiInfo.SECURITY_TYPE_PASSPOINT_R3 -> SECURITY_TYPE_PASSPOINT_R3 - WifiInfo.SECURITY_TYPE_DPP -> WifiConfiguration.SECURITY_TYPE_DPP - else -> WifiInfo.SECURITY_TYPE_UNKNOWN - } - - - fun securityTypeToString(type: Int): String { - return getSecurityTypeNameMethod(null, convertWifiConfigurationSecurityTypeBack(type)) as String - } -} - -object StandardWifiEntry { - private val standardWifiEntryClass: Class<*> = classLoader.loadClass("$wifitrackerlib.StandardWifiEntry") - val getScanResultDescription = WifiEntry.wifiEntryClass.findDeclaredMethod("getScanResultDescription") // -> StandardWifiEntry - - fun newGetScanResultDescription(wifiEntry: Any): String { - @Suppress("UNCHECKED_CAST") - val mTargetScanResults = mTargetScanResultsField[wifiEntry] as ArrayList - val mWifiInfo = mWifiInfoField[wifiEntry] as WifiInfo? - if (mTargetScanResults.isEmpty()) return "" - return mTargetScanResults.sortedBy { it.frequency }.joinToString(",\n ", "[", "]") { scanResult -> - buildString { - append("{") - append(scanResult.BSSID) - if (mWifiInfo != null && mWifiInfo.bssid == scanResult.BSSID) { - append("*") - } - append(", ") - - append(scanResult.frequency) - append("\u202FMHz") - channelMap[scanResult.frequency]?.let { - append("\u202F($it)") - } - append(", ") - - append(scanResult.level) - append("\u202FdBm") - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - append(", ") -// append("securityType=") - append("[") - append(scanResult.securityTypes.joinToString { WifiEntry.securityTypeToString(it) }) - append("]") - } - - // removed: WiFi-Standard - // removed: WiFi 11BE info: mldMac, linkId, addLinks - // removed: age in seconds - - append("}") - } - } - } - - private val mTargetScanResultsField = standardWifiEntryClass.findDeclaredField("mTargetScanResults") -} diff --git a/BetterVerboseWiFiLogging/src/main/res/values/arrays.xml b/BetterVerboseWiFiLogging/src/main/res/values/arrays.xml deleted file mode 100644 index ee9708d..0000000 --- a/BetterVerboseWiFiLogging/src/main/res/values/arrays.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - com.android.settings - com.android.systemui - - diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..fad9f40 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +xposedmodulets.binarynoise.de \ No newline at end of file diff --git a/ClassHunter/.gitignore b/ClassHunter/.gitignore deleted file mode 100644 index 5e1ebba..0000000 --- a/ClassHunter/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/targetClass.txt diff --git a/ClassHunter/Readme.md b/ClassHunter/Readme.md deleted file mode 100644 index 9b841da..0000000 --- a/ClassHunter/Readme.md +++ /dev/null @@ -1,7 +0,0 @@ -# ClassHunter - -Hunts for a Class. -Chose which class you want to hunt for in `build.gradle.kts`: -```kotlin - buildConfigField("String", "targetClass", """"com.example.MyClass"""") -``` diff --git a/ClassHunter/build.gradle.kts b/ClassHunter/build.gradle.kts deleted file mode 100644 index 7a29b3e..0000000 --- a/ClassHunter/build.gradle.kts +++ /dev/null @@ -1,31 +0,0 @@ -plugins { - alias(libs.plugins.buildlogic.android.application) - alias(libs.plugins.buildlogic.kotlin.android) -} - -android { - namespace = "de.binarynoise.ClassHunter" - - defaultConfig { - minSdk = 26 - targetSdk = 35 - - val file = File(projectDir, "targetClass.txt") - if (!file.exists()) { - file.createNewFile() - } - val classes = file.readLines().filterNot { it.startsWith("#") || it.isBlank() } - buildConfigField("String[]", "targetClass", classes.joinToString("\", \"", "{\"", "\"}")) - versionNameSuffix = classes.joinToString(", ", " (", ")") - } - - buildFeatures { - buildConfig = true - } -} - -dependencies { - implementation(libs.libsu.core) - implementation(projects.logger) - implementation(projects.reflection) -} diff --git a/ClassHunter/src/main/AndroidManifest.xml b/ClassHunter/src/main/AndroidManifest.xml deleted file mode 100644 index 1aa0618..0000000 --- a/ClassHunter/src/main/AndroidManifest.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/ClassHunter/src/main/assets/xposed_init b/ClassHunter/src/main/assets/xposed_init deleted file mode 100644 index 6e71276..0000000 --- a/ClassHunter/src/main/assets/xposed_init +++ /dev/null @@ -1 +0,0 @@ -de.binarynoise.classHunter.Hook diff --git a/ClassHunter/src/main/java/de/binarynoise/classHunter/Hook.kt b/ClassHunter/src/main/java/de/binarynoise/classHunter/Hook.kt deleted file mode 100644 index 2267f31..0000000 --- a/ClassHunter/src/main/java/de/binarynoise/classHunter/Hook.kt +++ /dev/null @@ -1,213 +0,0 @@ -package de.binarynoise.classHunter - -import java.io.File -import java.net.URLClassLoader -import java.security.SecureClassLoader -import android.os.Build -import android.util.Log -import dalvik.system.BaseDexClassLoader -import dalvik.system.DelegateLastClassLoader -import dalvik.system.DexClassLoader -import dalvik.system.InMemoryDexClassLoader -import dalvik.system.PathClassLoader -import de.binarynoise.ClassHunter.BuildConfig -import de.binarynoise.logger.Logger.log -import de.binarynoise.reflection.cast -import de.robv.android.xposed.IXposedHookLoadPackage -import de.robv.android.xposed.IXposedHookZygoteInit -import de.robv.android.xposed.XposedBridge -import de.robv.android.xposed.XposedHelpers -import de.robv.android.xposed.callbacks.XC_LoadPackage -import de.robv.android.xposed.XC_MethodHook as MethodHook - -const val TAG = "Hook" - -class Hook : IXposedHookLoadPackage, IXposedHookZygoteInit { - - override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) { - Log.d(TAG, "handleLoadPackage: ${lpparam.packageName}") - - val packageClassLoader: ClassLoader = lpparam.classLoader - tryFindClass(packageClassLoader, "packageClassLoader", lpparam.packageName) - - val moduleClassLoader: ClassLoader = this::class.java.classLoader!! - tryFindClass(moduleClassLoader, "moduleClassLoader", lpparam.packageName) - - val systemClassLoader: ClassLoader = ClassLoader.getSystemClassLoader() - tryFindClass(systemClassLoader, "systemClassLoader", lpparam.packageName) - - XposedHelpers.findAndHookMethod(ClassLoader::class.java, "loadClass", String::class.java, Boolean::class.java, object : MethodHook() { - override fun afterHookedMethod(param: MethodHookParam) { - with(param) { - val cls = result as? Class<*>? ?: return - if (!ClassLoader::class.java.isAssignableFrom(cls)) return - Log.i(TAG, "loadClass afterHookedMethod: loaded new classLoader class: ${cls.name}") - } - } - }) - - //////////////////////////////////////////////////////////////////////////////////////////////////// - - try { - val SystemServerClassLoaderFactoryClass = XposedHelpers.findClass("com.android.internal.os.SystemServerClassLoaderFactory", null) - val sLoadedPaths: Map = - XposedHelpers.getStaticObjectField(SystemServerClassLoaderFactoryClass, "sLoadedPaths").cast() - Log.v(TAG, "sLoadedPaths:") - sLoadedPaths.forEach { (path, loader) -> - Log.v(TAG, "sLoadedPaths: $path -> ${loader.toObjectString()}") - tryFindClass(loader, "SystemServerClassLoaderFactory", lpparam.packageName) - } - } catch (_: NoSuchMethodError) { - } catch (_: NoSuchMethodException) { - } catch (_: XposedHelpers.ClassNotFoundError) { - } catch (_: ClassNotFoundException) { - } catch (e: Exception) { - log("failed to hook", e) - } - } - - override fun initZygote(startupParam: IXposedHookZygoteInit.StartupParam) { - val packageName = File("/proc/self/cmdline").readText().replace(0.toChar(), ' ') - - @Suppress("RemoveExplicitTypeArguments") // - val classLoaderClasses = mutableSetOf>( - ClassLoader::class.java, - SecureClassLoader::class.java, - URLClassLoader::class.java, - BaseDexClassLoader::class.java, - PathClassLoader::class.java, - InMemoryDexClassLoader::class.java, - DexClassLoader::class.java, - ClassLoader.getSystemClassLoader()::class.java, // BootClassLoader - ) - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { - classLoaderClasses.add(DelegateLastClassLoader::class.java) - } - - try { - classLoaderClasses.add(Class.forName("android.app.LoadedApk\$WarningContextClassLoader", false, null).cast()) - } catch (_: Throwable) { - } - - // prevent nested classloader logs - val constructorLock: ThreadLocal = ThreadLocal.withInitial { 0 } - - classLoaderClasses.forEach { classLoaderClass -> - try { - XposedBridge.hookAllConstructors(classLoaderClass, object : MethodHook() { - override fun beforeHookedMethod(param: MethodHookParam) { - constructorLock.set(constructorLock.get()!! + 1) - } - - override fun afterHookedMethod(param: MethodHookParam) { - constructorLock.set(constructorLock.get()!! - 1) - if (constructorLock.get()!! > 0) return - constructorLock.remove() - with(param) { - val newClassLoader = thisObject as? ClassLoader? ?: return - val string = newClassLoader.toString() - - val ignored = arrayOf( - "dalvik.system.PathClassLoader[null]", - "dalvik.system.PathClassLoader[DexPathList[[],nativeLibraryDirectories=[/system/lib64, /system_ext/lib64]]]", - "LspModuleClassLoader[instantiating]", - """dalvik.system.PathClassLoader[DexPathList[[directory "/proc/self/task"],nativeLibraryDirectories=[/system/lib64, /system_ext/lib64]]]""", - ) - if (string !in ignored) { - Log.v(TAG, "ClassLoader constructor: created new classLoader: ${newClassLoader.toObjectString()} $string") - } - - tryFindClass(newClassLoader, "constructor", packageName) - - } - } - }) -// Log.v(TAG, "initZygote: hooked constructor of ${classLoaderClass.name}") - } catch (_: NoSuchMethodError) { - } catch (_: NoSuchMethodException) { - } catch (t: Throwable) { - Log.w(TAG, "initZygote: failed to hook constructor of ${classLoaderClass.name}", t) - } - } - } - - // https://cs.android.com/search?q=%22--prefix%20%22%20file:Android.bp - // /(?<=--prefix )([\w\.]+)/ - val prefixes = arrayOf( - "android.net.connectivity", - "android.net.http.internal", - "com.android.captiveportallogin", - "com.android.networkstack", - "com.android.server.nearby", - "com.android.server.remoteauth", - "gfxstream_vk", - "lvp", - "vk_cmd_enqueue", - "vk_cmd_enqueue_unless_primary", - "vk_common", - "wsi", - ) - - fun tryFindClass(classLoader: ClassLoader, classLoaderName: String, packageName: String) { - BuildConfig.targetClass.forEach { className -> - var cls: Class<*>? = null - - var classLoader: ClassLoader? = classLoader - var successClassLoader: ClassLoader? = null - var i = 0 - - loop@ while (classLoader != null && i++ < 10) { - try { - cls = Class.forName(className, false, classLoader) - successClassLoader = classLoader - break@loop - } catch (_: Throwable) { - } - prefixes.forEach { prefix -> - try { - cls = Class.forName("$prefix.$className", false, classLoader) - successClassLoader = classLoader - break@loop - } catch (_: Throwable) { - } - } - classLoader = classLoader.parent - } - - if (cls != null && successClassLoader != null) { - logClass(cls, classLoaderName, successClassLoader, packageName) - } - } - } - - private fun logClass(cls: Class<*>, classLoaderName: String, classLoader: ClassLoader, packageName: String, dump: Boolean = true) { - val lines = mutableListOf() - lines.add("*".repeat(150)) - - lines.add("found class: ${cls.name} in package $packageName by $classLoaderName: ${classLoader.toObjectString()} - $classLoader") - if (dump) { - lines.add(" - constructors:") - cls.declaredConstructors.map { c -> "${c.name}(${c.parameters.joinToString(", ") { p -> p.name + " " + p.type.name }})" } - .sorted() - .forEach { c -> lines.add(" - $c") } - - lines.add(" - methods:") - cls.declaredMethods.map { m -> "${m.returnType.name} ${m.name}(${m.parameters.joinToString(", ") { p -> p.name + " " + p.type.name }})" } - .sorted() - .forEach { m -> lines.add(" - $m") } - - lines.add(" - fields:") - cls.declaredFields.map { f -> "${f.type.name} ${f.name}" }.sorted().forEach { f -> lines.add(" - $f") } - } - - lines.forEach { - Log.i(TAG, it) - } - } -} - -fun Any?.toObjectString(): String { - if (this == null) return "null" - return this::class.simpleName + "@" + Integer.toHexString(hashCode()).padStart(8, '0') -} diff --git a/ClassHunter/src/main/java/de/binarynoise/classHunter/SetScopeActivity.kt b/ClassHunter/src/main/java/de/binarynoise/classHunter/SetScopeActivity.kt deleted file mode 100644 index e99c85d..0000000 --- a/ClassHunter/src/main/java/de/binarynoise/classHunter/SetScopeActivity.kt +++ /dev/null @@ -1,104 +0,0 @@ -package de.binarynoise.classHunter - -import kotlin.concurrent.thread -import android.annotation.SuppressLint -import android.app.Activity -import android.os.Bundle -import android.widget.Button -import android.widget.LinearLayout -import android.widget.TextView -import com.topjohnwu.superuser.Shell -import de.binarynoise.ClassHunter.BuildConfig -import de.binarynoise.ClassHunter.R -import de.binarynoise.logger.Logger - -class SetScopeActivity : Activity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.set_scope_activity) - - val setScopeButton = findViewById