diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/Updater.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/Updater.kt index de17d473..8b52f3af 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/Updater.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/Updater.kt @@ -1,31 +1,27 @@ package com.lt2333.simplicitytools.hook.app -import com.lt2333.simplicitytools.util.XSPUtils -import com.lt2333.simplicitytools.util.hookBeforeMethod +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookReturnConstant +import com.github.kyuubiran.ezxhelper.utils.loadClassOrNull +import com.lt2333.simplicitytools.util.hasEnable import com.lt2333.simplicitytools.util.xposed.base.AppRegister -import de.robv.android.xposed.XposedHelpers +import de.robv.android.xposed.XposedBridge import de.robv.android.xposed.callbacks.XC_LoadPackage -object Updater: AppRegister() { +object Updater : AppRegister() { override val packageName: String = "com.android.updater" override val processName: List = emptyList() override val logTag: String = "WooBox" override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) { - if (XSPUtils.getBoolean("remove_ota_validate", false)) { - var letter = 'a' - for (i in 0..25) { - val classIfExists = XposedHelpers.findClassIfExists( - "com.android.updater.common.utils.$letter", lpparam.classLoader - ) ?: continue - if (classIfExists.declaredFields.size >= 9 && classIfExists.declaredMethods.size > 60) { - classIfExists.hookBeforeMethod("T") { - it.result = false - } - return - } - letter++ - } + XposedBridge.log("WooBox: 成功 Hook " + javaClass.simpleName) + + hasEnable("remove_ota_validate") { + Array(26) { "com.android.updater.common.utils.${'a' + it}" } + .mapNotNull { loadClassOrNull(it) } + .firstOrNull() { it.declaredFields.size >= 9 && it.declaredMethods.size > 60 } + ?.findMethod { name == "T" && returnType == Boolean::class.java } + ?.hookReturnConstant(false) } } } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/android/AllowUntrustedTouches.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/android/AllowUntrustedTouches.kt index adf4be81..f31755d8 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/android/AllowUntrustedTouches.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/android/AllowUntrustedTouches.kt @@ -1,21 +1,15 @@ package com.lt2333.simplicitytools.hook.app.android import android.content.Context +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookReturnConstant import com.lt2333.simplicitytools.util.hasEnable -import com.lt2333.simplicitytools.util.hookBeforeMethod import com.lt2333.simplicitytools.util.xposed.base.HookRegister object AllowUntrustedTouches : HookRegister() { - - override fun init() { - hasEnable("allow_untrusted_touches") { - "android.hardware.input.InputManager".hookBeforeMethod( - getDefaultClassLoader(), - "getBlockUntrustedTouchesMode", - Context::class.java - ) { - it.result = 0 - } - } + override fun init() = hasEnable("allow_untrusted_touches") { + findMethod("android.hardware.input.InputManager") { + name == "getBlockUntrustedTouchesMode" && parameterTypes[0] == Context::class.java + }.hookReturnConstant(0) } } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/android/DeleteOnPostNotification.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/android/DeleteOnPostNotification.kt index 01cf3091..d872be7d 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/android/DeleteOnPostNotification.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/android/DeleteOnPostNotification.kt @@ -1,17 +1,18 @@ package com.lt2333.simplicitytools.hook.app.android +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookBefore import com.lt2333.simplicitytools.util.hasEnable -import com.lt2333.simplicitytools.util.hookBeforeMethod import com.lt2333.simplicitytools.util.xposed.base.HookRegister object DeleteOnPostNotification : HookRegister() { - override fun init() { - "com.android.server.wm.AlertWindowNotification".hookBeforeMethod(getDefaultClassLoader(), "onPostNotification") { + findMethod("com.android.server.wm.AlertWindowNotification") { + name == "onPostNotification" + }.hookBefore { hasEnable("delete_on_post_notification") { it.result = null } } } - } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/android/DisableFlagSecure.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/android/DisableFlagSecure.kt index 7be62163..bda0d410 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/android/DisableFlagSecure.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/android/DisableFlagSecure.kt @@ -1,17 +1,18 @@ package com.lt2333.simplicitytools.hook.app.android +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookBefore import com.lt2333.simplicitytools.util.hasEnable -import com.lt2333.simplicitytools.util.hookBeforeMethod import com.lt2333.simplicitytools.util.xposed.base.HookRegister object DisableFlagSecure : HookRegister() { - override fun init() { - "com.android.server.wm.WindowState".hookBeforeMethod(getDefaultClassLoader(), "isSecureLocked") { + findMethod("com.android.server.wm.WindowState") { + name == "isSecureLocked" + }.hookBefore { hasEnable("disable_flag_secure") { it.result = false } } } - } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/android/MaxWallpaperScale.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/android/MaxWallpaperScale.kt index a21cae4c..d38f8197 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/android/MaxWallpaperScale.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/android/MaxWallpaperScale.kt @@ -1,17 +1,18 @@ package com.lt2333.simplicitytools.hook.app.android +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookBefore +import com.github.kyuubiran.ezxhelper.utils.putObject import com.lt2333.simplicitytools.util.XSPUtils -import com.lt2333.simplicitytools.util.hookBeforeMethod -import com.lt2333.simplicitytools.util.setFloatField import com.lt2333.simplicitytools.util.xposed.base.HookRegister object MaxWallpaperScale : HookRegister() { - override fun init() { - "com.android.server.wm.WallpaperController".hookBeforeMethod(getDefaultClassLoader(), "zoomOutToScale", Float::class.java) { + findMethod("com.android.server.wm.WallpaperController") { + name == "zoomOutToScale" && parameterTypes[0] == Float::class.java + }.hookBefore { val value = XSPUtils.getFloat("max_wallpaper_scale", 1.1f) - it.thisObject.setFloatField("mMaxWallpaperScale", value) + it.thisObject.putObject("mMaxWallpaperScale", value) } } - } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/android/RemoveSmallWindowRestrictions.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/android/RemoveSmallWindowRestrictions.kt index bad0722d..68d37b22 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/android/RemoveSmallWindowRestrictions.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/android/RemoveSmallWindowRestrictions.kt @@ -1,38 +1,45 @@ package com.lt2333.simplicitytools.hook.app.android import android.content.Context +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookAfter +import com.github.kyuubiran.ezxhelper.utils.hookBefore import com.lt2333.simplicitytools.util.hasEnable -import com.lt2333.simplicitytools.util.hookAfterMethod -import com.lt2333.simplicitytools.util.hookBeforeMethod import com.lt2333.simplicitytools.util.xposed.base.HookRegister object RemoveSmallWindowRestrictions : HookRegister() { - override fun init() { // 强制所有活动设为可以调整大小 - "com.android.server.wm.Task".hookBeforeMethod(getDefaultClassLoader(), "isResizeable") { + findMethod("com.android.server.wm.Task") { + name == "isResizeable" + }.hookBefore { hasEnable("remove_small_window_restrictions") { it.result = true } } - "android.util.MiuiMultiWindowAdapter".hookAfterMethod(getDefaultClassLoader(), "getFreeformBlackList") { + findMethod("android.util.MiuiMultiWindowAdapter") { + name == "getFreeformBlackList" + }.hookAfter { hasEnable("remove_small_window_restrictions") { it.result = (it.result as MutableList<*>).apply { clear() } } } - "android.util.MiuiMultiWindowAdapter".hookAfterMethod(getDefaultClassLoader(), "getFreeformBlackListFromCloud", Context::class.java) { + findMethod("android.util.MiuiMultiWindowAdapter") { + name == "getFreeformBlackListFromCloud" && parameterTypes[0] == Context::class.java + }.hookAfter { hasEnable("remove_small_window_restrictions") { it.result = (it.result as MutableList<*>).apply { clear() } } } - "android.util.MiuiMultiWindowUtils".hookAfterMethod(getDefaultClassLoader(), "supportFreeform") { + findMethod("android.util.MiuiMultiWindowUtils") { + name == "supportFreeform" + }.hookAfter { hasEnable("remove_small_window_restrictions") { it.result = true } } } - } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/android/SystemPropertiesHook.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/android/SystemPropertiesHook.kt index 7102ec0a..04a9af99 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/android/SystemPropertiesHook.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/android/SystemPropertiesHook.kt @@ -1,7 +1,8 @@ package com.lt2333.simplicitytools.hook.app.android +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookBefore import com.lt2333.simplicitytools.util.XSPUtils -import com.lt2333.simplicitytools.util.hookBeforeMethod import com.lt2333.simplicitytools.util.xposed.base.HookRegister object SystemPropertiesHook : HookRegister() { @@ -9,16 +10,12 @@ object SystemPropertiesHook : HookRegister() { val mediaStepsSwitch = XSPUtils.getBoolean("media_volume_steps_switch", false) val mediaSteps = XSPUtils.getInt("media_volume_steps", 15) - "android.os.SystemProperties".hookBeforeMethod( - getDefaultClassLoader(), - "getInt", - String::class.java, - Int::class.java - ) { + findMethod("android.os.SystemProperties") { + name == "getInt" && returnType == Int::class.java + }.hookBefore { when (it.args[0] as String) { "ro.config.media_vol_steps" -> if (mediaStepsSwitch) it.result = mediaSteps } } - } } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/miuihome/DoubleTapToSleep.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/miuihome/DoubleTapToSleep.kt index fa05e7b8..3c2cdcc0 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/miuihome/DoubleTapToSleep.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/miuihome/DoubleTapToSleep.kt @@ -3,52 +3,48 @@ package com.lt2333.simplicitytools.hook.app.miuihome import android.content.Context import android.content.Intent import android.view.MotionEvent +import com.github.kyuubiran.ezxhelper.utils.* import com.lt2333.simplicitytools.util.* import com.lt2333.simplicitytools.util.xposed.base.HookRegister import com.yuk.miuihome.module.DoubleTapController import de.robv.android.xposed.XposedHelpers object DoubleTapToSleep : HookRegister() { - - override fun init() { - hasEnable("double_tap_to_sleep") { - "com.miui.home.launcher.Workspace".findClass(getDefaultClassLoader()) - .hookAfterAllConstructors { - var mDoubleTapControllerEx = - XposedHelpers.getAdditionalInstanceField( - it.thisObject, - "mDoubleTapControllerEx" - ) - if (mDoubleTapControllerEx != null) return@hookAfterAllConstructors - mDoubleTapControllerEx = DoubleTapController((it.args[0] as Context)) - XposedHelpers.setAdditionalInstanceField( - it.thisObject, - "mDoubleTapControllerEx", - mDoubleTapControllerEx - ) - } - - "com.miui.home.launcher.Workspace".findClass(getDefaultClassLoader()).hookBeforeMethod( - "dispatchTouchEvent", MotionEvent::class.java - ) { - val mDoubleTapControllerEx = XposedHelpers.getAdditionalInstanceField( + override fun init() = hasEnable("double_tap_to_sleep") { + hookAllConstructorAfter("com.miui.home.launcher.Workspace") { + var mDoubleTapControllerEx = + XposedHelpers.getAdditionalInstanceField( it.thisObject, "mDoubleTapControllerEx" - ) as DoubleTapController - if (!mDoubleTapControllerEx.isDoubleTapEvent(it.args[0] as MotionEvent)) return@hookBeforeMethod - val mCurrentScreenIndex = it.thisObject.getIntField("mCurrentScreenIndex") - val cellLayout = it.thisObject.callMethod("getCellLayout", mCurrentScreenIndex) - if (cellLayout != null) if (cellLayout.callMethod("lastDownOnOccupiedCell") as Boolean) return@hookBeforeMethod - if (it.thisObject.callMethod("isInNormalEditingMode") as Boolean) return@hookBeforeMethod - val context = it.thisObject.callMethod("getContext") as Context - context.sendBroadcast( - Intent("com.miui.app.ExtraStatusBarManager.action_TRIGGER_TOGGLE").putExtra( - "com.miui.app.ExtraStatusBarManager.extra_TOGGLE_ID", - 10 - ) ) - } + if (mDoubleTapControllerEx != null) return@hookAllConstructorAfter + mDoubleTapControllerEx = DoubleTapController((it.args[0] as Context)) + XposedHelpers.setAdditionalInstanceField( + it.thisObject, + "mDoubleTapControllerEx", + mDoubleTapControllerEx + ) + } + + findMethod("com.miui.home.launcher.Workspace") { + name == "dispatchTouchEvent" && parameterTypes[0] == MotionEvent::class.java + }.hookBefore { + val mDoubleTapControllerEx = XposedHelpers.getAdditionalInstanceField( + it.thisObject, + "mDoubleTapControllerEx" + ) as DoubleTapController + if (!mDoubleTapControllerEx.isDoubleTapEvent(it.args[0] as MotionEvent)) return@hookBefore + val mCurrentScreenIndex = it.thisObject.getObject("mCurrentScreenIndex") as Int + val cellLayout = it.thisObject.invokeMethodAuto("getCellLayout", mCurrentScreenIndex) + if (cellLayout != null) if (cellLayout.invokeMethodAuto("lastDownOnOccupiedCell") as Boolean) return@hookBefore + if (it.thisObject.invokeMethodAuto("isInNormalEditingMode") as Boolean) return@hookBefore + val context = it.thisObject.invokeMethodAuto("getContext") as Context + context.sendBroadcast( + Intent("com.miui.app.ExtraStatusBarManager.action_TRIGGER_TOGGLE").putExtra( + "com.miui.app.ExtraStatusBarManager.extra_TOGGLE_ID", + 10 + ) + ) } } - } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/securitycenter/LockOneHundred.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/securitycenter/LockOneHundred.kt index 0d99b6d3..e6efac26 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/securitycenter/LockOneHundred.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/securitycenter/LockOneHundred.kt @@ -1,29 +1,29 @@ package com.lt2333.simplicitytools.hook.app.securitycenter import android.view.View -import com.lt2333.simplicitytools.util.XSPUtils -import com.lt2333.simplicitytools.util.findClass -import com.lt2333.simplicitytools.util.hookBeforeMethod +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookBefore +import com.lt2333.simplicitytools.util.hasEnable import com.lt2333.simplicitytools.util.xposed.base.HookRegister object LockOneHundred : HookRegister() { - override fun init() { //防止点击重新检测 - val mainContentFrameClass = "com.miui.securityscan.ui.main.MainContentFrame".findClass(getDefaultClassLoader()) - mainContentFrameClass.hookBeforeMethod("onClick", View::class.java) { - if (XSPUtils.getBoolean("lock_one_hundred", false)) { + findMethod("com.miui.securityscan.ui.main.MainContentFrame") { + name == "onClick" && parameterTypes[0] == View::class.java + }.hookBefore { + hasEnable("lock_one_hundred") { it.result = null } } //锁定100分 - val scoreManagerClass = "com.miui.securityscan.scanner.ScoreManager".findClass(getDefaultClassLoader()) - scoreManagerClass.hookBeforeMethod("B") { - if (XSPUtils.getBoolean("lock_one_hundred", false)) { + findMethod("com.miui.securityscan.scanner.ScoreManager") { + name == "B" + }.hookBefore { + hasEnable("lock_one_hundred") { it.result = 0 } } } - } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/securitycenter/RemoveOpenAppConfirmationPopup.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/securitycenter/RemoveOpenAppConfirmationPopup.kt index dc93aee7..306bee39 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/securitycenter/RemoveOpenAppConfirmationPopup.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/securitycenter/RemoveOpenAppConfirmationPopup.kt @@ -1,22 +1,17 @@ package com.lt2333.simplicitytools.hook.app.securitycenter import android.widget.TextView -import com.lt2333.simplicitytools.util.XSPUtils -import com.lt2333.simplicitytools.util.findClass -import com.lt2333.simplicitytools.util.hookAfterMethod +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookAfter +import com.lt2333.simplicitytools.util.hasEnable import com.lt2333.simplicitytools.util.xposed.base.HookRegister -import de.robv.android.xposed.IXposedHookLoadPackage -import de.robv.android.xposed.callbacks.XC_LoadPackage object RemoveOpenAppConfirmationPopup : HookRegister() { - override fun init() { - val textViewClass = "android.widget.TextView".findClass(getDefaultClassLoader()) - textViewClass.hookAfterMethod( - "setText", - CharSequence::class.java - ) { - if (XSPUtils.getBoolean("remove_open_app_confirmation_popup", false)) { + findMethod("android.widget.TextView") { + name == "setText" && parameterTypes[0] == CharSequence::class.java + }.hookAfter { + hasEnable("remove_open_app_confirmation_popup") { val textView = it.thisObject as TextView if (it.args.isNotEmpty() && it.args[0]?.toString().equals( textView.context.resources.getString( @@ -33,5 +28,4 @@ object RemoveOpenAppConfirmationPopup : HookRegister() { } } } - } diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/securitycenter/ShowBatteryTemperature.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/securitycenter/ShowBatteryTemperature.kt index 4fc5d258..e0cf7b58 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/securitycenter/ShowBatteryTemperature.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/securitycenter/ShowBatteryTemperature.kt @@ -13,14 +13,15 @@ import android.view.View import android.widget.LinearLayout import android.widget.TextView import cn.fkj233.ui.activity.dp2px -import com.lt2333.simplicitytools.util.XSPUtils -import com.lt2333.simplicitytools.util.findClass -import com.lt2333.simplicitytools.util.hookAfterMethod -import com.lt2333.simplicitytools.util.hookBeforeMethod +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookAfter +import com.github.kyuubiran.ezxhelper.utils.hookBefore +import com.github.kyuubiran.ezxhelper.utils.loadClass +import com.lt2333.simplicitytools.util.* import com.lt2333.simplicitytools.util.xposed.base.HookRegister import java.lang.reflect.Field -object ShowBatteryTemperature: HookRegister() { +object ShowBatteryTemperature : HookRegister() { private fun getBatteryTemperature(context: Context): Int { return context.registerReceiver( @@ -29,17 +30,26 @@ object ShowBatteryTemperature: HookRegister() { )!!.getIntExtra("temperature", 0) / 10 } - override fun init() { - if (!XSPUtils.getBoolean("battery_life_function", false)) return - val a = "com.miui.powercenter.a\$a".findClass(getDefaultClassLoader()) - "com.miui.powercenter.a".hookBeforeMethod(getDefaultClassLoader(), "b", Context::class.java) { + override fun init() = hasEnable("battery_life_function") { + findMethod("com.miui.powercenter.a") { + name == "b" && parameterTypes[0] == Context::class.java + }.hookBefore { it.result = getBatteryTemperature(it.args[0] as Context).toString() + } - a.hookAfterMethod("run") { + + findMethod("com.miui.powercenter.a\$a") { + name == "run" + }.hookAfter { val context = AndroidAppHelper.currentApplication().applicationContext - val isDarkMode = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES - val currentTemperatureValue = context.resources.getIdentifier("current_temperature_value", "id", "com.miui.securitycenter") - val field = a.getDeclaredField("a") as Field + val isDarkMode = + context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES + val currentTemperatureValue = context.resources.getIdentifier( + "current_temperature_value", + "id", + "com.miui.securitycenter" + ) + val field = loadClass("com.miui.powercenter.a\$a").getDeclaredField("a") as Field field.isAccessible = true val view = field.get(it.thisObject) as View val textView = view.findViewById(currentTemperatureValue) @@ -52,18 +62,25 @@ object ShowBatteryTemperature: HookRegister() { textView.height = dp2px(context, 49.099983f) textView.textAlignment = View.TEXT_ALIGNMENT_VIEW_START val tempView = TextView(context) - tempView.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, dp2px(context, 49.099983f)) - (tempView.layoutParams as LinearLayout.LayoutParams).marginStart = dp2px(context, 3.599976f) + tempView.layoutParams = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + dp2px(context, 49.099983f) + ) + (tempView.layoutParams as LinearLayout.LayoutParams).marginStart = + dp2px(context, 3.599976f) tempView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13.099977f) tempView.setTextColor(Color.parseColor(if (isDarkMode) "#e6e6e6" else "#333333")) tempView.setPadding(0, dp2px(context, 25f), 0, 0) tempView.text = "℃" tempView.typeface = Typeface.create(null, 500, false) tempView.textAlignment = View.TEXT_ALIGNMENT_VIEW_START - val tempeValueContainer = context.resources.getIdentifier("tempe_value_container", "id", "com.miui.securitycenter") + val tempeValueContainer = context.resources.getIdentifier( + "tempe_value_container", + "id", + "com.miui.securitycenter" + ) val linearLayout = view.findViewById(tempeValueContainer) linearLayout.addView(tempView) } } - } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/securitycenter/SkipWaitingTime.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/securitycenter/SkipWaitingTime.kt index d931b42b..04b94318 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/securitycenter/SkipWaitingTime.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/securitycenter/SkipWaitingTime.kt @@ -1,23 +1,16 @@ package com.lt2333.simplicitytools.hook.app.securitycenter -import android.widget.TextView -import com.lt2333.simplicitytools.util.XSPUtils -import com.lt2333.simplicitytools.util.findClass -import com.lt2333.simplicitytools.util.hookBeforeMethod +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookBefore +import com.lt2333.simplicitytools.util.hasEnable import com.lt2333.simplicitytools.util.xposed.base.HookRegister object SkipWaitingTime : HookRegister() { - override fun init() { - val textViewClass = "android.widget.TextView".findClass(getDefaultClassLoader()) - textViewClass.hookBeforeMethod( - "setText", - CharSequence::class.java, - TextView.BufferType::class.java, - Boolean::class.java, - Int::class.java - ) { - if (XSPUtils.getBoolean("skip_waiting_time", false)) { + findMethod("android.widget.TextView") { + name == "setText" && parameterCount == 4 + }.hookBefore { + hasEnable("skip_waiting_time") { if (it.args.isNotEmpty() && it.args[0]?.toString()?.startsWith("确定(") == true ) { it.args[0] = "确定" @@ -25,14 +18,12 @@ object SkipWaitingTime : HookRegister() { } } - textViewClass.hookBeforeMethod( - "setEnabled", - Boolean::class.java - ) { - if (XSPUtils.getBoolean("skip_waiting_time", false)) { + findMethod("android.widget.TextView") { + name == "setEnabled" && parameterTypes[0] == Boolean::class.java + }.hookBefore { + hasEnable("skip_waiting_time") { it.args[0] = true } } } - } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/settings/ShowNotificationImportance.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/settings/ShowNotificationImportance.kt index 02d96a21..700822a8 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/settings/ShowNotificationImportance.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/settings/ShowNotificationImportance.kt @@ -1,6 +1,7 @@ package com.lt2333.simplicitytools.hook.app.settings import android.app.NotificationChannel +import com.github.kyuubiran.ezxhelper.utils.* import com.lt2333.simplicitytools.util.* import com.lt2333.simplicitytools.util.xposed.base.HookRegister import de.robv.android.xposed.XposedHelpers @@ -8,27 +9,29 @@ import de.robv.android.xposed.XposedHelpers object ShowNotificationImportance : HookRegister() { override fun init() { - val channelNotificationSettingsClass = "com.android.settings.notification.ChannelNotificationSettings".findClass(getDefaultClassLoader()) - channelNotificationSettingsClass.hookBeforeMethod("removeDefaultPrefs") { - if (!XSPUtils.getBoolean("show_notification_importance", false)) return@hookBeforeMethod - val importance = it.thisObject.callMethod("findPreference", "importance") ?: return@hookBeforeMethod - val mChannel = it.thisObject.getObjectField("mChannel") as NotificationChannel - val index = importance.callMethod("findSpinnerIndexOfValue", mChannel.importance.toString()) as Int - if (index < 0) return@hookBeforeMethod - importance.callMethod("setValueIndex", index) + findMethod("com.android.settings.notification.ChannelNotificationSettings"){ + name == "removeDefaultPrefs" + }.hookBefore { + if (!XSPUtils.getBoolean("show_notification_importance", false)) return@hookBefore + val importance = it.thisObject.invokeMethodAuto("findPreference", "importance") ?: return@hookBefore + val mChannel = it.thisObject.getObject("mChannel") as NotificationChannel + val index = importance.invokeMethodAuto("findSpinnerIndexOfValue", mChannel.importance.toString()) as Int + if (index < 0) return@hookBefore + importance.invokeMethodAuto("setValueIndex", index) XposedHelpers.setAdditionalInstanceField(importance, "channelNotificationSettings", it.thisObject) it.result = null } - val dropDownPreferenceClass = XposedHelpers.findClass("androidx.preference.Preference", getDefaultClassLoader()) - dropDownPreferenceClass.hookAfterMethod("callChangeListener", Any::class.java) { - val channelNotificationSettings = XposedHelpers.getAdditionalInstanceField(it.thisObject, "channelNotificationSettings") ?: return@hookAfterMethod - val mChannel = channelNotificationSettings.getObjectField("mChannel") as NotificationChannel - mChannel.callMethod("setImportance", (it.args[0] as String).toInt()) - val mBackend = channelNotificationSettings.getObjectField("mBackend") ?: return@hookAfterMethod - val mPkg = channelNotificationSettings.getObjectField("mPkg") as String - val mUid = channelNotificationSettings.getIntField("mUid") - mBackend.callMethod("updateChannel", mPkg, mUid, mChannel) + findMethod("androidx.preference.Preference"){ + name == "callChangeListener" && parameterTypes[0]==Any::class.java + }.hookAfter { + val channelNotificationSettings = XposedHelpers.getAdditionalInstanceField(it.thisObject, "channelNotificationSettings") ?: return@hookAfter + val mChannel = channelNotificationSettings.getObject("mChannel") as NotificationChannel + mChannel.invokeMethodAuto("setImportance", (it.args[0] as String).toInt()) + val mBackend = channelNotificationSettings.getObjectOrNull("mBackend") ?: return@hookAfter + val mPkg = channelNotificationSettings.getObject("mPkg") as String + val mUid = channelNotificationSettings.getObject("mUid") as Int + mBackend.invokeMethodAuto("updateChannel", mPkg, mUid, mChannel) } } diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/BatteryPercentage.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/BatteryPercentage.kt index 0c6ec2e3..ee6cb1a3 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/BatteryPercentage.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/BatteryPercentage.kt @@ -2,24 +2,22 @@ package com.lt2333.simplicitytools.hook.app.systemui import android.util.TypedValue import android.widget.TextView +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.getObject +import com.github.kyuubiran.ezxhelper.utils.hookAfter import com.lt2333.simplicitytools.util.XSPUtils -import com.lt2333.simplicitytools.util.getObjectField -import com.lt2333.simplicitytools.util.hookAfterMethod import com.lt2333.simplicitytools.util.xposed.base.HookRegister -object BatteryPercentage: HookRegister() { - +object BatteryPercentage : HookRegister() { override fun init() { val size = XSPUtils.getFloat("battery_percentage_font_size", 0f) if (size == 0f) return - "com.android.systemui.statusbar.views.MiuiBatteryMeterView".hookAfterMethod( - getDefaultClassLoader(), - "updateResources" - ) { - (it.thisObject.getObjectField("mBatteryPercentView") as TextView).setTextSize( + findMethod("com.android.systemui.statusbar.views.MiuiBatteryMeterView") { + name == "updateResources" + }.hookAfter { + (it.thisObject.getObject("mBatteryPercentView") as TextView).setTextSize( TypedValue.COMPLEX_UNIT_DIP, size ) } } - } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/ControlCenterWeather.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/ControlCenterWeather.kt index 2740bb20..9c76d117 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/ControlCenterWeather.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/ControlCenterWeather.kt @@ -9,216 +9,212 @@ import android.widget.TextView import android.widget.Toast import androidx.constraintlayout.widget.ConstraintLayout import cn.fkj233.ui.activity.dp2px -import com.github.kyuubiran.ezxhelper.utils.loadClass -import com.lt2333.simplicitytools.util.* +import com.github.kyuubiran.ezxhelper.utils.* +import com.lt2333.simplicitytools.util.SystemProperties +import com.lt2333.simplicitytools.util.XSPUtils +import com.lt2333.simplicitytools.util.hasEnable import com.lt2333.simplicitytools.util.xposed.base.HookRegister import com.lt2333.simplicitytools.view.WeatherView -object ControlCenterWeather: HookRegister() { +object ControlCenterWeather : HookRegister() { + override fun init() = hasEnable("control_center_weather") { + var mWeatherView: TextView? = null + var mConstraintLayout: ConstraintLayout? = null + val isDisplayCity = XSPUtils.getBoolean("control_center_weather_city", false) + findMethod("com.android.systemui.controlcenter.phone.widget.QSControlCenterHeaderView") { + name == "onFinishInflate" + }.hookAfter { + val viewGroup = it.thisObject as ViewGroup + val context = viewGroup.context - override fun init() { - hasEnable("control_center_weather") { - var mWeatherView: TextView? = null - var mConstraintLayout: ConstraintLayout? = null - val isDisplayCity = XSPUtils.getBoolean("control_center_weather_city", false) - "com.android.systemui.controlcenter.phone.widget.QSControlCenterHeaderView".hookAfterMethod( - getDefaultClassLoader(), - "onFinishInflate" + // MIUI编译时间大于 2022-03-12 00:00:00 且为内测版 + if (SystemProperties.get(context, "ro.build.date.utc")!! + .toInt() >= 1647014400 && + + !SystemProperties.get( + context, + "ro.build.version.incremental" + )!!.endsWith("DEV") && + + !SystemProperties.get( + context, + "ro.build.version.incremental" + )!!.endsWith("XM") ) { - val viewGroup = it.thisObject as ViewGroup - val context = viewGroup.context + //获取原组件 + val big_time_ID = + context.resources.getIdentifier("big_time", "id", context.packageName) + val big_time: TextView = viewGroup.findViewById(big_time_ID) - // MIUI编译时间大于 2022-03-12 00:00:00 且为内测版 - if (SystemProperties.get(context, "ro.build.date.utc")!! - .toInt() >= 1647014400 && + val date_time_ID = + context.resources.getIdentifier("date_time", "id", context.packageName) + val date_time: TextView = viewGroup.findViewById(date_time_ID) - !SystemProperties.get( - context, - "ro.build.version.incremental" - )!!.endsWith("DEV") && - - !SystemProperties.get( - context, - "ro.build.version.incremental" - )!!.endsWith("XM") - ) { - //获取原组件 - val big_time_ID = - context.resources.getIdentifier("big_time", "id", context.packageName) - val big_time: TextView = viewGroup.findViewById(big_time_ID) - - val date_time_ID = - context.resources.getIdentifier("date_time", "id", context.packageName) - val date_time: TextView = viewGroup.findViewById(date_time_ID) - - //创建新布局 - val mConstraintLayoutLp = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, - LinearLayout.LayoutParams.WRAP_CONTENT - ).also { - it.topMargin = context.resources.getDimensionPixelSize( - context.resources.getIdentifier( - "qs_control_header_tiles_margin_top", - "dimen", - context.packageName - ) + //创建新布局 + val mConstraintLayoutLp = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ).also { + it.topMargin = context.resources.getDimensionPixelSize( + context.resources.getIdentifier( + "qs_control_header_tiles_margin_top", + "dimen", + context.packageName ) - } - - mConstraintLayout = - ConstraintLayout(context).also { it.layoutParams = mConstraintLayoutLp } - - (big_time.parent as ViewGroup).addView(mConstraintLayout, 0) - - - //从原布局中删除组件 - (big_time.parent as ViewGroup).removeView(big_time) - (date_time.parent as ViewGroup).removeView(date_time) - - - //添加组件至新布局 - mConstraintLayout!!.addView(big_time) - mConstraintLayout!!.addView(date_time) - - //组件属性 - - val date_time_LP = ConstraintLayout.LayoutParams( - ConstraintLayout.LayoutParams.WRAP_CONTENT, - ConstraintLayout.LayoutParams.WRAP_CONTENT - ).also { - it.startToEnd = big_time_ID - it.bottomToBottom = 0 - it.marginStart = context.resources.getDimensionPixelSize( - context.resources.getIdentifier( - "notification_panel_time_date_space", - "dimen", - context.packageName - ) - ) - it.bottomMargin = dp2px(context, 5f) - } - date_time.layoutParams = date_time_LP - - - //创建天气组件 - mWeatherView = WeatherView(context, isDisplayCity).apply { - setTextAppearance( - context.resources.getIdentifier( - "TextAppearance.QSControl.Date", - "style", - context.packageName - ) - ) - - } - mConstraintLayout!!.addView(mWeatherView) - - val mWeatherView_LP = ConstraintLayout.LayoutParams( - ConstraintLayout.LayoutParams.WRAP_CONTENT, - ConstraintLayout.LayoutParams.WRAP_CONTENT - ).also { - it.startToEnd = big_time_ID - it.bottomToTop = date_time_ID - it.marginStart = context.resources.getDimensionPixelSize( - context.resources.getIdentifier( - "notification_panel_time_date_space", - "dimen", - context.packageName - ) - ) - } - - (mWeatherView as WeatherView).layoutParams = mWeatherView_LP - - } else { - val layoutParam = - loadClass("androidx.constraintlayout.widget.ConstraintLayout\$LayoutParams").getConstructor( - Int::class.java, - Int::class.java - ).newInstance( - ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.WRAP_CONTENT - ) as ViewGroup.MarginLayoutParams - layoutParam.setObjectField( - "bottomToTop", - context.resources.getIdentifier("date_time", "id", context.packageName) ) - layoutParam.setObjectField( - "startToEnd", - context.resources.getIdentifier("big_time", "id", context.packageName) - ) - layoutParam.marginStart = context.resources.getDimensionPixelSize( + } + + mConstraintLayout = + ConstraintLayout(context).also { it.layoutParams = mConstraintLayoutLp } + + (big_time.parent as ViewGroup).addView(mConstraintLayout, 0) + + + //从原布局中删除组件 + (big_time.parent as ViewGroup).removeView(big_time) + (date_time.parent as ViewGroup).removeView(date_time) + + + //添加组件至新布局 + mConstraintLayout!!.addView(big_time) + mConstraintLayout!!.addView(date_time) + + //组件属性 + + val date_time_LP = ConstraintLayout.LayoutParams( + ConstraintLayout.LayoutParams.WRAP_CONTENT, + ConstraintLayout.LayoutParams.WRAP_CONTENT + ).also { + it.startToEnd = big_time_ID + it.bottomToBottom = 0 + it.marginStart = context.resources.getDimensionPixelSize( context.resources.getIdentifier( "notification_panel_time_date_space", "dimen", context.packageName ) ) - mWeatherView = WeatherView(context, isDisplayCity).apply { - setTextAppearance( - context.resources.getIdentifier( - "TextAppearance.QSControl.Date", - "style", - context.packageName - ) + it.bottomMargin = dp2px(context, 5f) + } + date_time.layoutParams = date_time_LP + + + //创建天气组件 + mWeatherView = WeatherView(context, isDisplayCity).apply { + setTextAppearance( + context.resources.getIdentifier( + "TextAppearance.QSControl.Date", + "style", + context.packageName ) - layoutParams = layoutParam - } - viewGroup.addView(mWeatherView) + ) + + } + mConstraintLayout!!.addView(mWeatherView) + + val mWeatherView_LP = ConstraintLayout.LayoutParams( + ConstraintLayout.LayoutParams.WRAP_CONTENT, + ConstraintLayout.LayoutParams.WRAP_CONTENT + ).also { + it.startToEnd = big_time_ID + it.bottomToTop = date_time_ID + it.marginStart = context.resources.getDimensionPixelSize( + context.resources.getIdentifier( + "notification_panel_time_date_space", + "dimen", + context.packageName + ) + ) } - (mWeatherView as WeatherView).setOnClickListener { - try { - val intent = Intent().apply { - flags = Intent.FLAG_ACTIVITY_NEW_TASK - component = ComponentName( - "com.miui.weather2", - "com.miui.weather2.ActivityWeatherMain" - ) - } - context.startActivity(intent) - } catch (e: Exception) { - Toast.makeText(context, "启动失败", Toast.LENGTH_LONG).show() - } - } + (mWeatherView as WeatherView).layoutParams = mWeatherView_LP + } else { + val layoutParam = + loadClass("androidx.constraintlayout.widget.ConstraintLayout\$LayoutParams").getConstructor( + Int::class.java, + Int::class.java + ).newInstance( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) as ViewGroup.MarginLayoutParams + layoutParam.putObject( + "bottomToTop", + context.resources.getIdentifier("date_time", "id", context.packageName) + ) + layoutParam.putObject( + "startToEnd", + context.resources.getIdentifier("big_time", "id", context.packageName) + ) + layoutParam.marginStart = context.resources.getDimensionPixelSize( + context.resources.getIdentifier( + "notification_panel_time_date_space", + "dimen", + context.packageName + ) + ) + mWeatherView = WeatherView(context, isDisplayCity).apply { + setTextAppearance( + context.resources.getIdentifier( + "TextAppearance.QSControl.Date", + "style", + context.packageName + ) + ) + layoutParams = layoutParam + } + viewGroup.addView(mWeatherView) } - //解决横屏重叠 - "com.android.systemui.controlcenter.phone.widget.QSControlCenterHeaderView".hookAfterMethod( - getDefaultClassLoader(), - "updateLayout" + + (mWeatherView as WeatherView).setOnClickListener { + try { + val intent = Intent().apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK + component = ComponentName( + "com.miui.weather2", + "com.miui.weather2.ActivityWeatherMain" + ) + } + context.startActivity(intent) + } catch (e: Exception) { + Toast.makeText(context, "启动失败", Toast.LENGTH_LONG).show() + } + } + } + + //解决横屏重叠 + findMethod("com.android.systemui.controlcenter.phone.widget.QSControlCenterHeaderView") { + name == "updateLayout" + }.hookAfter { + val viewGroup = it.thisObject as ViewGroup + val context = viewGroup.context + val mOrientation = viewGroup.getObject("mOrientation") as Int + // MIUI编译时间大于 2022-03-12 00:00:00 且为内测版 + if (SystemProperties.get(context, "ro.build.date.utc")!! + .toInt() >= 1647014400 && + + !SystemProperties.get( + context, + "ro.build.version.incremental" + )!!.endsWith("DEV") && + + !SystemProperties.get( + context, + "ro.build.version.incremental" + )!!.endsWith("XM") ) { - val viewGroup = it.thisObject as ViewGroup - val context = viewGroup.context - val mOrientation = viewGroup.getObjectField("mOrientation") as Int - // MIUI编译时间大于 2022-03-12 00:00:00 且为内测版 - if (SystemProperties.get(context, "ro.build.date.utc")!! - .toInt() >= 1647014400 && - - !SystemProperties.get( - context, - "ro.build.version.incremental" - )!!.endsWith("DEV") && - - !SystemProperties.get( - context, - "ro.build.version.incremental" - )!!.endsWith("XM") - ) { - if (mOrientation == 1) { - mConstraintLayout!!.visibility = View.VISIBLE - } else { - mConstraintLayout!!.visibility = View.GONE - } + if (mOrientation == 1) { + mConstraintLayout!!.visibility = View.VISIBLE } else { - if (mOrientation == 1) { - mWeatherView!!.visibility = View.VISIBLE - } else { - mWeatherView!!.visibility = View.GONE - } + mConstraintLayout!!.visibility = View.GONE + } + } else { + if (mOrientation == 1) { + mWeatherView!!.visibility = View.VISIBLE + } else { + mWeatherView!!.visibility = View.GONE } } } } - } diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/CustomMobileTypeText.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/CustomMobileTypeText.kt index 78ff6708..432bf84b 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/CustomMobileTypeText.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/CustomMobileTypeText.kt @@ -1,22 +1,17 @@ package com.lt2333.simplicitytools.hook.app.systemui +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookAfter import com.lt2333.simplicitytools.util.XSPUtils import com.lt2333.simplicitytools.util.hasEnable -import com.lt2333.simplicitytools.util.hookAfterMethod -import com.lt2333.simplicitytools.util.hookBeforeMethod import com.lt2333.simplicitytools.util.xposed.base.HookRegister object CustomMobileTypeText : HookRegister() { - - override fun init() { - hasEnable("custom_mobile_type_text_switch") { - "com.android.systemui.statusbar.policy.MobileSignalController".hookAfterMethod( - getDefaultClassLoader(), - "getMobileTypeName", - Int::class.java - ) { - it.result = XSPUtils.getString("custom_mobile_type_text","5G") - } + override fun init() = hasEnable("custom_mobile_type_text_switch") { + findMethod("com.android.systemui.statusbar.policy.MobileSignalController") { + name == "getMobileTypeName" && parameterTypes[0] == Int::class.java + }.hookAfter { + it.result = XSPUtils.getString("custom_mobile_type_text", "5G") } } } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/DoubleLineNetworkSpeed.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/DoubleLineNetworkSpeed.kt index a715165d..e22e8f19 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/DoubleLineNetworkSpeed.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/DoubleLineNetworkSpeed.kt @@ -2,17 +2,21 @@ package com.lt2333.simplicitytools.hook.app.systemui import android.content.Context import android.net.TrafficStats -import android.util.AttributeSet import android.util.TypedValue import android.view.Gravity import android.widget.TextView import com.github.kyuubiran.ezxhelper.init.InitFields +import com.github.kyuubiran.ezxhelper.utils.findConstructor +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookAfter +import com.github.kyuubiran.ezxhelper.utils.hookBefore import com.lt2333.simplicitytools.R -import com.lt2333.simplicitytools.util.* +import com.lt2333.simplicitytools.util.XSPUtils +import com.lt2333.simplicitytools.util.hasEnable import com.lt2333.simplicitytools.util.xposed.base.HookRegister import java.text.DecimalFormat -object DoubleLineNetworkSpeed: HookRegister() { +object DoubleLineNetworkSpeed : HookRegister() { private var mLastTotalUp: Long = 0 private var mLastTotalDown: Long = 0 @@ -26,7 +30,7 @@ object DoubleLineNetworkSpeed: HookRegister() { private val getDualSize = XSPUtils.getInt("status_bar_network_speed_dual_row_size", 0) private val getDualAlign = XSPUtils.getInt("status_bar_network_speed_dual_row_gravity", 0) - override fun init() { + override fun init() = hasEnable("status_bar_dual_row_network_speed") { val none = InitFields.moduleRes.getString(R.string.none) @@ -37,43 +41,47 @@ object DoubleLineNetworkSpeed: HookRegister() { ?.lastOrNull().toString() } - hasEnable("status_bar_dual_row_network_speed") { - "com.android.systemui.statusbar.views.NetworkSpeedView".findClass(getDefaultClassLoader()) - .hookAfterConstructor(Context::class.java, AttributeSet::class.java) { - val mView = it.thisObject as TextView - mView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 7f) - if (getDualSize != 0) { - mView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, getDualSize.toFloat()) - } - mView.isSingleLine = false - mView.setLineSpacing(0F, 0.8F) - if (getDualAlign == 0) { - mView.gravity = Gravity.LEFT or Gravity.CENTER_VERTICAL - } else { - mView.gravity = Gravity.RIGHT or Gravity.CENTER_VERTICAL - } - } + findConstructor("com.android.systemui.statusbar.views.NetworkSpeedView") { + parameterCount == 2 + }.hookAfter { + val mView = it.thisObject as TextView + mView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 7f) + if (getDualSize != 0) { + mView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, getDualSize.toFloat()) + } + mView.isSingleLine = false + mView.setLineSpacing(0F, 0.8F) + if (getDualAlign == 0) { + mView.gravity = Gravity.LEFT or Gravity.CENTER_VERTICAL + } else { + mView.gravity = Gravity.RIGHT or Gravity.CENTER_VERTICAL + } + } - "com.android.systemui.statusbar.policy.NetworkSpeedController".hookBeforeMethod( - getDefaultClassLoader(), - "formatSpeed", - Context::class.java, - Long::class.java - ) { - if (getDualAlign == 0) { - it.result = - "$upIcon ${getTotalUpSpeed(it.args[0]as Context)}\n${downIcon} ${getTotalDownloadSpeed(it.args[0]as Context)}" - } else { - it.result = - "${getTotalUpSpeed(it.args[0]as Context)} ${upIcon}\n${getTotalDownloadSpeed(it.args[0]as Context)} $downIcon" - } + findMethod("com.android.systemui.statusbar.policy.NetworkSpeedController") { + name == "formatSpeed" && parameterCount == 2 + }.hookBefore { + if (getDualAlign == 0) { + it.result = + "$upIcon ${getTotalUpSpeed(it.args[0] as Context)}\n${downIcon} ${ + getTotalDownloadSpeed( + it.args[0] as Context + ) + }" + } else { + it.result = + "${getTotalUpSpeed(it.args[0] as Context)} ${upIcon}\n${ + getTotalDownloadSpeed( + it.args[0] as Context + ) + } $downIcon" } } } //获取总的上行速度 private fun getTotalUpSpeed(context: Context): String { - var totalUpSpeed = 0F + var totalUpSpeed: Float val currentTotalTxBytes = TrafficStats.getTotalTxBytes() val nowTimeStampTotalUp = System.currentTimeMillis() @@ -81,16 +89,28 @@ object DoubleLineNetworkSpeed: HookRegister() { //计算上传速度 val bytes = (currentTotalTxBytes - mLastTotalUp) * 1000 / (nowTimeStampTotalUp - lastTimeStampTotalUp).toFloat() - var unit = "" + var unit: String if (bytes >= 1048576) { totalUpSpeed = DecimalFormat("0.0").format(bytes / 1048576).toFloat() - unit = context.resources.getString(context.resources.getIdentifier("megabyte_per_second","string",context.packageName)) + unit = context.resources.getString( + context.resources.getIdentifier( + "megabyte_per_second", + "string", + context.packageName + ) + ) } else { totalUpSpeed = DecimalFormat("0.0").format(bytes / 1024).toFloat() - unit = context.resources.getString(context.resources.getIdentifier("kilobyte_per_second","string",context.packageName)) + unit = context.resources.getString( + context.resources.getIdentifier( + "kilobyte_per_second", + "string", + context.packageName + ) + ) } //保存当前的流量总和和上次的时间戳 @@ -106,7 +126,7 @@ object DoubleLineNetworkSpeed: HookRegister() { //获取总的下行速度 private fun getTotalDownloadSpeed(context: Context): String { - var totalDownSpeed = 0F + var totalDownSpeed: Float val currentTotalRxBytes = TrafficStats.getTotalRxBytes() val nowTimeStampTotalDown = System.currentTimeMillis() @@ -114,16 +134,28 @@ object DoubleLineNetworkSpeed: HookRegister() { val bytes = (currentTotalRxBytes - mLastTotalDown) * 1000 / (nowTimeStampTotalDown - lastTimeStampTotalDown).toFloat() - var unit = "" + var unit: String if (bytes >= 1048576) { totalDownSpeed = DecimalFormat("0.0").format(bytes / 1048576).toFloat() - unit = context.resources.getString(context.resources.getIdentifier("megabyte_per_second","string",context.packageName)) + unit = context.resources.getString( + context.resources.getIdentifier( + "megabyte_per_second", + "string", + context.packageName + ) + ) } else { totalDownSpeed = DecimalFormat("0.0").format(bytes / 1024).toFloat() - unit = context.resources.getString(context.resources.getIdentifier("kilobyte_per_second","string",context.packageName)) + unit = context.resources.getString( + context.resources.getIdentifier( + "kilobyte_per_second", + "string", + context.packageName + ) + ) } //保存当前的流量总和和上次的时间戳 mLastTotalDown = currentTotalRxBytes diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideBatteryIcon.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideBatteryIcon.kt index 237bb75a..8b05463c 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideBatteryIcon.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideBatteryIcon.kt @@ -4,42 +4,46 @@ import android.view.View import android.widget.FrameLayout import android.widget.ImageView import android.widget.TextView -import com.lt2333.simplicitytools.util.getObjectField +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.getObject +import com.github.kyuubiran.ezxhelper.utils.hookAfter import com.lt2333.simplicitytools.util.hasEnable -import com.lt2333.simplicitytools.util.hookAfterMethod import com.lt2333.simplicitytools.util.xposed.base.HookRegister object HideBatteryIcon : HookRegister() { override fun init() { - "com.android.systemui.statusbar.views.MiuiBatteryMeterView".hookAfterMethod(getDefaultClassLoader(), "updateResources") { - + findMethod("com.android.systemui.statusbar.views.MiuiBatteryMeterView") { + name == "updateResources" + }.hookAfter { //隐藏电池图标 hasEnable("hide_battery_icon") { - (it.thisObject.getObjectField("mBatteryIconView") as ImageView).visibility = View.GONE - if (it.thisObject.getObjectField("mBatteryStyle") == 1) { - (it.thisObject.getObjectField("mBatteryDigitalView") as FrameLayout).visibility = View.GONE + (it.thisObject.getObject("mBatteryIconView") as ImageView).visibility = View.GONE + if (it.thisObject.getObject("mBatteryStyle") == 1) { + (it.thisObject.getObject("mBatteryDigitalView") as FrameLayout).visibility = + View.GONE } } - //隐藏电池内的百分比 hasEnable("hide_battery_percentage_icon") { - (it.thisObject.getObjectField("mBatteryPercentMarkView") as TextView).textSize = 0F + (it.thisObject.getObject("mBatteryPercentMarkView") as TextView).textSize = 0F } - //隐藏电池百分号 hasEnable("hide_battery_percentage_icon") { - (it.thisObject.getObjectField("mBatteryPercentMarkView") as TextView).textSize = 0F + (it.thisObject.getObject("mBatteryPercentMarkView") as TextView).textSize = 0F } + } - "com.android.systemui.statusbar.views.MiuiBatteryMeterView".hookAfterMethod(getDefaultClassLoader(), "updateChargeAndText") { - //隐藏电池充电图标 - hasEnable("hide_battery_charging_icon") { - (it.thisObject.getObjectField("mBatteryChargingInView") as ImageView).visibility = View.GONE - (it.thisObject.getObjectField("mBatteryChargingView") as ImageView).visibility = View.GONE - } + findMethod("com.android.systemui.statusbar.views.MiuiBatteryMeterView") { + name == "updateChargeAndText" + }.hookAfter { + //隐藏电池充电图标 + hasEnable("hide_battery_charging_icon") { + (it.thisObject.getObject("mBatteryChargingInView") as ImageView).visibility = + View.GONE + (it.thisObject.getObject("mBatteryChargingView") as ImageView).visibility = + View.GONE } } } - } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideHDIcon.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideHDIcon.kt index 363fde08..96012f0f 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideHDIcon.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideHDIcon.kt @@ -2,38 +2,38 @@ package com.lt2333.simplicitytools.hook.app.systemui import android.view.View import android.widget.ImageView -import com.lt2333.simplicitytools.util.getObjectField +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.getObject +import com.github.kyuubiran.ezxhelper.utils.hookAfter import com.lt2333.simplicitytools.util.hasEnable -import com.lt2333.simplicitytools.util.hookAfterMethod import com.lt2333.simplicitytools.util.xposed.base.HookRegister +import de.robv.android.xposed.XC_MethodHook -object HideHDIcon: HookRegister() { - +object HideHDIcon : HookRegister() { override fun init() { - val iconState = "com.android.systemui.statusbar.phone.StatusBarSignalPolicy\$MobileIconState" - "com.android.systemui.statusbar.StatusBarMobileView".hookAfterMethod(getDefaultClassLoader(), "initViewState", iconState) { - hasEnable("hide_big_hd_icon") { - (it.thisObject.getObjectField("mVolte") as ImageView).visibility = View.GONE - } - hasEnable("hide_small_hd_icon") { - (it.thisObject.getObjectField("mSmallHd") as ImageView).visibility = View.GONE - } - hasEnable("hide_hd_no_service_icon") { - (it.thisObject.getObjectField("mVolteNoService") as ImageView).visibility = View.GONE - } + findMethod("com.android.systemui.statusbar.StatusBarMobileView") { + name == "initViewState" && parameterCount == 1 + }.hookAfter { + hide(it) } - "com.android.systemui.statusbar.StatusBarMobileView".hookAfterMethod(getDefaultClassLoader(), "updateState", iconState) { - hasEnable("hide_big_hd_icon") { - (it.thisObject.getObjectField("mVolte") as ImageView).visibility = View.GONE - } - hasEnable("hide_small_hd_icon") { - (it.thisObject.getObjectField("mSmallHd") as ImageView).visibility = View.GONE - } - hasEnable("hide_hd_no_service_icon") { - (it.thisObject.getObjectField("mVolteNoService") as ImageView).visibility = View.GONE - } + findMethod("com.android.systemui.statusbar.StatusBarMobileView") { + name == "updateState" && parameterCount == 1 + }.hookAfter { + hide(it) } } + private fun hide(it: XC_MethodHook.MethodHookParam) { + hasEnable("hide_big_hd_icon") { + (it.thisObject.getObject("mVolte") as ImageView).visibility = View.GONE + } + hasEnable("hide_small_hd_icon") { + (it.thisObject.getObject("mSmallHd") as ImageView).visibility = View.GONE + } + hasEnable("hide_hd_no_service_icon") { + (it.thisObject.getObject("mVolteNoService") as ImageView).visibility = + View.GONE + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideMobileActivityIcon.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideMobileActivityIcon.kt index e94c45da..09b66e76 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideMobileActivityIcon.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideMobileActivityIcon.kt @@ -2,28 +2,32 @@ package com.lt2333.simplicitytools.hook.app.systemui import android.view.View import android.widget.ImageView -import com.lt2333.simplicitytools.util.getObjectField +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.getObject +import com.github.kyuubiran.ezxhelper.utils.hookAfter import com.lt2333.simplicitytools.util.hasEnable -import com.lt2333.simplicitytools.util.hookAfterMethod import com.lt2333.simplicitytools.util.xposed.base.HookRegister +import de.robv.android.xposed.XC_MethodHook -object HideMobileActivityIcon: HookRegister() { - +object HideMobileActivityIcon : HookRegister() { override fun init() { - val iconState = "com.android.systemui.statusbar.phone.StatusBarSignalPolicy\$MobileIconState" - "com.android.systemui.statusbar.StatusBarMobileView".hookAfterMethod(getDefaultClassLoader(), "initViewState", iconState) { - hasEnable("hide_mobile_activity_icon") { - (it.thisObject.getObjectField("mLeftInOut") as ImageView).visibility = View.GONE - (it.thisObject.getObjectField("mRightInOut") as ImageView).visibility = View.GONE - } + findMethod("com.android.systemui.statusbar.StatusBarMobileView") { + name == "initViewState" && parameterCount == 1 + }.hookAfter { + hide(it) } - "com.android.systemui.statusbar.StatusBarMobileView".hookAfterMethod(getDefaultClassLoader(), "updateState", iconState) { - hasEnable("hide_mobile_activity_icon") { - (it.thisObject.getObjectField("mLeftInOut") as ImageView).visibility = View.GONE - (it.thisObject.getObjectField("mRightInOut") as ImageView).visibility = View.GONE - } + findMethod("com.android.systemui.statusbar.StatusBarMobileView") { + name == "updateState" && parameterCount == 1 + }.hookAfter { + hide(it) } } + private fun hide(it: XC_MethodHook.MethodHookParam) { + hasEnable("hide_mobile_activity_icon") { + (it.thisObject.getObject("mLeftInOut") as ImageView).visibility = View.GONE + (it.thisObject.getObject("mRightInOut") as ImageView).visibility = View.GONE + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideMobileTypeIcon.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideMobileTypeIcon.kt index 1fc5b11a..8485d5df 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideMobileTypeIcon.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideMobileTypeIcon.kt @@ -3,32 +3,28 @@ package com.lt2333.simplicitytools.hook.app.systemui import android.view.View import android.widget.ImageView import android.widget.TextView +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.getObject +import com.github.kyuubiran.ezxhelper.utils.hookAfter import com.lt2333.simplicitytools.util.XSPUtils -import com.lt2333.simplicitytools.util.getObjectField import com.lt2333.simplicitytools.util.hasEnable -import com.lt2333.simplicitytools.util.hookAfterMethod import com.lt2333.simplicitytools.util.xposed.base.HookRegister import de.robv.android.xposed.XC_MethodHook -object HideMobileTypeIcon: HookRegister() { +object HideMobileTypeIcon : HookRegister() { private val isBigType = XSPUtils.getBoolean("big_mobile_type_icon", false) override fun init() { - val iconState = "com.android.systemui.statusbar.phone.StatusBarSignalPolicy\$MobileIconState" - "com.android.systemui.statusbar.StatusBarMobileView".hookAfterMethod( - getDefaultClassLoader(), - "initViewState", - iconState - ) { + findMethod("com.android.systemui.statusbar.StatusBarMobileView") { + name == "initViewState" && parameterCount == 1 + }.hookAfter { hideMobileTypeIcon(it) } - "com.android.systemui.statusbar.StatusBarMobileView".hookAfterMethod( - getDefaultClassLoader(), - "updateState", - iconState - ) { + findMethod("com.android.systemui.statusbar.StatusBarMobileView") { + name == "updateState" && parameterCount == 1 + }.hookAfter { hideMobileTypeIcon(it) } } @@ -36,21 +32,20 @@ object HideMobileTypeIcon: HookRegister() { private fun hideMobileTypeIcon(it: XC_MethodHook.MethodHookParam) { hasEnable("hide_mobile_type_icon") { if (isBigType) { - (it.thisObject.getObjectField("mMobileType") as TextView).visibility = + (it.thisObject.getObject("mMobileType") as TextView).visibility = View.GONE - (it.thisObject.getObjectField("mMobileTypeImage") as ImageView).visibility = + (it.thisObject.getObject("mMobileTypeImage") as ImageView).visibility = View.GONE - (it.thisObject.getObjectField("mMobileTypeSingle") as TextView).visibility = + (it.thisObject.getObject("mMobileTypeSingle") as TextView).visibility = View.GONE } else { - (it.thisObject.getObjectField("mMobileType") as TextView).visibility = + (it.thisObject.getObject("mMobileType") as TextView).visibility = View.INVISIBLE - (it.thisObject.getObjectField("mMobileTypeImage") as ImageView).visibility = + (it.thisObject.getObject("mMobileTypeImage") as ImageView).visibility = View.INVISIBLE - (it.thisObject.getObjectField("mMobileTypeSingle") as TextView).visibility = + (it.thisObject.getObject("mMobileTypeSingle") as TextView).visibility = View.INVISIBLE } } } - } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideNetworkSpeedSplitter.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideNetworkSpeedSplitter.kt index 574285dc..d95b94a6 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideNetworkSpeedSplitter.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideNetworkSpeedSplitter.kt @@ -1,21 +1,20 @@ package com.lt2333.simplicitytools.hook.app.systemui import android.widget.TextView -import com.lt2333.simplicitytools.util.XSPUtils -import com.lt2333.simplicitytools.util.findClass -import com.lt2333.simplicitytools.util.hookAfterMethod +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookAfter +import com.lt2333.simplicitytools.util.hasEnable import com.lt2333.simplicitytools.util.xposed.base.HookRegister -object HideNetworkSpeedSplitter: HookRegister() { - +object HideNetworkSpeedSplitter : HookRegister() { override fun init() { - val networkSpeedSplitterClass = "com.android.systemui.statusbar.views.NetworkSpeedSplitter".findClass(getDefaultClassLoader()) - networkSpeedSplitterClass.hookAfterMethod("init") { - if (XSPUtils.getBoolean("hide_network_speed_splitter", false)) { + findMethod("com.android.systemui.statusbar.views.NetworkSpeedSplitter") { + name == "init" + }.hookAfter { + hasEnable("hide_network_speed_splitter") { val textView = it.thisObject as TextView textView.text = " " } } } - } diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideSimIcon.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideSimIcon.kt index a1094e53..ee4880c9 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideSimIcon.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideSimIcon.kt @@ -1,13 +1,15 @@ package com.lt2333.simplicitytools.hook.app.systemui +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookBefore import com.lt2333.simplicitytools.util.hasEnable -import com.lt2333.simplicitytools.util.hookBeforeMethod import com.lt2333.simplicitytools.util.xposed.base.HookRegister -object HideSimIcon: HookRegister() { - +object HideSimIcon : HookRegister() { override fun init() { - "com.android.systemui.statusbar.phone.StatusBarSignalPolicy".hookBeforeMethod(getDefaultClassLoader(), "hasCorrectSubs", MutableList::class.java) { + findMethod("com.android.systemui.statusbar.phone.StatusBarSignalPolicy") { + name == "hasCorrectSubs" && parameterTypes[0] == MutableList::class.java + }.hookBefore { val list = it.args[0] as MutableList<*> val size = list.size hasEnable("hide_sim_two_icon", extraCondition = { size == 2 }) { @@ -18,5 +20,4 @@ object HideSimIcon: HookRegister() { } } } - } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideStatusBarIcon.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideStatusBarIcon.kt index c5310597..74d9e679 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideStatusBarIcon.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideStatusBarIcon.kt @@ -1,26 +1,24 @@ package com.lt2333.simplicitytools.hook.app.systemui +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookBefore import com.lt2333.simplicitytools.util.hasEnable -import com.lt2333.simplicitytools.util.hookBeforeMethod import com.lt2333.simplicitytools.util.xposed.base.HookRegister import de.robv.android.xposed.XC_MethodHook -object HideStatusBarIcon: HookRegister() { - +object HideStatusBarIcon : HookRegister() { override fun init() { - "com.android.systemui.statusbar.phone.StatusBarIconControllerImpl".hookBeforeMethod( - getDefaultClassLoader(), - "setIconVisibility", - String::class.java, - Boolean::class.java - ) { hideIcon(it) } + findMethod("com.android.systemui.statusbar.phone.StatusBarIconControllerImpl") { + name == "setIconVisibility" && parameterCount == 2 + }.hookBefore { + hideIcon(it) + } - "com.android.systemui.statusbar.phone.MiuiDripLeftStatusBarIconControllerImpl".hookBeforeMethod( - getDefaultClassLoader(), - "setIconVisibility", - String::class.java, - Boolean::class.java - ) { hideIcon(it) } + findMethod("com.android.systemui.statusbar.phone.MiuiDripLeftStatusBarIconControllerImpl") { + name == "setIconVisibility" && parameterCount == 2 + }.hookBefore { + hideIcon(it) + } } private fun hideIcon(it: XC_MethodHook.MethodHookParam) { diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideStatusBarNetworkSpeedSecond.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideStatusBarNetworkSpeedSecond.kt index ac157c5d..6fd6158e 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideStatusBarNetworkSpeedSecond.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideStatusBarNetworkSpeedSecond.kt @@ -1,17 +1,18 @@ package com.lt2333.simplicitytools.hook.app.systemui +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookBefore import com.lt2333.simplicitytools.util.hasEnable -import com.lt2333.simplicitytools.util.hookBeforeMethod -import com.lt2333.simplicitytools.util.isNonNull import com.lt2333.simplicitytools.util.xposed.base.HookRegister -object HideStatusBarNetworkSpeedSecond: HookRegister() { - +object HideStatusBarNetworkSpeedSecond : HookRegister() { override fun init() { - "com.android.systemui.statusbar.views.NetworkSpeedView".hookBeforeMethod(getDefaultClassLoader(), "setNetworkSpeed", String::class.java) { + findMethod("com.android.systemui.statusbar.views.NetworkSpeedView") { + name == "setNetworkSpeed" && parameterTypes[0] == String::class.java + }.hookBefore { hasEnable("hide_status_bar_network_speed_second") { - it.args[0].isNonNull { s -> - it.args[0] = (s as String) + if (it.args[0] != null) { + (it.args[0] as String) .replace("/", "") .replace("s", "") .replace("'", "") @@ -20,5 +21,4 @@ object HideStatusBarNetworkSpeedSecond: HookRegister() { } } } - } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideWifiActivityIcon.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideWifiActivityIcon.kt index fa7809df..e5ef91fb 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideWifiActivityIcon.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/HideWifiActivityIcon.kt @@ -3,35 +3,39 @@ package com.lt2333.simplicitytools.hook.app.systemui import android.view.View import android.widget.ImageView import android.widget.TextView -import com.lt2333.simplicitytools.util.getObjectField +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.getObject +import com.github.kyuubiran.ezxhelper.utils.hookAfter import com.lt2333.simplicitytools.util.hasEnable -import com.lt2333.simplicitytools.util.hookAfterMethod import com.lt2333.simplicitytools.util.xposed.base.HookRegister +import de.robv.android.xposed.XC_MethodHook -object HideWifiActivityIcon: HookRegister() { +object HideWifiActivityIcon : HookRegister() { override fun init() { - val iconState = "com.android.systemui.statusbar.phone.StatusBarSignalPolicy\$WifiIconState" - "com.android.systemui.statusbar.StatusBarWifiView".hookAfterMethod(getDefaultClassLoader(), "initViewState", iconState) { - //隐藏WIFI箭头 - hasEnable("hide_wifi_activity_icon") { - (it.thisObject.getObjectField("mWifiActivityView") as ImageView).visibility = View.INVISIBLE - } - //隐藏WIFI标准图标 - hasEnable("hide_wifi_standard_icon") { - (it.thisObject.getObjectField("mWifiStandardView") as TextView).visibility = View.INVISIBLE - } + findMethod("com.android.systemui.statusbar.StatusBarWifiView") { + name == "initViewState" && parameterCount == 1 + }.hookAfter { + hide(it) } - "com.android.systemui.statusbar.StatusBarWifiView".hookAfterMethod(getDefaultClassLoader(), "updateState", iconState) { - //隐藏WIFI箭头 - hasEnable("hide_wifi_activity_icon") { - (it.thisObject.getObjectField("mWifiActivityView") as ImageView).visibility = View.INVISIBLE - } - //隐藏WIFI标准图标 - hasEnable("hide_wifi_standard_icon") { - (it.thisObject.getObjectField("mWifiStandardView") as TextView).visibility = View.INVISIBLE - } + findMethod("com.android.systemui.statusbar.StatusBarWifiView") { + name == "updateState" && parameterCount == 1 + }.hookAfter { + hide(it) + } + } + + private fun hide(it: XC_MethodHook.MethodHookParam) { + //隐藏WIFI箭头 + hasEnable("hide_wifi_activity_icon") { + (it.thisObject.getObject("mWifiActivityView") as ImageView).visibility = + View.INVISIBLE + } + //隐藏WIFI标准图标 + hasEnable("hide_wifi_standard_icon") { + (it.thisObject.getObject("mWifiStandardView") as TextView).visibility = + View.INVISIBLE } } diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/LockScreenClockDisplaySeconds.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/LockScreenClockDisplaySeconds.kt index 019f32af..f47ff208 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/LockScreenClockDisplaySeconds.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/LockScreenClockDisplaySeconds.kt @@ -4,11 +4,11 @@ import android.annotation.SuppressLint import android.content.Context import android.os.Handler import android.provider.Settings -import android.util.AttributeSet import android.util.Log import android.widget.LinearLayout import android.widget.TextView -import com.lt2333.simplicitytools.util.* +import com.github.kyuubiran.ezxhelper.utils.* +import com.lt2333.simplicitytools.util.hasEnable import com.lt2333.simplicitytools.util.xposed.base.HookRegister import de.robv.android.xposed.XC_MethodHook import java.lang.reflect.Method @@ -19,67 +19,48 @@ object LockScreenClockDisplaySeconds : HookRegister() { private var nowTime: Date = Calendar.getInstance().time - override fun init() { - hasEnable("lock_screen_clock_display_seconds") { - "com.miui.clock.MiuiBaseClock".findClass(getDefaultClassLoader()) - .hookAfterConstructor( - Context::class.java, - AttributeSet::class.java - ) { - try { - val viewGroup = it.thisObject as LinearLayout + override fun init() = hasEnable("lock_screen_clock_display_seconds") { + findConstructor("com.miui.clock.MiuiBaseClock") { + paramCount == 2 + }.hookAfter { + try { + val viewGroup = it.thisObject as LinearLayout + val d: Method = viewGroup.javaClass.getDeclaredMethod("updateTime") + val r = Runnable { + d.isAccessible = true + d.invoke(viewGroup) + } - val d: Method = viewGroup.javaClass.getDeclaredMethod("updateTime") - val r = Runnable { - d.isAccessible = true - d.invoke(viewGroup) - } - - class T : TimerTask() { - override fun run() { - Handler(viewGroup.context.mainLooper).post(r) - } - } - Timer().scheduleAtFixedRate( - T(), - 1000 - System.currentTimeMillis() % 1000, - 1000 - ) - } catch (e: java.lang.Exception) { + class T : TimerTask() { + override fun run() { + Handler(viewGroup.context.mainLooper).post(r) } } - "com.miui.clock.MiuiLeftTopClock".hookAfterMethod( - getDefaultClassLoader(), - "updateTime" - ) { - updateTime(it, false) - } + Timer().scheduleAtFixedRate(T(), 1000 - System.currentTimeMillis() % 1000, 1000) + } catch (e: Exception) { - "com.miui.clock.MiuiLeftTopLargeClock".hookAfterMethod( - getDefaultClassLoader(), - "updateTime" - ) { - updateTime(it, false) - } - - "com.miui.clock.MiuiCenterHorizontalClock".hookAfterMethod( - getDefaultClassLoader(), - "updateTime" - ) { - updateTime(it, false) - } - - "com.miui.clock.MiuiVerticalClock".hookAfterMethod( - getDefaultClassLoader(), - "updateTime" - ) { - updateTime(it, true) } } + + findMethod("com.miui.clock.MiuiLeftTopClock") { + name == "updateTime" + }.hookAfter { updateTime(it, false) } + + findMethod("com.miui.clock.MiuiCenterHorizontalClock") { + name == "updateTime" + }.hookAfter { updateTime(it, false) } + + findMethod("com.miui.clock.MiuiLeftTopLargeClock") { + name == "updateTime" + }.hookAfter { updateTime(it, false) } + + findMethod("com.miui.clock.MiuiVerticalClock") { + name == "updateTime" + }.hookAfter { updateTime(it, true) } } private fun updateTime(it: XC_MethodHook.MethodHookParam, isVertical: Boolean) { - val textV = it.thisObject.getObjectField("mTimeText") as TextView + val textV = it.thisObject.getObject("mTimeText") as TextView val c: Context = textV.context Log.d( diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/LockScreenCurrent.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/LockScreenCurrent.kt index 4c8c3fd6..5dac7fc3 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/LockScreenCurrent.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/LockScreenCurrent.kt @@ -1,15 +1,14 @@ package com.lt2333.simplicitytools.hook.app.systemui import android.annotation.SuppressLint -import android.content.Context import android.widget.TextView import com.github.kyuubiran.ezxhelper.init.InitFields +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.getObject +import com.github.kyuubiran.ezxhelper.utils.hookAfter import com.lt2333.simplicitytools.R -import com.lt2333.simplicitytools.util.findClass import com.lt2333.simplicitytools.util.hasEnable -import com.lt2333.simplicitytools.util.hookAfterMethod import com.lt2333.simplicitytools.util.xposed.base.HookRegister -import de.robv.android.xposed.XposedHelpers import java.io.BufferedReader import java.io.FileReader import java.lang.reflect.Method @@ -17,26 +16,19 @@ import kotlin.math.roundToInt object LockScreenCurrent : HookRegister() { - override fun init() { - hasEnable("lock_screen_charging_current") { - "com.android.keyguard.charge.ChargeUtils".findClass(getDefaultClassLoader()) - .hookAfterMethod( - "getChargingHintText", - Context::class.java, - Boolean::class.java, - Int::class.java - ) { - it.result = getCurrent() + "\n" + it.result - } - "com.android.systemui.statusbar.phone.KeyguardBottomAreaView".findClass(getDefaultClassLoader()) - .hookAfterMethod( - "onFinishInflate" - ) { - (XposedHelpers.getObjectField( - it.thisObject, - "mIndicationText" - ) as TextView).isSingleLine = false - } + override fun init() = hasEnable("lock_screen_charging_current") { + findMethod("com.android.keyguard.charge.ChargeUtils") { + name == "getChargingHintText" && parameterCount == 3 + }.hookAfter { + it.result = getCurrent() + "\n" + it.result + } + + findMethod("com.android.systemui.statusbar.phone.KeyguardBottomAreaView") { + name == "onFinishInflate" + }.hookAfter { + (it.thisObject.getObject( + "mIndicationText" + ) as TextView).isSingleLine = false } } diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/LockScreenDoubleTapToSleep.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/LockScreenDoubleTapToSleep.kt index 2aca8e82..ab67d25d 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/LockScreenDoubleTapToSleep.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/LockScreenDoubleTapToSleep.kt @@ -1,72 +1,67 @@ package com.lt2333.simplicitytools.hook.app.systemui -import android.annotation.SuppressLint import android.app.KeyguardManager import android.content.Context import android.os.SystemClock import android.view.MotionEvent import android.view.View import android.view.View.OnTouchListener -import com.lt2333.simplicitytools.util.findClass +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookBefore import com.lt2333.simplicitytools.util.hasEnable -import com.lt2333.simplicitytools.util.hookBeforeMethod import com.lt2333.simplicitytools.util.xposed.base.HookRegister import de.robv.android.xposed.XposedHelpers -object LockScreenDoubleTapToSleep: HookRegister() { - - @SuppressLint("ClickableViewAccessibility") - override fun init() { - hasEnable("lock_screen_double_tap_to_sleep") { - "com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer".findClass( - getDefaultClassLoader() - ).hookBeforeMethod("onFinishInflate") { - val view = it.thisObject as View - XposedHelpers.setAdditionalInstanceField(view, "currentTouchTime", 0L) - XposedHelpers.setAdditionalInstanceField(view, "currentTouchX", 0f) - XposedHelpers.setAdditionalInstanceField(view, "currentTouchY", 0f) - view.setOnTouchListener(OnTouchListener { v, event -> - if (event.action != MotionEvent.ACTION_DOWN) return@OnTouchListener false - var currentTouchTime = - XposedHelpers.getAdditionalInstanceField(view, "currentTouchTime") as Long - var currentTouchX = - XposedHelpers.getAdditionalInstanceField(view, "currentTouchX") as Float - var currentTouchY = - XposedHelpers.getAdditionalInstanceField(view, "currentTouchY") as Float - val lastTouchTime = currentTouchTime - val lastTouchX = currentTouchX - val lastTouchY = currentTouchY - currentTouchTime = System.currentTimeMillis() - currentTouchX = event.x - currentTouchY = event.y - if (currentTouchTime - lastTouchTime < 250L && Math.abs(currentTouchX - lastTouchX) < 100f && Math.abs( - currentTouchY - lastTouchY - ) < 100f - ) { - val keyguardMgr = - v.context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager - if (keyguardMgr.isKeyguardLocked) { - XposedHelpers.callMethod( - v.context.getSystemService(Context.POWER_SERVICE), - "goToSleep", - SystemClock.uptimeMillis() - ) - } - currentTouchTime = 0L - currentTouchX = 0f - currentTouchY = 0f +object LockScreenDoubleTapToSleep : HookRegister() { + override fun init() = hasEnable("lock_screen_double_tap_to_sleep") { + findMethod("com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer") { + name == "onFinishInflate" + }.hookBefore { + val view = it.thisObject as View + XposedHelpers.setAdditionalInstanceField(view, "currentTouchTime", 0L) + XposedHelpers.setAdditionalInstanceField(view, "currentTouchX", 0f) + XposedHelpers.setAdditionalInstanceField(view, "currentTouchY", 0f) + view.setOnTouchListener(OnTouchListener { v, event -> + if (event.action != MotionEvent.ACTION_DOWN) return@OnTouchListener false + var currentTouchTime = + XposedHelpers.getAdditionalInstanceField(view, "currentTouchTime") as Long + var currentTouchX = + XposedHelpers.getAdditionalInstanceField(view, "currentTouchX") as Float + var currentTouchY = + XposedHelpers.getAdditionalInstanceField(view, "currentTouchY") as Float + val lastTouchTime = currentTouchTime + val lastTouchX = currentTouchX + val lastTouchY = currentTouchY + currentTouchTime = System.currentTimeMillis() + currentTouchX = event.x + currentTouchY = event.y + if (currentTouchTime - lastTouchTime < 250L && Math.abs(currentTouchX - lastTouchX) < 100f && Math.abs( + currentTouchY - lastTouchY + ) < 100f + ) { + val keyguardMgr = + v.context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager + if (keyguardMgr.isKeyguardLocked) { + XposedHelpers.callMethod( + v.context.getSystemService(Context.POWER_SERVICE), + "goToSleep", + SystemClock.uptimeMillis() + ) } - XposedHelpers.setAdditionalInstanceField( - view, - "currentTouchTime", - currentTouchTime - ) - XposedHelpers.setAdditionalInstanceField(view, "currentTouchX", currentTouchX) - XposedHelpers.setAdditionalInstanceField(view, "currentTouchY", currentTouchY) - false - }) - } + currentTouchTime = 0L + currentTouchX = 0f + currentTouchY = 0f + } + XposedHelpers.setAdditionalInstanceField( + view, + "currentTouchTime", + currentTouchTime + ) + XposedHelpers.setAdditionalInstanceField(view, "currentTouchX", currentTouchX) + XposedHelpers.setAdditionalInstanceField(view, "currentTouchY", currentTouchY) + v.performClick() + false + }) } } - } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/MaximumNumberOfNotificationIcons.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/MaximumNumberOfNotificationIcons.kt index 6aa1228a..47e6e477 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/MaximumNumberOfNotificationIcons.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/MaximumNumberOfNotificationIcons.kt @@ -1,25 +1,29 @@ package com.lt2333.simplicitytools.hook.app.systemui -import com.lt2333.simplicitytools.util.* +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookReplace +import com.github.kyuubiran.ezxhelper.utils.invokeMethod +import com.github.kyuubiran.ezxhelper.utils.putObject +import com.lt2333.simplicitytools.util.XSPUtils import com.lt2333.simplicitytools.util.xposed.base.HookRegister -object MaximumNumberOfNotificationIcons: HookRegister() { - +object MaximumNumberOfNotificationIcons : HookRegister() { override fun init() { - val icons = XSPUtils.getInt("maximum_number_of_notification_icons",3) - val dots = XSPUtils.getInt("maximum_number_of_notification_dots",3) - "com.android.systemui.statusbar.phone.NotificationIconContainer".replaceMethod(getDefaultClassLoader(), "miuiShowNotificationIcons", Boolean::class.java) { - if (it.args[0] as Boolean) { - it.thisObject.setIntField("MAX_DOTS", dots) - it.thisObject.setIntField("MAX_STATIC_ICONS", icons) - it.thisObject.setIntField("MAX_VISIBLE_ICONS_ON_LOCK", icons) - } else { - it.thisObject.setIntField("MAX_DOTS", 0) - it.thisObject.setIntField("MAX_STATIC_ICONS", 0) - it.thisObject.setIntField("MAX_VISIBLE_ICONS_ON_LOCK", 0) - } - it.thisObject.callMethod("updateState") + val icons = XSPUtils.getInt("maximum_number_of_notification_icons", 3) + val dots = XSPUtils.getInt("maximum_number_of_notification_dots", 3) + findMethod("com.android.systemui.statusbar.phone.NotificationIconContainer") { + name == "miuiShowNotificationIcons" && parameterCount == 1 + }.hookReplace { + if (it.args[0] as Boolean) { + it.thisObject.putObject("MAX_DOTS", dots) + it.thisObject.putObject("MAX_STATIC_ICONS", icons) + it.thisObject.putObject("MAX_VISIBLE_ICONS_ON_LOCK", icons) + } else { + it.thisObject.putObject("MAX_DOTS", 0) + it.thisObject.putObject("MAX_STATIC_ICONS", 0) + it.thisObject.putObject("MAX_VISIBLE_ICONS_ON_LOCK", 0) } + it.thisObject.invokeMethod("updateState") + } } - } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/NotificationWeather.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/NotificationWeather.kt index efd4f67c..0c7370a5 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/NotificationWeather.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/NotificationWeather.kt @@ -9,216 +9,210 @@ import android.widget.TextView import android.widget.Toast import androidx.constraintlayout.widget.ConstraintLayout import cn.fkj233.ui.activity.dp2px -import com.github.kyuubiran.ezxhelper.utils.loadClass +import com.github.kyuubiran.ezxhelper.utils.* import com.lt2333.simplicitytools.util.* import com.lt2333.simplicitytools.util.xposed.base.HookRegister import com.lt2333.simplicitytools.view.WeatherView -object NotificationWeather: HookRegister() { +object NotificationWeather : HookRegister() { - override fun init() { - hasEnable("notification_weather") { - var mWeatherView: TextView? = null - var mConstraintLayout: ConstraintLayout? = null - val isDisplayCity = XSPUtils.getBoolean("notification_weather_city", false) - "com.android.systemui.qs.MiuiNotificationHeaderView".hookAfterMethod( - getDefaultClassLoader(), - "onFinishInflate" + override fun init() = hasEnable("notification_weather") { + var mWeatherView: TextView? = null + var mConstraintLayout: ConstraintLayout? = null + val isDisplayCity = XSPUtils.getBoolean("notification_weather_city", false) + findMethod("com.android.systemui.qs.MiuiNotificationHeaderView") { + name == "onFinishInflate" + }.hookAfter { + val viewGroup = it.thisObject as ViewGroup + val context = viewGroup.context + + // MIUI编译时间大于 2022-03-12 00:00:00 且为内测版 + if (SystemProperties.get(context, "ro.build.date.utc")!! + .toInt() >= 1647014400 && + + !SystemProperties.get( + context, + "ro.build.version.incremental" + )!!.endsWith("DEV") && + + !SystemProperties.get( + context, + "ro.build.version.incremental" + )!!.endsWith("XM") ) { - val viewGroup = it.thisObject as ViewGroup - val context = viewGroup.context + //获取原组件 + val big_time_ID = + context.resources.getIdentifier("big_time", "id", context.packageName) + val big_time: TextView = viewGroup.findViewById(big_time_ID) - // MIUI编译时间大于 2022-03-12 00:00:00 且为内测版 - if (SystemProperties.get(context, "ro.build.date.utc")!! - .toInt() >= 1647014400 && + val date_time_ID = + context.resources.getIdentifier("date_time", "id", context.packageName) + val date_time: TextView = viewGroup.findViewById(date_time_ID) - !SystemProperties.get( - context, - "ro.build.version.incremental" - )!!.endsWith("DEV") && - - !SystemProperties.get( - context, - "ro.build.version.incremental" - )!!.endsWith("XM") - ) { - //获取原组件 - val big_time_ID = - context.resources.getIdentifier("big_time", "id", context.packageName) - val big_time: TextView = viewGroup.findViewById(big_time_ID) - - val date_time_ID = - context.resources.getIdentifier("date_time", "id", context.packageName) - val date_time: TextView = viewGroup.findViewById(date_time_ID) - - //创建新布局 - val mConstraintLayoutLp = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, - LinearLayout.LayoutParams.WRAP_CONTENT - ).also { - it.topMargin = context.resources.getDimensionPixelSize( - context.resources.getIdentifier( - "qs_control_header_tiles_margin_top", - "dimen", - context.packageName - ) + //创建新布局 + val mConstraintLayoutLp = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ).also { + it.topMargin = context.resources.getDimensionPixelSize( + context.resources.getIdentifier( + "qs_control_header_tiles_margin_top", + "dimen", + context.packageName ) - } - - mConstraintLayout = - ConstraintLayout(context).also { it.layoutParams = mConstraintLayoutLp } - - (big_time.parent as ViewGroup).addView(mConstraintLayout, 0) - - - //从原布局中删除组件 - (big_time.parent as ViewGroup).removeView(big_time) - (date_time.parent as ViewGroup).removeView(date_time) - - - //添加组件至新布局 - mConstraintLayout!!.addView(big_time) - mConstraintLayout!!.addView(date_time) - - //组件属性 - - val date_time_LP = ConstraintLayout.LayoutParams( - ConstraintLayout.LayoutParams.WRAP_CONTENT, - ConstraintLayout.LayoutParams.WRAP_CONTENT - ).also { - it.startToEnd = big_time_ID - it.bottomToBottom = 0 - it.marginStart = context.resources.getDimensionPixelSize( - context.resources.getIdentifier( - "notification_panel_time_date_space", - "dimen", - context.packageName - ) - ) - it.bottomMargin = dp2px(context, 5f) - } - date_time.layoutParams = date_time_LP - - - //创建天气组件 - mWeatherView = WeatherView(context, isDisplayCity).apply { - setTextAppearance( - context.resources.getIdentifier( - "TextAppearance.QSControl.Date", - "style", - context.packageName - ) - ) - - } - mConstraintLayout!!.addView(mWeatherView) - - val mWeatherView_LP = ConstraintLayout.LayoutParams( - ConstraintLayout.LayoutParams.WRAP_CONTENT, - ConstraintLayout.LayoutParams.WRAP_CONTENT - ).also { - it.startToEnd = big_time_ID - it.bottomToTop = date_time_ID - it.marginStart = context.resources.getDimensionPixelSize( - context.resources.getIdentifier( - "notification_panel_time_date_space", - "dimen", - context.packageName - ) - ) - } - - (mWeatherView as WeatherView).layoutParams = mWeatherView_LP - - } else { - val layoutParam = - loadClass("androidx.constraintlayout.widget.ConstraintLayout\$LayoutParams").getConstructor( - Int::class.java, - Int::class.java - ).newInstance( - ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.WRAP_CONTENT - ) as ViewGroup.MarginLayoutParams - layoutParam.setObjectField( - "bottomToTop", - context.resources.getIdentifier("date_time", "id", context.packageName) ) - layoutParam.setObjectField( - "startToEnd", - context.resources.getIdentifier("big_time", "id", context.packageName) - ) - layoutParam.marginStart = context.resources.getDimensionPixelSize( + } + + mConstraintLayout = + ConstraintLayout(context).also { it.layoutParams = mConstraintLayoutLp } + + (big_time.parent as ViewGroup).addView(mConstraintLayout, 0) + + + //从原布局中删除组件 + (big_time.parent as ViewGroup).removeView(big_time) + (date_time.parent as ViewGroup).removeView(date_time) + + + //添加组件至新布局 + mConstraintLayout!!.addView(big_time) + mConstraintLayout!!.addView(date_time) + + //组件属性 + + val date_time_LP = ConstraintLayout.LayoutParams( + ConstraintLayout.LayoutParams.WRAP_CONTENT, + ConstraintLayout.LayoutParams.WRAP_CONTENT + ).also { + it.startToEnd = big_time_ID + it.bottomToBottom = 0 + it.marginStart = context.resources.getDimensionPixelSize( context.resources.getIdentifier( "notification_panel_time_date_space", "dimen", context.packageName ) ) - mWeatherView = WeatherView(context, isDisplayCity).apply { - setTextAppearance( - context.resources.getIdentifier( - "TextAppearance.QSControl.Date", - "style", - context.packageName - ) + it.bottomMargin = dp2px(context, 5f) + } + date_time.layoutParams = date_time_LP + + + //创建天气组件 + mWeatherView = WeatherView(context, isDisplayCity).apply { + setTextAppearance( + context.resources.getIdentifier( + "TextAppearance.QSControl.Date", + "style", + context.packageName ) - layoutParams = layoutParam - } - viewGroup.addView(mWeatherView) + ) + + } + mConstraintLayout!!.addView(mWeatherView) + + val mWeatherView_LP = ConstraintLayout.LayoutParams( + ConstraintLayout.LayoutParams.WRAP_CONTENT, + ConstraintLayout.LayoutParams.WRAP_CONTENT + ).also { + it.startToEnd = big_time_ID + it.bottomToTop = date_time_ID + it.marginStart = context.resources.getDimensionPixelSize( + context.resources.getIdentifier( + "notification_panel_time_date_space", + "dimen", + context.packageName + ) + ) } - (mWeatherView as WeatherView).setOnClickListener { - try { - val intent = Intent().apply { - flags = Intent.FLAG_ACTIVITY_NEW_TASK - component = ComponentName( - "com.miui.weather2", - "com.miui.weather2.ActivityWeatherMain" - ) - } - context.startActivity(intent) - } catch (e: Exception) { - Toast.makeText(context, "启动失败", Toast.LENGTH_LONG).show() - } - } + (mWeatherView as WeatherView).layoutParams = mWeatherView_LP + } else { + val layoutParam = + loadClass("androidx.constraintlayout.widget.ConstraintLayout\$LayoutParams").getConstructor( + Int::class.java, + Int::class.java + ).newInstance( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) as ViewGroup.MarginLayoutParams + layoutParam.putObject( + "bottomToTop", + context.resources.getIdentifier("date_time", "id", context.packageName) + ) + layoutParam.putObject( + "startToEnd", + context.resources.getIdentifier("big_time", "id", context.packageName) + ) + layoutParam.marginStart = context.resources.getDimensionPixelSize( + context.resources.getIdentifier( + "notification_panel_time_date_space", + "dimen", + context.packageName + ) + ) + mWeatherView = WeatherView(context, isDisplayCity).apply { + setTextAppearance( + context.resources.getIdentifier( + "TextAppearance.QSControl.Date", + "style", + context.packageName + ) + ) + layoutParams = layoutParam + } + viewGroup.addView(mWeatherView) } - //解决横屏重叠 - "com.android.systemui.qs.MiuiNotificationHeaderView".hookAfterMethod( - getDefaultClassLoader(), - "updateLayout" + + (mWeatherView as WeatherView).setOnClickListener { + try { + val intent = Intent().apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK + component = ComponentName( + "com.miui.weather2", + "com.miui.weather2.ActivityWeatherMain" + ) + } + context.startActivity(intent) + } catch (e: Exception) { + Toast.makeText(context, "启动失败", Toast.LENGTH_LONG).show() + } + } + } + + findMethod("com.android.systemui.qs.MiuiNotificationHeaderView") { + name == "updateLayout" + }.hookAfter { + val viewGroup = it.thisObject as ViewGroup + val context = viewGroup.context + val mOrientation = viewGroup.getObject("mOrientation") as Int + // MIUI编译时间大于 2022-03-12 00:00:00 且为内测版 + if (SystemProperties.get(context, "ro.build.date.utc")!! + .toInt() >= 1647014400 && + + !SystemProperties.get( + context, + "ro.build.version.incremental" + )!!.endsWith("DEV") && + + !SystemProperties.get( + context, + "ro.build.version.incremental" + )!!.endsWith("XM") ) { - val viewGroup = it.thisObject as ViewGroup - val context = viewGroup.context - val mOrientation = viewGroup.getObjectField("mOrientation") as Int - // MIUI编译时间大于 2022-03-12 00:00:00 且为内测版 - if (SystemProperties.get(context, "ro.build.date.utc")!! - .toInt() >= 1647014400 && - - !SystemProperties.get( - context, - "ro.build.version.incremental" - )!!.endsWith("DEV") && - - !SystemProperties.get( - context, - "ro.build.version.incremental" - )!!.endsWith("XM") - ) { - if (mOrientation == 1) { - mConstraintLayout!!.visibility = View.VISIBLE - } else { - mConstraintLayout!!.visibility = View.GONE - } + if (mOrientation == 1) { + mConstraintLayout!!.visibility = View.VISIBLE } else { - if (mOrientation == 1) { - mWeatherView!!.visibility = View.VISIBLE - } else { - mWeatherView!!.visibility = View.GONE - } + mConstraintLayout!!.visibility = View.GONE + } + } else { + if (mOrientation == 1) { + mWeatherView!!.visibility = View.VISIBLE + } else { + mWeatherView!!.visibility = View.GONE } } } } - } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/OldNotificationWeather.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/OldNotificationWeather.kt index 86112dc2..2d1e9419 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/OldNotificationWeather.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/OldNotificationWeather.kt @@ -6,96 +6,91 @@ import android.view.View import android.view.ViewGroup import android.widget.TextView import android.widget.Toast -import com.github.kyuubiran.ezxhelper.utils.loadClass -import com.lt2333.simplicitytools.util.* +import com.github.kyuubiran.ezxhelper.utils.* +import com.lt2333.simplicitytools.util.XSPUtils +import com.lt2333.simplicitytools.util.hasEnable import com.lt2333.simplicitytools.util.xposed.base.HookRegister import com.lt2333.simplicitytools.view.WeatherView -object OldNotificationWeather: HookRegister() { +object OldNotificationWeather : HookRegister() { + override fun init() = hasEnable("notification_weather") { + var mWeatherView: TextView? = null + val isDisplayCity = XSPUtils.getBoolean("notification_weather_city", false) + findMethod("com.android.systemui.qs.MiuiQSHeaderView") { + name == "onFinishInflate" + }.hookAfter { + val viewGroup = it.thisObject as ViewGroup + val context = viewGroup.context + val layoutParam = + loadClass("androidx.constraintlayout.widget.ConstraintLayout\$LayoutParams") + .getConstructor(Int::class.java, Int::class.java) + .newInstance( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) as ViewGroup.MarginLayoutParams - override fun init() { - hasEnable("notification_weather") { - var mWeatherView: TextView? = null - val isDisplayCity = XSPUtils.getBoolean("notification_weather_city", false) - "com.android.systemui.qs.MiuiQSHeaderView".hookAfterMethod( - getDefaultClassLoader(), - "onFinishInflate" - ) { - val viewGroup = it.thisObject as ViewGroup - val context = viewGroup.context - val layoutParam = - loadClass("androidx.constraintlayout.widget.ConstraintLayout\$LayoutParams") - .getConstructor(Int::class.java, Int::class.java) - .newInstance( - ViewGroup.LayoutParams.WRAP_CONTENT, - ViewGroup.LayoutParams.WRAP_CONTENT - ) as ViewGroup.MarginLayoutParams + layoutParam.putObject( + "endToStart", + context.resources.getIdentifier( + "notification_shade_shortcut", + "id", + context.packageName + ) + ) + layoutParam.putObject( + "topToTop", + context.resources.getIdentifier( + "notification_shade_shortcut", + "id", + context.packageName + ) + ) + layoutParam.putObject( + "bottomToBottom", + context.resources.getIdentifier( + "notification_shade_shortcut", + "id", + context.packageName + ) + ) - layoutParam.setObjectField( - "endToStart", + mWeatherView = WeatherView(context, isDisplayCity).apply { + setTextAppearance( context.resources.getIdentifier( - "notification_shade_shortcut", - "id", + "TextAppearance.StatusBar.Expanded.Clock.QuickSettingDate", + "style", context.packageName ) ) - layoutParam.setObjectField( - "topToTop", - context.resources.getIdentifier( - "notification_shade_shortcut", - "id", - context.packageName - ) - ) - layoutParam.setObjectField( - "bottomToBottom", - context.resources.getIdentifier( - "notification_shade_shortcut", - "id", - context.packageName - ) - ) - - mWeatherView = WeatherView(context, isDisplayCity).apply { - setTextAppearance( - context.resources.getIdentifier( - "TextAppearance.StatusBar.Expanded.Clock.QuickSettingDate", - "style", - context.packageName - ) - ) - layoutParams = layoutParam - } - viewGroup.addView(mWeatherView) - (mWeatherView as WeatherView).setOnClickListener { - try { - val intent = Intent().apply { - flags = Intent.FLAG_ACTIVITY_NEW_TASK - component = ComponentName( - "com.miui.weather2", - "com.miui.weather2.ActivityWeatherMain" - ) - } - context.startActivity(intent) - } catch (e: Exception) { - Toast.makeText(context, "启动失败,可能是不支持", Toast.LENGTH_LONG).show() - } - } + layoutParams = layoutParam } - //解决横屏重叠 - "com.android.systemui.qs.MiuiQSHeaderView".hookAfterMethod( - getDefaultClassLoader(), - "updateLayout" - ) { - val mOritation = it.thisObject.getObjectField("mOrientation") as Int - if (mOritation == 1) { - mWeatherView!!.visibility = View.VISIBLE - } else { - mWeatherView!!.visibility = View.GONE + viewGroup.addView(mWeatherView) + (mWeatherView as WeatherView).setOnClickListener { + try { + val intent = Intent().apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK + component = ComponentName( + "com.miui.weather2", + "com.miui.weather2.ActivityWeatherMain" + ) + } + context.startActivity(intent) + } catch (e: Exception) { + Toast.makeText(context, "启动失败,可能是不支持", Toast.LENGTH_LONG).show() } } } + + //解决横屏重叠 + findMethod("com.android.systemui.qs.MiuiQSHeaderView") { + name == "updateLayout" + }.hookAfter { + val mOritation = it.thisObject.getObject("mOrientation") as Int + if (mOritation == 1) { + mWeatherView!!.visibility = View.VISIBLE + } else { + mWeatherView!!.visibility = View.GONE + } + } } - } - diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/OldQSCustom.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/OldQSCustom.kt index 8bfda0a7..193610a8 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/OldQSCustom.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/OldQSCustom.kt @@ -2,52 +2,48 @@ package com.lt2333.simplicitytools.hook.app.systemui import android.content.res.Configuration import android.view.ViewGroup +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookAfter +import com.github.kyuubiran.ezxhelper.utils.hookBefore +import com.github.kyuubiran.ezxhelper.utils.putObject import com.lt2333.simplicitytools.util.XSPUtils import com.lt2333.simplicitytools.util.hasEnable -import com.lt2333.simplicitytools.util.hookAfterMethod -import com.lt2333.simplicitytools.util.hookBeforeMethod import com.lt2333.simplicitytools.util.xposed.base.HookRegister import de.robv.android.xposed.XposedHelpers -object OldQSCustom: HookRegister() { +object OldQSCustom : HookRegister() { + override fun init() = hasEnable("old_qs_custom_switch") { + val mRows = XSPUtils.getInt("qs_custom_rows", 3) + val mRowsHorizontal = XSPUtils.getInt("qs_custom_rows_horizontal", 2) + val mColumns = XSPUtils.getInt("qs_custom_columns", 4) + val mColumnsUnexpanded = XSPUtils.getInt("qs_custom_columns_unexpanded", 5) - override fun init() { - hasEnable("old_qs_custom_switch") { - val mRows = XSPUtils.getInt("qs_custom_rows", 3) - val mRowsHorizontal = XSPUtils.getInt("qs_custom_rows_horizontal", 2) - val mColumns = XSPUtils.getInt("qs_custom_columns", 4) - val mColumnsUnexpanded = XSPUtils.getInt("qs_custom_columns_unexpanded", 5) + findMethod("com.android.systemui.qs.MiuiQuickQSPanel") { + name == "setMaxTiles" && parameterCount == 1 + }.hookBefore { + //未展开时的列数 + it.args[0] = mColumnsUnexpanded + } - "com.android.systemui.qs.MiuiQuickQSPanel".hookBeforeMethod( - getDefaultClassLoader(), - "setMaxTiles", Int::class.java - ) { - //未展开时的列数 - it.args[0] = mColumnsUnexpanded - } + findMethod("com.android.systemui.qs.MiuiTileLayout") { + name == "updateColumns" + }.hookAfter { + //展开时的列数 + it.thisObject.putObject("mColumns", mColumns) + } - "com.android.systemui.qs.MiuiTileLayout".hookAfterMethod( - getDefaultClassLoader(), - "updateColumns" - ) { - //展开时的列数 - XposedHelpers.setObjectField(it.thisObject, "mColumns", mColumns) - } - "com.android.systemui.qs.MiuiTileLayout".hookAfterMethod( - getDefaultClassLoader(), - "updateResources" - ) { - //展开时的行数 - val viewGroup = it.thisObject as ViewGroup - val mConfiguration: Configuration = viewGroup.context.resources.configuration - if (mConfiguration.orientation == Configuration.ORIENTATION_PORTRAIT) { - XposedHelpers.setObjectField(viewGroup, "mMaxAllowedRows", mRows) - } else { - XposedHelpers.setObjectField(viewGroup, "mMaxAllowedRows", mRowsHorizontal) - } - viewGroup.requestLayout() + findMethod("com.android.systemui.qs.MiuiTileLayout") { + name == "updateResources" + }.hookAfter { + //展开时的行数 + val viewGroup = it.thisObject as ViewGroup + val mConfiguration: Configuration = viewGroup.context.resources.configuration + if (mConfiguration.orientation == Configuration.ORIENTATION_PORTRAIT) { + XposedHelpers.setObjectField(viewGroup, "mMaxAllowedRows", mRows) + } else { + XposedHelpers.setObjectField(viewGroup, "mMaxAllowedRows", mRowsHorizontal) } + viewGroup.requestLayout() } } - } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/RemoveLockScreenCamera.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/RemoveLockScreenCamera.kt index 542234a7..d71234c9 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/RemoveLockScreenCamera.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/RemoveLockScreenCamera.kt @@ -2,34 +2,41 @@ package com.lt2333.simplicitytools.hook.app.systemui import android.view.View import android.widget.LinearLayout -import com.lt2333.simplicitytools.util.getObjectField +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.getObject +import com.github.kyuubiran.ezxhelper.utils.hookAfter +import com.github.kyuubiran.ezxhelper.utils.hookBefore import com.lt2333.simplicitytools.util.hasEnable -import com.lt2333.simplicitytools.util.hookAfterMethod -import com.lt2333.simplicitytools.util.hookBeforeMethod import com.lt2333.simplicitytools.util.xposed.base.HookRegister -object RemoveLockScreenCamera: HookRegister() { +object RemoveLockScreenCamera : HookRegister() { override fun init() { //屏蔽右下角组件显示 - "com.android.systemui.statusbar.phone.KeyguardBottomAreaView".hookAfterMethod(getDefaultClassLoader(), "onFinishInflate") { + findMethod("com.android.systemui.statusbar.phone.KeyguardBottomAreaView") { + name == "onFinishInflate" + }.hookAfter { hasEnable("remove_lock_screen_camera") { - (it.thisObject.getObjectField("mRightAffordanceViewLayout") as LinearLayout).visibility = View.GONE + (it.thisObject.getObject("mRightAffordanceViewLayout") as LinearLayout).visibility = + View.GONE } } //屏蔽滑动撞墙动画 - "com.android.keyguard.KeyguardMoveRightController".hookBeforeMethod(getDefaultClassLoader(), "onTouchMove", Float::class.java, Float::class.java) { + findMethod("com.android.keyguard.KeyguardMoveRightController") { + name == "onTouchMove" && parameterCount == 2 + }.hookBefore { hasEnable("remove_lock_screen_camera") { it.result = false } } - "com.android.keyguard.KeyguardMoveRightController".hookBeforeMethod(getDefaultClassLoader(), "reset") { + findMethod("com.android.keyguard.KeyguardMoveRightController") { + name == "reset" + }.hookBefore { hasEnable("remove_lock_screen_camera") { it.result = null } } } - } diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/RemoveTheLeftSideOfTheLockScreen.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/RemoveTheLeftSideOfTheLockScreen.kt index 6b55502e..a4a31ee9 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/RemoveTheLeftSideOfTheLockScreen.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/RemoveTheLeftSideOfTheLockScreen.kt @@ -1,17 +1,18 @@ package com.lt2333.simplicitytools.hook.app.systemui +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookBefore import com.lt2333.simplicitytools.util.hasEnable -import com.lt2333.simplicitytools.util.hookBeforeMethod import com.lt2333.simplicitytools.util.xposed.base.HookRegister -object RemoveTheLeftSideOfTheLockScreen: HookRegister() { - +object RemoveTheLeftSideOfTheLockScreen : HookRegister() { override fun init() { - "com.android.keyguard.negative.MiuiKeyguardMoveLeftViewContainer".hookBeforeMethod(getDefaultClassLoader(), "inflateLeftView") { + findMethod("com.android.keyguard.negative.MiuiKeyguardMoveLeftViewContainer") { + name == "inflateLeftView" + }.hookBefore { hasEnable("remove_the_left_side_of_the_lock_screen") { it.result = null } } } - } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/StatusBarBigMobileTypeIcon.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/StatusBarBigMobileTypeIcon.kt index 08b4ab67..b3358271 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/StatusBarBigMobileTypeIcon.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/StatusBarBigMobileTypeIcon.kt @@ -9,121 +9,116 @@ import android.view.ViewGroup import android.widget.ImageView import android.widget.LinearLayout import android.widget.TextView +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookAfter +import com.github.kyuubiran.ezxhelper.utils.hookReturnConstant import com.lt2333.simplicitytools.util.XSPUtils import com.lt2333.simplicitytools.util.hasEnable -import com.lt2333.simplicitytools.util.hookAfterMethod -import com.lt2333.simplicitytools.util.hookBeforeMethod import com.lt2333.simplicitytools.util.xposed.base.HookRegister import de.robv.android.xposed.XposedHelpers -object StatusBarBigMobileTypeIcon: HookRegister() { +object StatusBarBigMobileTypeIcon : HookRegister() { private val upAndDownPosition = XSPUtils.getInt("big_mobile_type_icon_up_and_down_position", 0) - private val leftAndRightMargin = XSPUtils.getInt("big_mobile_type_icon_left_and_right_margins", 0) + private val leftAndRightMargin = + XSPUtils.getInt("big_mobile_type_icon_left_and_right_margins", 0) private val isBold = XSPUtils.getBoolean("big_mobile_type_icon_bold", true) private val size = XSPUtils.getFloat("big_mobile_type_icon_size", 12.5f) - override fun init() { - hasEnable("big_mobile_type_icon") { - "com.android.systemui.statusbar.StatusBarMobileView".hookAfterMethod( - getDefaultClassLoader(), - "init" - ) { - val statusBarMobileView = it.thisObject as ViewGroup - val context: Context = statusBarMobileView.context - val res: Resources = context.resources + override fun init() = hasEnable("big_mobile_type_icon") { + findMethod("com.android.systemui.statusbar.StatusBarMobileView") { + name == "init" + }.hookAfter { + val statusBarMobileView = it.thisObject as ViewGroup + val context: Context = statusBarMobileView.context + val res: Resources = context.resources - //获取组件 - val mobileContainerLeftId: Int = - res.getIdentifier("mobile_container_left", "id", "com.android.systemui") - val mobileContainerLeft = - statusBarMobileView.findViewById(mobileContainerLeftId) + //获取组件 + val mobileContainerLeftId: Int = + res.getIdentifier("mobile_container_left", "id", "com.android.systemui") + val mobileContainerLeft = + statusBarMobileView.findViewById(mobileContainerLeftId) - val mobileTypeId: Int = - res.getIdentifier("mobile_type", "id", "com.android.systemui") - val mobileType = statusBarMobileView.findViewById(mobileTypeId) + val mobileTypeId: Int = + res.getIdentifier("mobile_type", "id", "com.android.systemui") + val mobileType = statusBarMobileView.findViewById(mobileTypeId) - val mobileLeftMobileInoutId: Int = res.getIdentifier( - "mobile_left_mobile_inout", - "id", - "com.android.systemui" - ) - val mobileLeftMobileInout = - statusBarMobileView.findViewById(mobileLeftMobileInoutId) + val mobileLeftMobileInoutId: Int = res.getIdentifier( + "mobile_left_mobile_inout", + "id", + "com.android.systemui" + ) + val mobileLeftMobileInout = + statusBarMobileView.findViewById(mobileLeftMobileInoutId) - //获取插入位置 - val mobileContainerRightId: Int = res.getIdentifier( - "mobile_container_right", - "id", - "com.android.systemui" - ) - val mobileContainerRight = - statusBarMobileView.findViewById(mobileContainerRightId) - val rightParentLayout = mobileContainerRight.parent as ViewGroup - val mobileContainerRightIndex = - rightParentLayout.indexOfChild(mobileContainerRight) + //获取插入位置 + val mobileContainerRightId: Int = res.getIdentifier( + "mobile_container_right", + "id", + "com.android.systemui" + ) + val mobileContainerRight = + statusBarMobileView.findViewById(mobileContainerRightId) + val rightParentLayout = mobileContainerRight.parent as ViewGroup + val mobileContainerRightIndex = + rightParentLayout.indexOfChild(mobileContainerRight) - //创建新布局 - val newLinearLayoutLP = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.WRAP_CONTENT, - LinearLayout.LayoutParams.MATCH_PARENT - ).also { + //创建新布局 + val newLinearLayoutLP = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.MATCH_PARENT + ).also { - } - val newLinearlayout = LinearLayout(context).also { - it.layoutParams = newLinearLayoutLP - it.id = mobileContainerLeftId - it.setPadding(leftAndRightMargin, 0, leftAndRightMargin, 0) - } - XposedHelpers.setObjectField(it.thisObject, "mMobileLeftContainer", newLinearlayout) - rightParentLayout.addView( - newLinearlayout, - mobileContainerRightIndex - ) - - //将组件插入新的布局 - (mobileType.parent as ViewGroup).removeView(mobileType) - (mobileLeftMobileInout.parent as ViewGroup).removeView(mobileLeftMobileInout) - (mobileContainerLeft.parent as ViewGroup).removeView(mobileContainerLeft) - - - newLinearlayout.addView(mobileType) //类型 - val mobileTypeLp = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.WRAP_CONTENT, - LinearLayout.LayoutParams.WRAP_CONTENT - ).also { - it.gravity = Gravity.CENTER_VERTICAL - it.topMargin = upAndDownPosition - } - mobileType.also { - it.setTextSize(TypedValue.COMPLEX_UNIT_DIP, size) - if (isBold) { - it.typeface = Typeface.DEFAULT_BOLD - } - it.layoutParams = mobileTypeLp - } - - - newLinearlayout.addView(mobileLeftMobileInout) //箭头 - val mobileLeftMobileInoutLp = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.WRAP_CONTENT, - LinearLayout.LayoutParams.MATCH_PARENT - ) - mobileLeftMobileInout.also { - it.layoutParams = mobileLeftMobileInoutLp - } - - //屏蔽更新布局 - "com.android.systemui.statusbar.StatusBarMobileView".hookBeforeMethod( - getDefaultClassLoader(), - "updateMobileTypeLayout", String::class.java - ) { - it.result = null - } } + val newLinearlayout = LinearLayout(context).also { + it.layoutParams = newLinearLayoutLP + it.id = mobileContainerLeftId + it.setPadding(leftAndRightMargin, 0, leftAndRightMargin, 0) + } + XposedHelpers.setObjectField(it.thisObject, "mMobileLeftContainer", newLinearlayout) + rightParentLayout.addView( + newLinearlayout, + mobileContainerRightIndex + ) + + //将组件插入新的布局 + (mobileType.parent as ViewGroup).removeView(mobileType) + (mobileLeftMobileInout.parent as ViewGroup).removeView(mobileLeftMobileInout) + (mobileContainerLeft.parent as ViewGroup).removeView(mobileContainerLeft) + + + newLinearlayout.addView(mobileType) //类型 + val mobileTypeLp = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ).also { + it.gravity = Gravity.CENTER_VERTICAL + it.topMargin = upAndDownPosition + } + mobileType.also { + it.setTextSize(TypedValue.COMPLEX_UNIT_DIP, size) + if (isBold) { + it.typeface = Typeface.DEFAULT_BOLD + } + it.layoutParams = mobileTypeLp + } + + + newLinearlayout.addView(mobileLeftMobileInout) //箭头 + val mobileLeftMobileInoutLp = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.MATCH_PARENT + ) + mobileLeftMobileInout.also { + it.layoutParams = mobileLeftMobileInoutLp + } + + //屏蔽更新布局 + findMethod("com.android.systemui.statusbar.StatusBarMobileView") { + name == "updateMobileTypeLayout" && parameterTypes[0] == String::class.java + }.hookReturnConstant(null) } } - } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/StatusBarDoubleTapToSleep.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/StatusBarDoubleTapToSleep.kt index ae368bc1..d0e75c24 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/StatusBarDoubleTapToSleep.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/StatusBarDoubleTapToSleep.kt @@ -1,69 +1,62 @@ package com.lt2333.simplicitytools.hook.app.systemui -import android.annotation.SuppressLint import android.content.Context import android.os.SystemClock import android.view.MotionEvent import android.view.View.OnTouchListener import android.view.ViewGroup -import com.lt2333.simplicitytools.util.findClass +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookBefore import com.lt2333.simplicitytools.util.hasEnable -import com.lt2333.simplicitytools.util.hookBeforeMethod import com.lt2333.simplicitytools.util.xposed.base.HookRegister import de.robv.android.xposed.XposedHelpers -object StatusBarDoubleTapToSleep: HookRegister() { - - @SuppressLint("ClickableViewAccessibility") - override fun init() { - hasEnable("status_bar_double_tap_to_sleep") { - "com.android.systemui.statusbar.phone.MiuiPhoneStatusBarView".findClass( - getDefaultClassLoader() - ).hookBeforeMethod( - "onFinishInflate" - ) { - val view = it.thisObject as ViewGroup - XposedHelpers.setAdditionalInstanceField(view, "currentTouchTime", 0L) - XposedHelpers.setAdditionalInstanceField(view, "currentTouchX", 0f) - XposedHelpers.setAdditionalInstanceField(view, "currentTouchY", 0f) - view.setOnTouchListener(OnTouchListener { v, event -> - if (event.action != MotionEvent.ACTION_DOWN) return@OnTouchListener false - var currentTouchTime = - XposedHelpers.getAdditionalInstanceField(view, "currentTouchTime") as Long - var currentTouchX = - XposedHelpers.getAdditionalInstanceField(view, "currentTouchX") as Float - var currentTouchY = - XposedHelpers.getAdditionalInstanceField(view, "currentTouchY") as Float - val lastTouchTime = currentTouchTime - val lastTouchX = currentTouchX - val lastTouchY = currentTouchY - currentTouchTime = System.currentTimeMillis() - currentTouchX = event.x - currentTouchY = event.y - if (currentTouchTime - lastTouchTime < 250L && Math.abs(currentTouchX - lastTouchX) < 100f && Math.abs( - currentTouchY - lastTouchY - ) < 100f - ) { - XposedHelpers.callMethod( - v.context.getSystemService(Context.POWER_SERVICE), - "goToSleep", - SystemClock.uptimeMillis() - ) - currentTouchTime = 0L - currentTouchX = 0f - currentTouchY = 0f - } - XposedHelpers.setAdditionalInstanceField( - view, - "currentTouchTime", - currentTouchTime +object StatusBarDoubleTapToSleep : HookRegister() { + override fun init() = hasEnable("status_bar_double_tap_to_sleep") { + findMethod("com.android.systemui.statusbar.phone.MiuiPhoneStatusBarView") { + name == "onFinishInflate" + }.hookBefore { + val view = it.thisObject as ViewGroup + XposedHelpers.setAdditionalInstanceField(view, "currentTouchTime", 0L) + XposedHelpers.setAdditionalInstanceField(view, "currentTouchX", 0f) + XposedHelpers.setAdditionalInstanceField(view, "currentTouchY", 0f) + view.setOnTouchListener(OnTouchListener { v, event -> + if (event.action != MotionEvent.ACTION_DOWN) return@OnTouchListener false + var currentTouchTime = + XposedHelpers.getAdditionalInstanceField(view, "currentTouchTime") as Long + var currentTouchX = + XposedHelpers.getAdditionalInstanceField(view, "currentTouchX") as Float + var currentTouchY = + XposedHelpers.getAdditionalInstanceField(view, "currentTouchY") as Float + val lastTouchTime = currentTouchTime + val lastTouchX = currentTouchX + val lastTouchY = currentTouchY + currentTouchTime = System.currentTimeMillis() + currentTouchX = event.x + currentTouchY = event.y + if (currentTouchTime - lastTouchTime < 250L && Math.abs(currentTouchX - lastTouchX) < 100f && Math.abs( + currentTouchY - lastTouchY + ) < 100f + ) { + XposedHelpers.callMethod( + v.context.getSystemService(Context.POWER_SERVICE), + "goToSleep", + SystemClock.uptimeMillis() ) - XposedHelpers.setAdditionalInstanceField(view, "currentTouchX", currentTouchX) - XposedHelpers.setAdditionalInstanceField(view, "currentTouchY", currentTouchY) - false - }) - } + currentTouchTime = 0L + currentTouchX = 0f + currentTouchY = 0f + } + XposedHelpers.setAdditionalInstanceField( + view, + "currentTouchTime", + currentTouchTime + ) + XposedHelpers.setAdditionalInstanceField(view, "currentTouchX", currentTouchX) + XposedHelpers.setAdditionalInstanceField(view, "currentTouchY", currentTouchY) + v.performClick() + false + }) } } - } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/StatusBarLayout.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/StatusBarLayout.kt index 07609308..fa22fe2b 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/StatusBarLayout.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/StatusBarLayout.kt @@ -1,11 +1,9 @@ package com.lt2333.simplicitytools.hook.app.systemui -import android.annotation.SuppressLint import android.app.KeyguardManager import android.content.Context import android.content.res.Configuration import android.content.res.Resources -import android.os.Bundle import android.view.Gravity import android.view.View import android.view.ViewGroup @@ -13,45 +11,53 @@ import android.widget.LinearLayout import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout import cn.fkj233.ui.activity.dp2px +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.getObject +import com.github.kyuubiran.ezxhelper.utils.hookAfter import com.lt2333.simplicitytools.util.XSPUtils -import com.lt2333.simplicitytools.util.findClass -import com.lt2333.simplicitytools.util.getObjectField -import com.lt2333.simplicitytools.util.hookAfterMethod +import com.lt2333.simplicitytools.util.hasEnable import com.lt2333.simplicitytools.util.xposed.base.HookRegister import de.robv.android.xposed.XposedHelpers -@SuppressLint("StaticFieldLeak") object StatusBarLayout : HookRegister() { - private var mLeftLayout: LinearLayout? = null - private var mRightLayout: LinearLayout? = null - private var mCenterLayout: LinearLayout? = null - private var statusBar: ViewGroup? = null - private var statusBarLeft = 0 private var statusBarTop = 0 private var statusBarRight = 0 private var statusBarBottom = 0 override fun init() { + var mLeftLayout: LinearLayout? = null + var mRightLayout: LinearLayout? = null + var mCenterLayout: LinearLayout? = null + var statusBar: ViewGroup? = null + + fun updateLayout(context: Context) { + //判断屏幕方向 + val mConfiguration: Configuration = context.resources.configuration + if (mConfiguration.orientation == Configuration.ORIENTATION_PORTRAIT) { + mLeftLayout!!.setPadding(statusBarLeft, 0, 0, 0) + mRightLayout!!.setPadding(0, 0, statusBarRight, 0) + statusBar!!.setPadding(0, statusBarTop, 0, statusBarBottom) + } else { + //横屏状态 + mLeftLayout!!.setPadding(175, 0, 0, 0) + mRightLayout!!.setPadding(0, 0, 175, 0) + statusBar!!.setPadding(0, statusBarTop, 0, statusBarBottom) + } + } + when (XSPUtils.getInt("status_bar_layout_mode", 0)) { //默认 0 -> return //时钟居中 1 -> { - val collapsedStatusBarFragmentClass = - "com.android.systemui.statusbar.phone.CollapsedStatusBarFragment".findClass( - getDefaultClassLoader() - ) - - collapsedStatusBarFragmentClass.hookAfterMethod( - "onViewCreated", - View::class.java, - Bundle::class.java - ) { param -> + findMethod("com.android.systemui.statusbar.phone.CollapsedStatusBarFragment") { + name == "onViewCreated" && parameterCount == 2 + }.hookAfter { val MiuiPhoneStatusBarView: ViewGroup = - param.thisObject.getObjectField("mStatusBar") as ViewGroup + it.thisObject.getObject("mStatusBar") as ViewGroup val context: Context = MiuiPhoneStatusBarView.context val res: Resources = MiuiPhoneStatusBarView.resources val statusBarId: Int = @@ -76,7 +82,7 @@ object StatusBarLayout : HookRegister() { statusBar = MiuiPhoneStatusBarView.findViewById(statusBarId) val statusBarContents: ViewGroup = MiuiPhoneStatusBarView.findViewById(statusBarContentsId) - if (statusBar == null) return@hookAfterMethod + if (statusBar == null) return@hookAfter val clock: TextView = MiuiPhoneStatusBarView.findViewById(clockId) val phoneStatusBarLeftContainer: ViewGroup = MiuiPhoneStatusBarView.findViewById(phoneStatusBarLeftContainerId) @@ -159,13 +165,11 @@ object StatusBarLayout : HookRegister() { updateLayout(context) } } - val phoneStatusBarViewClass = - "com.android.systemui.statusbar.phone.PhoneStatusBarView".findClass( - getDefaultClassLoader() - ) - phoneStatusBarViewClass.hookAfterMethod("updateLayoutForCutout") { - if (XSPUtils.getBoolean("layout_compatibility_mode", false)) { + findMethod("com.android.systemui.statusbar.phone.PhoneStatusBarView") { + name == "updateLayoutForCutout" + }.hookAfter { + hasEnable("layout_compatibility_mode") { val context = (it.thisObject as ViewGroup).context updateLayout(context) } @@ -173,18 +177,11 @@ object StatusBarLayout : HookRegister() { } //时钟居右 2 -> { - val collapsedStatusBarFragmentClass = - "com.android.systemui.statusbar.phone.CollapsedStatusBarFragment".findClass( - getDefaultClassLoader() - ) - - collapsedStatusBarFragmentClass.hookAfterMethod( - "onViewCreated", - View::class.java, - Bundle::class.java - ) { param -> - val MiuiPhoneStatusBarView: ViewGroup = - param.thisObject.getObjectField("mStatusBar") as ViewGroup + findMethod("com.android.systemui.statusbar.phone.CollapsedStatusBarFragment") { + name == "onViewCreated" && parameterCount == 2 + }.hookAfter { + val MiuiPhoneStatusBarView = + it.thisObject.getObject("mStatusBar") as ViewGroup val context: Context = MiuiPhoneStatusBarView.context val res: Resources = MiuiPhoneStatusBarView.resources @@ -196,7 +193,7 @@ object StatusBarLayout : HookRegister() { //查找组件 statusBar = MiuiPhoneStatusBarView.findViewById(statusBarId) - if (statusBar == null) return@hookAfterMethod + if (statusBar == null) return@hookAfter val clock: TextView = MiuiPhoneStatusBarView.findViewById(clockId) val battery: ViewGroup = MiuiPhoneStatusBarView.findViewById(batteryId) @@ -219,18 +216,11 @@ object StatusBarLayout : HookRegister() { } //时钟居中+图标居左 3 -> { - val collapsedStatusBarFragmentClass = - "com.android.systemui.statusbar.phone.CollapsedStatusBarFragment".findClass( - getDefaultClassLoader() - ) - - collapsedStatusBarFragmentClass.hookAfterMethod( - "onViewCreated", - View::class.java, - Bundle::class.java - ) { param -> - val MiuiPhoneStatusBarView: ViewGroup = - param.thisObject.getObjectField("mStatusBar") as ViewGroup + findMethod("com.android.systemui.statusbar.phone.CollapsedStatusBarFragment") { + name == "onViewCreated" && parameterCount == 2 + }.hookAfter { + val MiuiPhoneStatusBarView = + it.thisObject.getObject("mStatusBar") as ViewGroup val context: Context = MiuiPhoneStatusBarView.context val res: Resources = MiuiPhoneStatusBarView.resources val statusBarId: Int = @@ -280,7 +270,7 @@ object StatusBarLayout : HookRegister() { statusBar = MiuiPhoneStatusBarView.findViewById(statusBarId) val statusBarContents: ViewGroup = MiuiPhoneStatusBarView.findViewById(statusBarContentsId) - if (statusBar == null) return@hookAfterMethod + if (statusBar == null) return@hookAfter val clock: TextView = MiuiPhoneStatusBarView.findViewById(clockId) val phoneStatusBarLeftContainer: ViewGroup = MiuiPhoneStatusBarView.findViewById(phoneStatusBarLeftContainerId) @@ -399,26 +389,19 @@ object StatusBarLayout : HookRegister() { } } //兼容模式 - val phoneStatusBarViewClass = - "com.android.systemui.statusbar.phone.PhoneStatusBarView".findClass( - getDefaultClassLoader() - ) - phoneStatusBarViewClass.hookAfterMethod("updateLayoutForCutout") { + findMethod("com.android.systemui.statusbar.phone.PhoneStatusBarView") { + name == "updateLayoutForCutout" + }.hookAfter { if (XSPUtils.getBoolean("layout_compatibility_mode", false)) { val context = (it.thisObject as ViewGroup).context updateLayout(context) } } - //解决重叠 - val miuiCollapsedStatusBarFragmentClass = - "com.android.systemui.statusbar.phone.MiuiCollapsedStatusBarFragment".findClass( - getDefaultClassLoader() - ) - miuiCollapsedStatusBarFragmentClass.hookAfterMethod( - "showClock", - Boolean::class.java - ) { + //解决重叠 + findMethod("com.android.systemui.statusbar.phone.MiuiCollapsedStatusBarFragment") { + name == "showClock" && parameterTypes[0] == Boolean::class.java + }.hookAfter { val MiuiPhoneStatusBarView = XposedHelpers.getObjectField(it.thisObject, "mStatusBar") as ViewGroup val res = MiuiPhoneStatusBarView.resources @@ -436,21 +419,8 @@ object StatusBarLayout : HookRegister() { } } } - } - private fun updateLayout(context: Context) { - //判断屏幕方向 - val mConfiguration: Configuration = context.resources.configuration - if (mConfiguration.orientation == Configuration.ORIENTATION_PORTRAIT) { - mLeftLayout!!.setPadding(statusBarLeft, 0, 0, 0) - mRightLayout!!.setPadding(0, 0, statusBarRight, 0) - statusBar!!.setPadding(0, statusBarTop, 0, statusBarBottom) - } else { - //横屏状态 - mLeftLayout!!.setPadding(175, 0, 0, 0) - mRightLayout!!.setPadding(0, 0, 175, 0) - statusBar!!.setPadding(0, statusBarTop, 0, statusBarBottom) - } + } } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/StatusBarNetworkSpeedRefreshSpeed.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/StatusBarNetworkSpeedRefreshSpeed.kt index 6808a24c..f5cb6168 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/StatusBarNetworkSpeedRefreshSpeed.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/StatusBarNetworkSpeedRefreshSpeed.kt @@ -1,17 +1,18 @@ package com.lt2333.simplicitytools.hook.app.systemui +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookBefore import com.lt2333.simplicitytools.util.hasEnable -import com.lt2333.simplicitytools.util.hookBeforeMethod import com.lt2333.simplicitytools.util.xposed.base.HookRegister -object StatusBarNetworkSpeedRefreshSpeed: HookRegister() { - +object StatusBarNetworkSpeedRefreshSpeed : HookRegister() { override fun init() { - "com.android.systemui.statusbar.policy.NetworkSpeedController".hookBeforeMethod(getDefaultClassLoader(), "postUpdateNetworkSpeedDelay", Long::class.java) { + findMethod("com.android.systemui.statusbar.policy.NetworkSpeedController") { + name == "postUpdateNetworkSpeedDelay" && parameterTypes[0] == Long::class.java + }.hookBefore { hasEnable("status_bar_network_speed_refresh_speed") { it.args[0] = 1000L } } } - } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/StatusBarTimeCustomization.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/StatusBarTimeCustomization.kt index 97359808..a0238005 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/StatusBarTimeCustomization.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/systemui/StatusBarTimeCustomization.kt @@ -3,16 +3,14 @@ package com.lt2333.simplicitytools.hook.app.systemui import android.annotation.SuppressLint import android.content.Context import android.content.res.Resources -import android.os.Bundle import android.os.Handler import android.provider.Settings -import android.util.AttributeSet import android.util.TypedValue import android.view.Gravity -import android.view.View import android.view.ViewGroup import android.widget.TextView -import com.lt2333.simplicitytools.util.* +import com.github.kyuubiran.ezxhelper.utils.* +import com.lt2333.simplicitytools.util.XSPUtils import com.lt2333.simplicitytools.util.xposed.base.HookRegister import java.lang.reflect.Method import java.text.SimpleDateFormat @@ -41,17 +39,14 @@ object StatusBarTimeCustomization : HookRegister() { override fun init() { if (isOpen) { var c: Context? = null - val miuiClockClass = - "com.android.systemui.statusbar.views.MiuiClock".findClass(getDefaultClassLoader()) - miuiClockClass.hookAfterConstructor( - Context::class.java, - AttributeSet::class.java, - Integer.TYPE - ) { + + findConstructor("com.android.systemui.statusbar.views.MiuiClock") { + paramCount == 3 + }.hookAfter { try { c = it.args[0] as Context val textV = it.thisObject as TextView - if (textV.resources.getResourceEntryName(textV.id) != "clock") return@hookAfterConstructor + if (textV.resources.getResourceEntryName(textV.id) != "clock") return@hookAfter textV.isSingleLine = false if (isDoubleLine) { str = "\n" @@ -79,10 +74,13 @@ object StatusBarTimeCustomization : HookRegister() { } } Timer().scheduleAtFixedRate(T(), 1000 - System.currentTimeMillis() % 1000, 1000) - } catch (e: java.lang.Exception) { + } catch (e: Exception) { } } - miuiClockClass.hookAfterMethod("updateTime") { + + findMethod("com.android.systemui.statusbar.views.MiuiClock") { + name == "updateTime" + }.hookAfter { try { val textV = it.thisObject as TextView if (textV.resources.getResourceEntryName(textV.id) == "clock") { @@ -97,18 +95,13 @@ object StatusBarTimeCustomization : HookRegister() { } catch (e: Exception) { } } + if (isCenterAlign) { - val collapsedStatusBarFragmentClass = - "com.android.systemui.statusbar.phone.CollapsedStatusBarFragment".findClass( - getDefaultClassLoader() - ) - collapsedStatusBarFragmentClass.hookAfterMethod( - "onViewCreated", - View::class.java, - Bundle::class.java - ) { - val MiuiPhoneStatusBarView: ViewGroup = - it.thisObject.getObjectField("mStatusBar") as ViewGroup + findMethod("com.android.systemui.statusbar.phone.CollapsedStatusBarFragment") { + name == "onViewCreated" && parameterCount == 2 + }.hookAfter { + val MiuiPhoneStatusBarView = + it.thisObject.getObject("mStatusBar") as ViewGroup val res: Resources = MiuiPhoneStatusBarView.resources val clockId: Int = res.getIdentifier("clock", "id", "com.android.systemui") val clock: TextView = MiuiPhoneStatusBarView.findViewById(clockId) diff --git a/app/src/main/java/com/lt2333/simplicitytools/hook/app/thememanager/RemoveAds.kt b/app/src/main/java/com/lt2333/simplicitytools/hook/app/thememanager/RemoveAds.kt index 3d3d065e..0543328b 100644 --- a/app/src/main/java/com/lt2333/simplicitytools/hook/app/thememanager/RemoveAds.kt +++ b/app/src/main/java/com/lt2333/simplicitytools/hook/app/thememanager/RemoveAds.kt @@ -1,18 +1,18 @@ package com.lt2333.simplicitytools.hook.app.thememanager -import com.lt2333.simplicitytools.util.findClass +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookBefore import com.lt2333.simplicitytools.util.hasEnable -import com.lt2333.simplicitytools.util.hookBeforeMethod import com.lt2333.simplicitytools.util.xposed.base.HookRegister object RemoveAds : HookRegister() { - override fun init() { - "com.android.thememanager.basemodule.ad.model.AdInfoResponse".hookBeforeMethod(getDefaultClassLoader(), "isAdValid", "com.android.thememanager.basemodule.ad.model.AdInfo".findClass(getDefaultClassLoader())) { + findMethod("com.android.thememanager.basemodule.ad.model.AdInfoResponse") { + name == "isAdValid" && parameterCount == 1 + }.hookBefore { hasEnable("remove_thememanager_ads") { it.result = false } } } - } \ No newline at end of file diff --git a/app/src/main/java/com/lt2333/simplicitytools/util/KotlinXposedHelper.kt b/app/src/main/java/com/lt2333/simplicitytools/util/KotlinXposedHelper.kt deleted file mode 100644 index fa2edf5d..00000000 --- a/app/src/main/java/com/lt2333/simplicitytools/util/KotlinXposedHelper.kt +++ /dev/null @@ -1,502 +0,0 @@ -package com.lt2333.simplicitytools.util - -import android.content.res.XResources -import android.util.Log -import dalvik.system.BaseDexClassLoader -import de.robv.android.xposed.XC_MethodHook -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_LayoutInflated -import java.lang.reflect.Field -import java.lang.reflect.Member -import java.util.* - -const val TAG = "SimplicityTools" - -fun log(any: Any?, online: Boolean = false) { - val msg: String = if (any is Throwable) Log.getStackTraceString(any) else any.toString() -// Log.d(TAG, msg) - XposedBridge.log("$TAG: $msg") -} - -typealias MethodHookParam = XC_MethodHook.MethodHookParam -typealias Replacer = (XC_MethodHook.MethodHookParam) -> Any? -typealias Hooker = (XC_MethodHook.MethodHookParam) -> Unit - -fun Class<*>.hookMethod(method: String?, vararg args: Any?) = try { - XposedHelpers.findAndHookMethod(this, method, *args) -} catch (e: NoSuchMethodError) { - log(e) - null -} catch (e: XposedHelpers.ClassNotFoundError) { - log(e) - null -} catch (e: ClassNotFoundException) { - log(e) - null -} - -fun Member.hookMethod(callback: XC_MethodHook) = try { - XposedBridge.hookMethod(this, callback) -} catch (e: Throwable) { - log(e) - null -} - -inline fun XC_MethodHook.MethodHookParam.callHooker(crossinline hooker: Hooker) = try { - hooker(this) -} catch (e: Throwable) { - log("Error occurred calling hooker on ${this.method}") - log(e) -} - -inline fun XC_MethodHook.MethodHookParam.callReplacer(crossinline replacer: Replacer) = try { - replacer(this) -} catch (e: Throwable) { - log("Error occurred calling replacer on ${this.method}") - log(e) - null -} - -inline fun Member.replaceMethod(crossinline replacer: Replacer) = - hookMethod(object : XC_MethodReplacement() { - override fun replaceHookedMethod(param: MethodHookParam) = param.callReplacer(replacer) - }) - -inline fun Member.hookAfterMethod(crossinline hooker: Hooker) = - hookMethod(object : XC_MethodHook() { - override fun afterHookedMethod(param: MethodHookParam) = param.callHooker(hooker) - }) - -inline fun Member.hookBeforeMethod(crossinline hooker: (XC_MethodHook.MethodHookParam) -> Unit) = - hookMethod(object : XC_MethodHook() { - override fun beforeHookedMethod(param: MethodHookParam) = param.callHooker(hooker) - }) - -inline fun Class<*>.hookBeforeMethod( - method: String?, - vararg args: Any?, - crossinline hooker: Hooker -) = hookMethod(method, *args, object : XC_MethodHook() { - override fun beforeHookedMethod(param: MethodHookParam) = param.callHooker(hooker) -}) - -inline fun Class<*>.hookAfterMethod( - method: String?, - vararg args: Any?, - crossinline hooker: Hooker -) = hookMethod(method, *args, object : XC_MethodHook() { - override fun afterHookedMethod(param: MethodHookParam) = param.callHooker(hooker) -}) - -inline fun Class<*>.replaceMethod( - method: String?, - vararg args: Any?, - crossinline replacer: Replacer -) = hookMethod(method, *args, object : XC_MethodReplacement() { - override fun replaceHookedMethod(param: MethodHookParam) = param.callReplacer(replacer) -}) - -fun Class<*>.hookAllMethods(methodName: String?, hooker: XC_MethodHook): Set = - try { - XposedBridge.hookAllMethods(this, methodName, hooker) - } catch (e: NoSuchMethodError) { - log(e) - emptySet() - } catch (e: XposedHelpers.ClassNotFoundError) { - log(e) - emptySet() - } catch (e: ClassNotFoundException) { - log(e) - emptySet() - } - -inline fun Class<*>.hookBeforeAllMethods(methodName: String?, crossinline hooker: Hooker) = - hookAllMethods(methodName, object : XC_MethodHook() { - override fun beforeHookedMethod(param: MethodHookParam) = param.callHooker(hooker) - }) - -inline fun Class<*>.hookAfterAllMethods(methodName: String?, crossinline hooker: Hooker) = - hookAllMethods(methodName, object : XC_MethodHook() { - override fun afterHookedMethod(param: MethodHookParam) = param.callHooker(hooker) - - }) - -inline fun Class<*>.replaceAfterAllMethods(methodName: String?, crossinline replacer: Replacer) = - hookAllMethods(methodName, object : XC_MethodReplacement() { - override fun replaceHookedMethod(param: MethodHookParam) = param.callReplacer(replacer) - }) - -fun Class<*>.hookConstructor(vararg args: Any?) = try { - XposedHelpers.findAndHookConstructor(this, *args) -} catch (e: NoSuchMethodError) { - log(e) - null -} catch (e: XposedHelpers.ClassNotFoundError) { - log(e) - null -} catch (e: ClassNotFoundException) { - log(e) - null -} - -inline fun Class<*>.hookBeforeConstructor(vararg args: Any?, crossinline hooker: Hooker) = - hookConstructor(*args, object : XC_MethodHook() { - override fun beforeHookedMethod(param: MethodHookParam) = param.callHooker(hooker) - }) - -inline fun Class<*>.hookAfterConstructor(vararg args: Any?, crossinline hooker: Hooker) = - hookConstructor(*args, object : XC_MethodHook() { - override fun afterHookedMethod(param: MethodHookParam) = param.callHooker(hooker) - }) - -inline fun Class<*>.replaceConstructor(vararg args: Any?, crossinline hooker: Hooker) = - hookConstructor(*args, object : XC_MethodReplacement() { - override fun replaceHookedMethod(param: MethodHookParam) = param.callHooker(hooker) - }) - -fun Class<*>.hookAllConstructors(hooker: XC_MethodHook): Set = try { - XposedBridge.hookAllConstructors(this, hooker) -} catch (e: NoSuchMethodError) { - log(e) - emptySet() -} catch (e: XposedHelpers.ClassNotFoundError) { - log(e) - emptySet() -} catch (e: ClassNotFoundException) { - log(e) - emptySet() -} - -inline fun Class<*>.hookAfterAllConstructors(crossinline hooker: Hooker) = - hookAllConstructors(object : XC_MethodHook() { - override fun afterHookedMethod(param: MethodHookParam) = param.callHooker(hooker) - }) - -inline fun Class<*>.hookBeforeAllConstructors(crossinline hooker: Hooker) = - hookAllConstructors(object : XC_MethodHook() { - override fun beforeHookedMethod(param: MethodHookParam) = param.callHooker(hooker) - }) - -inline fun Class<*>.replaceAfterAllConstructors(crossinline hooker: Hooker) = - hookAllConstructors(object : XC_MethodReplacement() { - override fun replaceHookedMethod(param: MethodHookParam) = param.callHooker(hooker) - }) - -fun String.hookMethod(classLoader: ClassLoader, method: String?, vararg args: Any?) = try { - findClass(classLoader).hookMethod(method, *args) -} catch (e: XposedHelpers.ClassNotFoundError) { - log(e) - null -} catch (e: ClassNotFoundException) { - log(e) - null -} - -inline fun String.hookBeforeMethod( - classLoader: ClassLoader, - method: String?, - vararg args: Any?, - crossinline hooker: Hooker -) = try { - findClass(classLoader).hookBeforeMethod(method, *args, hooker = hooker) -} catch (e: XposedHelpers.ClassNotFoundError) { - log(e) - null -} catch (e: ClassNotFoundException) { - log(e) - null -} - -inline fun String.hookAfterMethod( - classLoader: ClassLoader, - method: String?, - vararg args: Any?, - crossinline hooker: Hooker -) = try { - findClass(classLoader).hookAfterMethod(method, *args, hooker = hooker) -} catch (e: XposedHelpers.ClassNotFoundError) { - log(e) - null -} catch (e: ClassNotFoundException) { - log(e) - null -} - -inline fun String.replaceMethod( - classLoader: ClassLoader, - method: String?, - vararg args: Any?, - crossinline replacer: Replacer -) = try { - findClass(classLoader).replaceMethod(method, *args, replacer = replacer) -} catch (e: XposedHelpers.ClassNotFoundError) { - log(e) - null -} catch (e: ClassNotFoundException) { - log(e) - null -} - -fun XC_MethodHook.MethodHookParam.invokeOriginalMethod(): Any? = - XposedBridge.invokeOriginalMethod(method, thisObject, args) - -inline fun T.runCatchingOrNull(func: T.() -> R?) = try { - func() -} catch (e: Throwable) { - null -} - -fun Any.getObjectField(field: String?): Any? = XposedHelpers.getObjectField(this, field) - -fun Any.getObjectFieldOrNull(field: String?): Any? = runCatchingOrNull { - XposedHelpers.getObjectField(this, field) -} - -@Suppress("UNCHECKED_CAST") -fun Any.getObjectFieldAs(field: String?) = XposedHelpers.getObjectField(this, field) as T - -@Suppress("UNCHECKED_CAST") -fun Any.getObjectFieldOrNullAs(field: String?) = runCatchingOrNull { - XposedHelpers.getObjectField(this, field) as T -} - -fun Any.getIntField(field: String?) = XposedHelpers.getIntField(this, field) - -fun Any.getIntFieldOrNull(field: String?) = runCatchingOrNull { - XposedHelpers.getIntField(this, field) -} - -fun Any.getLongField(field: String?) = XposedHelpers.getLongField(this, field) - -fun Any.getLongFieldOrNull(field: String?) = runCatchingOrNull { - XposedHelpers.getLongField(this, field) -} - -fun Any.getBooleanFieldOrNull(field: String?) = runCatchingOrNull { - XposedHelpers.getBooleanField(this, field) -} - -fun Any.callMethod(methodName: String?, vararg args: Any?): Any? = - XposedHelpers.callMethod(this, methodName, *args) - -fun Any.callMethodOrNull(methodName: String?, vararg args: Any?): Any? = runCatchingOrNull { - XposedHelpers.callMethod(this, methodName, *args) -} - -fun Class<*>.callStaticMethod(methodName: String?, vararg args: Any?): Any? = - XposedHelpers.callStaticMethod(this, methodName, *args) - -fun Class<*>.callStaticMethodOrNull(methodName: String?, vararg args: Any?): Any? = - runCatchingOrNull { - XposedHelpers.callStaticMethod(this, methodName, *args) - } - -@Suppress("UNCHECKED_CAST") -fun Class<*>.callStaticMethodAs(methodName: String?, vararg args: Any?) = - XposedHelpers.callStaticMethod(this, methodName, *args) as T - -@Suppress("UNCHECKED_CAST") -fun Class<*>.callStaticMethodOrNullAs(methodName: String?, vararg args: Any?) = - runCatchingOrNull { - XposedHelpers.callStaticMethod(this, methodName, *args) as T - } - -@Suppress("UNCHECKED_CAST") -fun Class<*>.getStaticObjectFieldAs(field: String?) = XposedHelpers.getStaticObjectField( - this, - field -) as T - -@Suppress("UNCHECKED_CAST") -fun Class<*>.getStaticObjectFieldOrNullAs(field: String?) = runCatchingOrNull { - XposedHelpers.getStaticObjectField(this, field) as T -} - -fun Class<*>.getStaticObjectField(field: String?): Any? = - XposedHelpers.getStaticObjectField(this, field) - -fun Class<*>.getStaticObjectFieldOrNull(field: String?): Any? = runCatchingOrNull { - XposedHelpers.getStaticObjectField(this, field) -} - -fun Class<*>.setStaticObjectField(field: String?, obj: Any?) = apply { - XposedHelpers.setStaticObjectField(this, field, obj) -} - -fun Class<*>.setStaticObjectFieldIfExist(field: String?, obj: Any?) = apply { - try { - XposedHelpers.setStaticObjectField(this, field, obj) - } catch (ignored: Throwable) { - } -} - -inline fun Class<*>.findFieldByExactType(): Field? = - XposedHelpers.findFirstFieldByExactType(this, T::class.java) - -fun Class<*>.findFieldByExactType(type: Class<*>): Field? = - XposedHelpers.findFirstFieldByExactType(this, type) - -@Suppress("UNCHECKED_CAST") -fun Any.callMethodAs(methodName: String?, vararg args: Any?) = - XposedHelpers.callMethod(this, methodName, *args) as T - -@Suppress("UNCHECKED_CAST") -fun Any.callMethodOrNullAs(methodName: String?, vararg args: Any?) = runCatchingOrNull { - XposedHelpers.callMethod(this, methodName, *args) as T -} - -fun Any.callMethod(methodName: String?, parameterTypes: Array>, vararg args: Any?): Any? = - XposedHelpers.callMethod(this, methodName, parameterTypes, *args) - -fun Any.callMethodOrNull( - methodName: String?, - parameterTypes: Array>, - vararg args: Any? -): Any? = runCatchingOrNull { - XposedHelpers.callMethod(this, methodName, parameterTypes, *args) -} - -fun Class<*>.callStaticMethod( - methodName: String?, - parameterTypes: Array>, - vararg args: Any? -): Any? = XposedHelpers.callStaticMethod(this, methodName, parameterTypes, *args) - -fun Class<*>.callStaticMethodOrNull( - methodName: String?, - parameterTypes: Array>, - vararg args: Any? -): Any? = runCatchingOrNull { - XposedHelpers.callStaticMethod(this, methodName, parameterTypes, *args) -} - -fun String.findClass(classLoader: ClassLoader?): Class<*> = - XposedHelpers.findClass(this, classLoader) - -fun String.findClassOrNull(classLoader: ClassLoader?): Class<*>? = - XposedHelpers.findClassIfExists(this, classLoader) - -fun Class<*>.new(vararg args: Any?): Any = XposedHelpers.newInstance(this, *args) - -fun Class<*>.new(parameterTypes: Array>, vararg args: Any?): Any = - XposedHelpers.newInstance(this, parameterTypes, *args) - -fun Class<*>.findField(field: String?): Field = XposedHelpers.findField(this, field) - -fun Class<*>.findFieldOrNull(field: String?): Field? = XposedHelpers.findFieldIfExists(this, field) - -fun T.setIntField(field: String?, value: Int) = apply { - XposedHelpers.setIntField(this, field, value) -} - -fun T.setLongField(field: String?, value: Long) = apply { - XposedHelpers.setLongField(this, field, value) -} - -fun T.setFloatField(field: String?, value: Float) = apply { - XposedHelpers.setFloatField(this, field, value) -} - -fun T.setObjectField(field: String?, value: Any?) = apply { - XposedHelpers.setObjectField(this, field, value) -} - -fun T.setBooleanField(field: String?, value: Boolean) = apply { - XposedHelpers.setBooleanField(this, field, value) -} - -inline fun XResources.hookLayout( - id: Int, - crossinline hooker: (XC_LayoutInflated.LayoutInflatedParam) -> Unit -) { - try { - hookLayout(id, object : XC_LayoutInflated() { - override fun handleLayoutInflated(liparam: LayoutInflatedParam) { - try { - hooker(liparam) - } catch (e: Throwable) { - log(e) - } - } - }) - } catch (e: Throwable) { - log(e) - } -} - -inline fun XResources.hookLayout( - pkg: String, - type: String, - name: String, - crossinline hooker: (XC_LayoutInflated.LayoutInflatedParam) -> Unit -) { - try { - val id = getIdentifier(name, type, pkg) - hookLayout(id, hooker) - } catch (e: Throwable) { - log(e) - } -} - -fun Class<*>.findFirstFieldByExactType(type: Class<*>): Field = - XposedHelpers.findFirstFieldByExactType(this, type) - -fun Class<*>.findFirstFieldByExactTypeOrNull(type: Class<*>?): Field? = runCatchingOrNull { - XposedHelpers.findFirstFieldByExactType(this, type) -} - -fun Any.getFirstFieldByExactType(type: Class<*>): Any? = - javaClass.findFirstFieldByExactType(type).get(this) - -@Suppress("UNCHECKED_CAST") -fun Any.getFirstFieldByExactTypeAs(type: Class<*>) = - javaClass.findFirstFieldByExactType(type).get(this) as? T - -inline fun Any.getFirstFieldByExactType() = - javaClass.findFirstFieldByExactType(T::class.java).get(this) as? T - -fun Any.getFirstFieldByExactTypeOrNull(type: Class<*>?): Any? = runCatchingOrNull { - javaClass.findFirstFieldByExactTypeOrNull(type)?.get(this) -} - -@Suppress("UNCHECKED_CAST") -fun Any.getFirstFieldByExactTypeOrNullAs(type: Class<*>?) = - getFirstFieldByExactTypeOrNull(type) as? T - -inline fun Any.getFirstFieldByExactTypeOrNull() = - getFirstFieldByExactTypeOrNull(T::class.java) as? T - -fun ClassLoader.allClassesList(): List { - var classLoader = this - while (classLoader !is BaseDexClassLoader) { - if (classLoader.parent != null) classLoader = classLoader.parent - else return emptyList() - } - return classLoader.getObjectField("pathList") - ?.getObjectFieldAs>("dexElements") - ?.flatMap { - it.getObjectField("dexFile")?.callMethodAs>("entries")?.toList() - .orEmpty() - }.orEmpty() -} - -inline fun ClassLoader.findDexClassLoader(): BaseDexClassLoader? { - var classLoader = this - while (classLoader !is BaseDexClassLoader) { - if (classLoader.parent != null) classLoader = classLoader.parent - else return null - } - return classLoader -} - -inline fun T?.isNull(crossinline isNull: () -> Unit):T? { - if (this == null) isNull() - return this -} - -inline fun T?.isNonNull(crossinline nonNull: (T) -> Unit): T? { - if (this != null) nonNull(this) - return this -}