From c5edfd955338288cab4eeddd3bb72547f32732ea Mon Sep 17 00:00:00 2001 From: tianma8023 <1808931265@qq.com> Date: Mon, 27 May 2019 17:09:26 +0800 Subject: [PATCH] [Refactor] Wrap XposedHelpers for catching exceptions. [Fix] Bug fixes: dual mobile signal invalid issue before 9.5.7. --- app/build.gradle | 2 +- .../tweaks/miui/xp/hook/ModuleUtilsHook.java | 11 +- .../miui/xp/hook/launcher/WorkSpaceHook.java | 15 +- .../miui/xp/hook/systemui/SystemUIHook.java | 2 +- .../ChooseKeyguardClockActivityHook.java | 21 +- .../keyguard/KeyguardClockContainerHook.java | 66 ++-- .../keyguard/MiuiKeyguardClockHook.java | 320 ++++++++--------- .../MiuiKeyguardLeftTopClockHook.java | 78 ++--- .../MiuiKeyguardVerticalClockHook.java | 326 ++++++++---------- .../CollapsedStatusBarFragmentHook.java | 50 ++- .../statusbar/PhoneStatusBarViewHook.java | 26 +- .../statusbar/SignalClusterViewHook.java | 93 ++--- .../statusbar/StatusBarClockHook.java | 194 +++++------ .../miui/xp/wrapper/MethodHookWrapper.java | 32 ++ .../tweaks/miui/xp/wrapper/XposedWrapper.java | 46 +++ 15 files changed, 622 insertions(+), 660 deletions(-) create mode 100644 app/src/main/java/com/tianma/tweaks/miui/xp/wrapper/MethodHookWrapper.java create mode 100644 app/src/main/java/com/tianma/tweaks/miui/xp/wrapper/XposedWrapper.java diff --git a/app/build.gradle b/app/build.gradle index 86781b5..ee0012d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,7 +16,7 @@ android { minSdkVersion 21 targetSdkVersion 27 versionCode 8 - versionName "1.0.7" + versionName "1.0.8 beta" buildConfigField("String", "LOG_TAG", "\"XMiuiClock\"") buildConfigField("boolean", "LOG_TO_XPOSED", "true") diff --git a/app/src/main/java/com/tianma/tweaks/miui/xp/hook/ModuleUtilsHook.java b/app/src/main/java/com/tianma/tweaks/miui/xp/hook/ModuleUtilsHook.java index cd31652..b4751ea 100644 --- a/app/src/main/java/com/tianma/tweaks/miui/xp/hook/ModuleUtilsHook.java +++ b/app/src/main/java/com/tianma/tweaks/miui/xp/hook/ModuleUtilsHook.java @@ -4,11 +4,12 @@ import com.tianma.tweaks.miui.BuildConfig; import com.tianma.tweaks.miui.utils.ModuleUtils; import com.tianma.tweaks.miui.utils.XLog; +import com.tianma.tweaks.miui.xp.wrapper.MethodHookWrapper; -import de.robv.android.xposed.XC_MethodHook; -import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_LoadPackage; +import static com.tianma.tweaks.miui.xp.wrapper.XposedWrapper.findAndHookMethod; + /** * Hook class com.github.tianma8023.xposed.smscode.utils.ModuleUtils */ @@ -32,11 +33,11 @@ public void onLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwa private void hookModuleUtils(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable { String className = ModuleUtils.class.getName(); - XposedHelpers.findAndHookMethod(className, lpparam.classLoader, + findAndHookMethod(className, lpparam.classLoader, "isModuleActive", - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void beforeHookedMethod(MethodHookParam param) throws Throwable { + protected void before(MethodHookParam param) { param.setResult(true); } }); diff --git a/app/src/main/java/com/tianma/tweaks/miui/xp/hook/launcher/WorkSpaceHook.java b/app/src/main/java/com/tianma/tweaks/miui/xp/hook/launcher/WorkSpaceHook.java index 2020db9..523231c 100644 --- a/app/src/main/java/com/tianma/tweaks/miui/xp/hook/launcher/WorkSpaceHook.java +++ b/app/src/main/java/com/tianma/tweaks/miui/xp/hook/launcher/WorkSpaceHook.java @@ -3,17 +3,18 @@ import com.tianma.tweaks.miui.utils.XLog; import com.tianma.tweaks.miui.utils.XSPUtils; import com.tianma.tweaks.miui.xp.hook.BaseSubHook; +import com.tianma.tweaks.miui.xp.wrapper.MethodHookWrapper; -import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XSharedPreferences; -import de.robv.android.xposed.XposedHelpers; + +import static com.tianma.tweaks.miui.xp.wrapper.XposedWrapper.findAndHookMethod; public class WorkSpaceHook extends BaseSubHook { private static final String CLASS_WORK_SPACE = "com.miui.home.launcher.Workspace"; - + private boolean mAlwaysShowStatusBarClock; - + public WorkSpaceHook(ClassLoader classLoader, XSharedPreferences xsp) { super(classLoader, xsp); @@ -34,13 +35,13 @@ public void startHook() { // #isScreenHasClockGadget() private void hookIsScreenHasClockGadgets() { - XposedHelpers.findAndHookMethod(CLASS_WORK_SPACE, + findAndHookMethod(CLASS_WORK_SPACE, mClassLoader, "isScreenHasClockGadget", long.class, - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void beforeHookedMethod(MethodHookParam param) throws Throwable { + protected void before(MethodHookParam param) { param.setResult(false); } }); diff --git a/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/SystemUIHook.java b/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/SystemUIHook.java index 4984666..47ff6f9 100644 --- a/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/SystemUIHook.java +++ b/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/SystemUIHook.java @@ -51,7 +51,7 @@ public void onLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwa new KeyguardClockContainerHook(classLoader, xsp).startHook(); new CollapsedStatusBarFragmentHook(classLoader, xsp, miuiVersion).startHook(); - new SignalClusterViewHook(classLoader, xsp).startHook(); + new SignalClusterViewHook(classLoader, xsp, miuiVersion).startHook(); } } } diff --git a/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/keyguard/ChooseKeyguardClockActivityHook.java b/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/keyguard/ChooseKeyguardClockActivityHook.java index f52db62..3d56fe2 100644 --- a/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/keyguard/ChooseKeyguardClockActivityHook.java +++ b/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/keyguard/ChooseKeyguardClockActivityHook.java @@ -6,10 +6,11 @@ import com.tianma.tweaks.miui.utils.XLog; import com.tianma.tweaks.miui.utils.XSPUtils; import com.tianma.tweaks.miui.xp.hook.BaseSubHook; +import com.tianma.tweaks.miui.xp.wrapper.MethodHookWrapper; -import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XSharedPreferences; -import de.robv.android.xposed.XposedHelpers; + +import static com.tianma.tweaks.miui.xp.wrapper.XposedWrapper.findAndHookMethod; /** * MIUI设置页面 - 选择锁屏时钟界面 Hook @@ -45,19 +46,15 @@ public void startHook() { // com.android.keyguard.setting.ChooseKeyguardClockActivity#onStop() private void hookOnStop() { - XposedHelpers.findAndHookMethod(CLASS_CHOOSE_KEYGUARD_CLOCK_ACTIVITY, + findAndHookMethod(CLASS_CHOOSE_KEYGUARD_CLOCK_ACTIVITY, mClassLoader, "onStop", - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void beforeHookedMethod(MethodHookParam param) throws Throwable { - try { - Context context = (Context) param.thisObject; - Intent intent = new Intent(IntentAction.KEYGUARD_STOP_TIME_TICK); - context.sendBroadcast(intent); - } catch (Throwable t) { - XLog.e("", t); - } + protected void before(MethodHookParam param) { + Context context = (Context) param.thisObject; + Intent intent = new Intent(IntentAction.KEYGUARD_STOP_TIME_TICK); + context.sendBroadcast(intent); } }); } diff --git a/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/keyguard/KeyguardClockContainerHook.java b/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/keyguard/KeyguardClockContainerHook.java index 7d97df2..8bafda0 100644 --- a/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/keyguard/KeyguardClockContainerHook.java +++ b/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/keyguard/KeyguardClockContainerHook.java @@ -9,13 +9,13 @@ import com.tianma.tweaks.miui.utils.XLog; import com.tianma.tweaks.miui.utils.XSPUtils; import com.tianma.tweaks.miui.xp.hook.BaseSubHook; +import com.tianma.tweaks.miui.xp.wrapper.MethodHookWrapper; -import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XSharedPreferences; import de.robv.android.xposed.XposedHelpers; +import static com.tianma.tweaks.miui.xp.wrapper.XposedWrapper.findAndHookMethod; import static de.robv.android.xposed.XposedHelpers.callMethod; -import static de.robv.android.xposed.XposedHelpers.findAndHookMethod; import static de.robv.android.xposed.XposedHelpers.findClass; import static de.robv.android.xposed.XposedHelpers.getObjectField; import static de.robv.android.xposed.XposedHelpers.getStaticObjectField; @@ -60,40 +60,36 @@ public void startHook() { private void hookOnAttachedToWindow() { findAndHookMethod(mKeyguardClockContainerClass, "onAttachedToWindow", - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void beforeHookedMethod(MethodHookParam param) throws Throwable { - try { - FrameLayout clockContainer = (FrameLayout) param.thisObject; - ViewParent parent = clockContainer.getParent(); - XposedHelpers.callMethod(parent, "onAttachedToWindow"); - - IntentFilter filter = new IntentFilter(); -// filter.addAction("android.intent.action.TIME_TICK"); - filter.addAction("android.intent.action.TIME_SET"); - filter.addAction("android.intent.action.TIMEZONE_CHANGED"); - - BroadcastReceiver mIntentReceiver = (BroadcastReceiver) getObjectField(clockContainer, "mIntentReceiver"); - Object USER_HANDLE_ALL = getStaticObjectField(UserHandle.class, "ALL"); - Class dependencyClass = findClass(CLASS_DEPENDENCY, mClassLoader); - Object TIME_TICK_HANDLER = getStaticObjectField(dependencyClass, "TIME_TICK_HANDLER"); - Object handler = XposedHelpers.callStaticMethod(dependencyClass, "get", TIME_TICK_HANDLER); - - callMethod(clockContainer.getContext(), - "registerReceiverAsUser", - mIntentReceiver, - USER_HANDLE_ALL, - filter, - null, - handler); - - callMethod(clockContainer, "registerDualClockObserver"); - callMethod(clockContainer, "registerClockPositionObserver"); - - param.setResult(null); - } catch (Throwable t) { - XLog.e("", t); - } + protected void before(MethodHookParam param) { + FrameLayout clockContainer = (FrameLayout) param.thisObject; + ViewParent parent = clockContainer.getParent(); + XposedHelpers.callMethod(parent, "onAttachedToWindow"); + + IntentFilter filter = new IntentFilter(); + // filter.addAction("android.intent.action.TIME_TICK"); + filter.addAction("android.intent.action.TIME_SET"); + filter.addAction("android.intent.action.TIMEZONE_CHANGED"); + + BroadcastReceiver mIntentReceiver = (BroadcastReceiver) getObjectField(clockContainer, "mIntentReceiver"); + Object USER_HANDLE_ALL = getStaticObjectField(UserHandle.class, "ALL"); + Class dependencyClass = findClass(CLASS_DEPENDENCY, mClassLoader); + Object TIME_TICK_HANDLER = getStaticObjectField(dependencyClass, "TIME_TICK_HANDLER"); + Object handler = XposedHelpers.callStaticMethod(dependencyClass, "get", TIME_TICK_HANDLER); + + callMethod(clockContainer.getContext(), + "registerReceiverAsUser", + mIntentReceiver, + USER_HANDLE_ALL, + filter, + null, + handler); + + callMethod(clockContainer, "registerDualClockObserver"); + callMethod(clockContainer, "registerClockPositionObserver"); + + param.setResult(null); } }); } diff --git a/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/keyguard/MiuiKeyguardClockHook.java b/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/keyguard/MiuiKeyguardClockHook.java index 6f8653d..1a61ba5 100644 --- a/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/keyguard/MiuiKeyguardClockHook.java +++ b/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/keyguard/MiuiKeyguardClockHook.java @@ -17,18 +17,18 @@ import com.tianma.tweaks.miui.xp.hook.BaseSubHook; import com.tianma.tweaks.miui.xp.hook.systemui.tick.TickObserver; import com.tianma.tweaks.miui.xp.hook.systemui.tick.TimeTicker; +import com.tianma.tweaks.miui.xp.wrapper.MethodHookWrapper; import java.util.Calendar; import java.util.HashSet; import java.util.Locale; import java.util.Set; -import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XSharedPreferences; import de.robv.android.xposed.XposedHelpers; -import static de.robv.android.xposed.XposedBridge.hookAllConstructors; -import static de.robv.android.xposed.XposedHelpers.findAndHookMethod; +import static com.tianma.tweaks.miui.xp.wrapper.XposedWrapper.findAndHookMethod; +import static com.tianma.tweaks.miui.xp.wrapper.XposedWrapper.hookAllConstructors; import static de.robv.android.xposed.XposedHelpers.getAdditionalInstanceField; import static de.robv.android.xposed.XposedHelpers.getBooleanField; import static de.robv.android.xposed.XposedHelpers.getFloatField; @@ -99,38 +99,34 @@ public void startHook() { private void hookOnFinishInflate() { findAndHookMethod(mMiuiKeyguardClockCls, "onFinishInflate", - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - try { - LinearLayout miuiKeyguardClock = (LinearLayout) param.thisObject; - - if (mShowHorizontalSec) { - // horizontal layout - LinearLayout mHorizontalTimeLayout = (LinearLayout) getObjectField(miuiKeyguardClock, M_HORIZONTAL_TIME_LAYOUT); - - TextView mHorizontalDot = (TextView) getObjectField(miuiKeyguardClock, M_HORIZONTAL_DOT); - TextView mHorizontalDot2 = createTextViewByCopyAttributes(mHorizontalDot); - mHorizontalTimeLayout.addView(mHorizontalDot2); - setAdditionalInstanceField(miuiKeyguardClock, M_HORIZONTAL_DOT_2, mHorizontalDot2); - - TextView mHorizontalMin = (TextView) getObjectField(miuiKeyguardClock, M_HORIZONTAL_MIN); - TextView mHorizontalSec = createTextViewByCopyAttributes(mHorizontalMin); - mHorizontalTimeLayout.addView(mHorizontalSec); - setAdditionalInstanceField(miuiKeyguardClock, M_HORIZONTAL_SEC, mHorizontalSec); - } + protected void after(MethodHookParam param) { + LinearLayout miuiKeyguardClock = (LinearLayout) param.thisObject; + + if (mShowHorizontalSec) { + // horizontal layout + LinearLayout mHorizontalTimeLayout = (LinearLayout) getObjectField(miuiKeyguardClock, M_HORIZONTAL_TIME_LAYOUT); + + TextView mHorizontalDot = (TextView) getObjectField(miuiKeyguardClock, M_HORIZONTAL_DOT); + TextView mHorizontalDot2 = createTextViewByCopyAttributes(mHorizontalDot); + mHorizontalTimeLayout.addView(mHorizontalDot2); + setAdditionalInstanceField(miuiKeyguardClock, M_HORIZONTAL_DOT_2, mHorizontalDot2); + + TextView mHorizontalMin = (TextView) getObjectField(miuiKeyguardClock, M_HORIZONTAL_MIN); + TextView mHorizontalSec = createTextViewByCopyAttributes(mHorizontalMin); + mHorizontalTimeLayout.addView(mHorizontalSec); + setAdditionalInstanceField(miuiKeyguardClock, M_HORIZONTAL_SEC, mHorizontalSec); + } - if (mShowVerticalSec) { - // vertical layout - LinearLayout mVerticalTimeLayout = (LinearLayout) getObjectField(miuiKeyguardClock, M_VERTICAL_TIME_LAYOUT); + if (mShowVerticalSec) { + // vertical layout + LinearLayout mVerticalTimeLayout = (LinearLayout) getObjectField(miuiKeyguardClock, M_VERTICAL_TIME_LAYOUT); - TextView mVerticalMin = (TextView) getObjectField(miuiKeyguardClock, M_VERTICAL_MIN); - TextView mVerticalSec = createTextViewByCopyAttributes(mVerticalMin); - mVerticalTimeLayout.addView(mVerticalSec); - setAdditionalInstanceField(miuiKeyguardClock, M_VERTICAL_SEC, mVerticalSec); - } - } catch (Throwable t) { - XLog.e("", t); + TextView mVerticalMin = (TextView) getObjectField(miuiKeyguardClock, M_VERTICAL_MIN); + TextView mVerticalSec = createTextViewByCopyAttributes(mVerticalMin); + mVerticalTimeLayout.addView(mVerticalSec); + setAdditionalInstanceField(miuiKeyguardClock, M_VERTICAL_SEC, mVerticalSec); } } @@ -155,31 +151,27 @@ private TextView createTextViewByCopyAttributes(TextView origin) { private void hookUpdateViewTextSize() { findAndHookMethod(mMiuiKeyguardClockCls, "updateViewsTextSize", - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - try { - Object keyguardClock = param.thisObject; - - TextView mHorizontalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_HORIZONTAL_SEC); - if (mHorizontalSec != null) { - TextView mHorizontalMin = (TextView) getObjectField(keyguardClock, M_HORIZONTAL_MIN); - mHorizontalSec.setTextSize(TypedValue.COMPLEX_UNIT_PX, mHorizontalMin.getTextSize()); - } + protected void after(MethodHookParam param) { + Object keyguardClock = param.thisObject; - TextView mHorizontalDot2 = (TextView) getAdditionalInstanceField(keyguardClock, M_HORIZONTAL_DOT_2); - if (mHorizontalDot2 != null) { - TextView mHorizontalDot = (TextView) getObjectField(keyguardClock, M_HORIZONTAL_DOT); - mHorizontalDot2.setTextSize(TypedValue.COMPLEX_UNIT_PX, mHorizontalDot.getTextSize()); - } + TextView mHorizontalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_HORIZONTAL_SEC); + if (mHorizontalSec != null) { + TextView mHorizontalMin = (TextView) getObjectField(keyguardClock, M_HORIZONTAL_MIN); + mHorizontalSec.setTextSize(TypedValue.COMPLEX_UNIT_PX, mHorizontalMin.getTextSize()); + } - TextView mVerticalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_VERTICAL_SEC); - if (mVerticalSec != null) { - TextView mVerticalMin = (TextView) getObjectField(keyguardClock, M_VERTICAL_MIN); - mVerticalSec.setTextSize(TypedValue.COMPLEX_UNIT_PX, mVerticalMin.getTextSize()); - } - } catch (Throwable t) { - XLog.e("", t); + TextView mHorizontalDot2 = (TextView) getAdditionalInstanceField(keyguardClock, M_HORIZONTAL_DOT_2); + if (mHorizontalDot2 != null) { + TextView mHorizontalDot = (TextView) getObjectField(keyguardClock, M_HORIZONTAL_DOT); + mHorizontalDot2.setTextSize(TypedValue.COMPLEX_UNIT_PX, mHorizontalDot.getTextSize()); + } + + TextView mVerticalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_VERTICAL_SEC); + if (mVerticalSec != null) { + TextView mVerticalMin = (TextView) getObjectField(keyguardClock, M_VERTICAL_MIN); + mVerticalSec.setTextSize(TypedValue.COMPLEX_UNIT_PX, mVerticalMin.getTextSize()); } } }); @@ -189,26 +181,22 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable { private void hookUpdateTime() { findAndHookMethod(mMiuiKeyguardClockCls, "updateTime", - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - try { - Object keyguardClock = param.thisObject; + protected void after(MethodHookParam param) { + Object keyguardClock = param.thisObject; - int sec = Calendar.getInstance().get(Calendar.SECOND); - String secStr = String.format(Locale.getDefault(), "%02d", sec); + int sec = Calendar.getInstance().get(Calendar.SECOND); + String secStr = String.format(Locale.getDefault(), "%02d", sec); - TextView mHorizontalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_HORIZONTAL_SEC); - if (mHorizontalSec != null) { - mHorizontalSec.setText(secStr); - } + TextView mHorizontalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_HORIZONTAL_SEC); + if (mHorizontalSec != null) { + mHorizontalSec.setText(secStr); + } - TextView mVerticalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_VERTICAL_SEC); - if (mVerticalSec != null) { - mVerticalSec.setText(secStr); - } - } catch (Throwable t) { - XLog.e("", t); + TextView mVerticalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_VERTICAL_SEC); + if (mVerticalSec != null) { + mVerticalSec.setText(secStr); } } }); @@ -217,42 +205,38 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable { // com.android.keyguard.MiuiKeyguardClock#access() private void hookConstructor() { hookAllConstructors(mMiuiKeyguardClockCls, - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - try { - LinearLayout keyguardClock = (LinearLayout) param.thisObject; + protected void after(MethodHookParam param) { + LinearLayout keyguardClock = (LinearLayout) param.thisObject; - if (mShowVerticalSec) { - AnimatorSet mVerticalToHorizontalAnim2 = new AnimatorSet(); - setAdditionalInstanceField(keyguardClock, M_VERTICAL_TO_HORIZONTAL_ANIM_2, mVerticalToHorizontalAnim2); + if (mShowVerticalSec) { + AnimatorSet mVerticalToHorizontalAnim2 = new AnimatorSet(); + setAdditionalInstanceField(keyguardClock, M_VERTICAL_TO_HORIZONTAL_ANIM_2, mVerticalToHorizontalAnim2); - AnimatorSet mHorizontalToVerticalAnim2 = new AnimatorSet(); - setAdditionalInstanceField(keyguardClock, M_HORIZONTAL_TO_VERTICAL_ANIM_2, mHorizontalToVerticalAnim2); + AnimatorSet mHorizontalToVerticalAnim2 = new AnimatorSet(); + setAdditionalInstanceField(keyguardClock, M_HORIZONTAL_TO_VERTICAL_ANIM_2, mHorizontalToVerticalAnim2); + } + + keyguardClock.getViewTreeObserver().addOnWindowAttachListener(new ViewTreeObserver.OnWindowAttachListener() { + @Override + public void onWindowAttached() { + addClock(keyguardClock); } - keyguardClock.getViewTreeObserver().addOnWindowAttachListener(new ViewTreeObserver.OnWindowAttachListener() { - @Override - public void onWindowAttached() { - addClock(keyguardClock); - } - - @Override - public void onWindowDetached() { - removeClock(keyguardClock); - } - }); - - // register receiver - IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_SCREEN_ON); - filter.addAction(Intent.ACTION_USER_PRESENT); - filter.addAction(Intent.ACTION_SCREEN_OFF); - - keyguardClock.getContext().registerReceiver(mScreenReceiver, filter); - } catch (Throwable e) { - XLog.e("", e); - } + @Override + public void onWindowDetached() { + removeClock(keyguardClock); + } + }); + + // register receiver + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_SCREEN_ON); + filter.addAction(Intent.ACTION_USER_PRESENT); + filter.addAction(Intent.ACTION_SCREEN_OFF); + + keyguardClock.getContext().registerReceiver(mScreenReceiver, filter); } }); } @@ -299,21 +283,17 @@ public void onReceive(Context context, Intent intent) { private void hookShowHorizontalTime() { findAndHookMethod(mMiuiKeyguardClockCls, "showHorizontalTime", - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - try { - Object keyguardClock = param.thisObject; - - TextView mVerticalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_VERTICAL_SEC); - if (mVerticalSec != null) { - boolean mShowHorizontalTime = getBooleanField(param.thisObject, "mShowHorizontalTime"); - if (mShowHorizontalTime) { - mVerticalSec.setAlpha(0.0f); - } + protected void after(MethodHookParam param) { + Object keyguardClock = param.thisObject; + + TextView mVerticalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_VERTICAL_SEC); + if (mVerticalSec != null) { + boolean mShowHorizontalTime = getBooleanField(param.thisObject, "mShowHorizontalTime"); + if (mShowHorizontalTime) { + mVerticalSec.setAlpha(0.0f); } - } catch (Throwable t) { - XLog.e("", t); } } }); @@ -323,22 +303,18 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable { private void hookShowVerticalTime() { findAndHookMethod(mMiuiKeyguardClockCls, "showVerticalTime", - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - try { - Object keyguardClock = param.thisObject; - - TextView mVerticalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_VERTICAL_SEC); - if (mVerticalSec != null) { - boolean mShowHorizontalTime = getBooleanField(param.thisObject, "mShowHorizontalTime"); - if (!mShowHorizontalTime) { - mVerticalSec.setAlpha(1.0f); - mVerticalSec.setTranslationY(0.0f); - } + protected void after(MethodHookParam param) { + Object keyguardClock = param.thisObject; + + TextView mVerticalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_VERTICAL_SEC); + if (mVerticalSec != null) { + boolean mShowHorizontalTime = getBooleanField(param.thisObject, "mShowHorizontalTime"); + if (!mShowHorizontalTime) { + mVerticalSec.setAlpha(1.0f); + mVerticalSec.setTranslationY(0.0f); } - } catch (Throwable t) { - XLog.e("", t); } } }); @@ -348,36 +324,33 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable { private void hookPlayVerticalToHorizontalAnim() { findAndHookMethod(mMiuiKeyguardClockCls, "playVerticalToHorizontalAnim", - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { + protected void after(MethodHookParam param) { Object keyguardClock = param.thisObject; AnimatorSet mVerticalToHorizontalAnim2 = (AnimatorSet) getAdditionalInstanceField(keyguardClock, M_VERTICAL_TO_HORIZONTAL_ANIM_2); TextView mVerticalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_VERTICAL_SEC); if (mVerticalToHorizontalAnim2 == null || mVerticalSec == null) { return; } - try { - float mVerticalTimeLayoutHeight = getFloatField(keyguardClock, "mVerticalTimeLayoutHeight"); - float mVerticalTimePaddingTop = getFloatField(keyguardClock, "mVerticalTimePaddingTop"); - float mHorizontalTimeLayoutHeight = getFloatField(keyguardClock, "mHorizontalTimeLayoutHeight"); - float mHorizontalTimePaddingTop = getFloatField(keyguardClock, "mHorizontalTimePaddingTop"); - - float[] f = new float[]{0.0f, -((((mVerticalTimeLayoutHeight - mVerticalTimePaddingTop) / 2.0f) + mVerticalTimePaddingTop) - (((mHorizontalTimeLayoutHeight - mHorizontalTimePaddingTop) / 2.0f) + mHorizontalTimePaddingTop))}; - ObjectAnimator translationYAnim = ObjectAnimator.ofFloat(mVerticalSec, "translationY", f); - translationYAnim.setDuration(425); - translationYAnim.setInterpolator(Ease.Cubic.easeInOut); - - float[] f2 = new float[]{1.0f, 0.0f}; - ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(mVerticalSec, "alpha", f2); - alphaAnim.setDuration(425); - alphaAnim.setInterpolator(Ease.Sine.easeInOut); - - mVerticalToHorizontalAnim2.play(translationYAnim).with(alphaAnim); - mVerticalToHorizontalAnim2.start(); - } catch (Throwable t) { - XLog.e("", t); - } + + float mVerticalTimeLayoutHeight = getFloatField(keyguardClock, "mVerticalTimeLayoutHeight"); + float mVerticalTimePaddingTop = getFloatField(keyguardClock, "mVerticalTimePaddingTop"); + float mHorizontalTimeLayoutHeight = getFloatField(keyguardClock, "mHorizontalTimeLayoutHeight"); + float mHorizontalTimePaddingTop = getFloatField(keyguardClock, "mHorizontalTimePaddingTop"); + + float[] f = new float[]{0.0f, -((((mVerticalTimeLayoutHeight - mVerticalTimePaddingTop) / 2.0f) + mVerticalTimePaddingTop) - (((mHorizontalTimeLayoutHeight - mHorizontalTimePaddingTop) / 2.0f) + mHorizontalTimePaddingTop))}; + ObjectAnimator translationYAnim = ObjectAnimator.ofFloat(mVerticalSec, "translationY", f); + translationYAnim.setDuration(425); + translationYAnim.setInterpolator(Ease.Cubic.easeInOut); + + float[] f2 = new float[]{1.0f, 0.0f}; + ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(mVerticalSec, "alpha", f2); + alphaAnim.setDuration(425); + alphaAnim.setInterpolator(Ease.Sine.easeInOut); + + mVerticalToHorizontalAnim2.play(translationYAnim).with(alphaAnim); + mVerticalToHorizontalAnim2.start(); } }); } @@ -386,38 +359,35 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable { private void hookPlayHorizontalToVerticalAnim() { findAndHookMethod(mMiuiKeyguardClockCls, "playHorizontalToVerticalAnim", - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { + protected void after(MethodHookParam param) { Object keyguardClock = param.thisObject; AnimatorSet mHorizontalToVerticalAnim2 = (AnimatorSet) getAdditionalInstanceField(keyguardClock, M_HORIZONTAL_TO_VERTICAL_ANIM_2); TextView mVerticalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_VERTICAL_SEC); if (mHorizontalToVerticalAnim2 == null || mVerticalSec == null) { return; } - try { - float mVerticalTimeLayoutHeight = getFloatField(keyguardClock, "mVerticalTimeLayoutHeight"); - float mVerticalTimePaddingTop = getFloatField(keyguardClock, "mVerticalTimePaddingTop"); - float mHorizontalTimeLayoutHeight = getFloatField(keyguardClock, "mHorizontalTimeLayoutHeight"); - float mHorizontalTimePaddingTop = getFloatField(keyguardClock, "mHorizontalTimePaddingTop"); + float mVerticalTimeLayoutHeight = getFloatField(keyguardClock, "mVerticalTimeLayoutHeight"); + float mVerticalTimePaddingTop = getFloatField(keyguardClock, "mVerticalTimePaddingTop"); + float mHorizontalTimeLayoutHeight = getFloatField(keyguardClock, "mHorizontalTimeLayoutHeight"); + float mHorizontalTimePaddingTop = getFloatField(keyguardClock, "mHorizontalTimePaddingTop"); - float[] f1 = new float[]{-((((mVerticalTimeLayoutHeight - mVerticalTimePaddingTop) / 2.0f) + mVerticalTimePaddingTop) - (((mHorizontalTimeLayoutHeight - mHorizontalTimePaddingTop) / 2.0f) + mHorizontalTimePaddingTop)), 0.0f}; - ObjectAnimator translationYAnim = ObjectAnimator.ofFloat(mVerticalSec, "translationY", f1); - translationYAnim.setDuration(425); - translationYAnim.setInterpolator(Ease.Cubic.easeOut); - float[] f2 = new float[]{0.0f, 1.0f}; - ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(mVerticalSec, "alpha", f2); - alphaAnim.setDuration(425); - alphaAnim.setInterpolator(Ease.Sine.easeInOut); + float[] f1 = new float[]{-((((mVerticalTimeLayoutHeight - mVerticalTimePaddingTop) / 2.0f) + mVerticalTimePaddingTop) - (((mHorizontalTimeLayoutHeight - mHorizontalTimePaddingTop) / 2.0f) + mHorizontalTimePaddingTop)), 0.0f}; + ObjectAnimator translationYAnim = ObjectAnimator.ofFloat(mVerticalSec, "translationY", f1); + translationYAnim.setDuration(425); + translationYAnim.setInterpolator(Ease.Cubic.easeOut); + float[] f2 = new float[]{0.0f, 1.0f}; + ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(mVerticalSec, "alpha", f2); + alphaAnim.setDuration(425); + alphaAnim.setInterpolator(Ease.Sine.easeInOut); - mHorizontalToVerticalAnim2.play(translationYAnim).with(alphaAnim); - mHorizontalToVerticalAnim2.start(); - } catch (Throwable t) { - XLog.e("", t); - } + + mHorizontalToVerticalAnim2.play(translationYAnim).with(alphaAnim); + mHorizontalToVerticalAnim2.start(); } }); } @@ -426,9 +396,9 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable { private void hookClearAnim() { findAndHookMethod(mMiuiKeyguardClockCls, "clearAnim", - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { + protected void after(MethodHookParam param) { Object keyguardClock = param.thisObject; AnimatorSet mHorizontalToVerticalAnim2 = (AnimatorSet) getAdditionalInstanceField(keyguardClock, M_HORIZONTAL_TO_VERTICAL_ANIM_2); if (mHorizontalToVerticalAnim2 != null) { @@ -453,9 +423,9 @@ private void hookSetDarkMode() { findAndHookMethod(mMiuiKeyguardClockCls, "setDarkMode", boolean.class, - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { + protected void after(MethodHookParam param) { Object keyguardClock = param.thisObject; TextView mHorizontalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_HORIZONTAL_SEC); diff --git a/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/keyguard/MiuiKeyguardLeftTopClockHook.java b/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/keyguard/MiuiKeyguardLeftTopClockHook.java index 84c1f35..1a6dea4 100644 --- a/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/keyguard/MiuiKeyguardLeftTopClockHook.java +++ b/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/keyguard/MiuiKeyguardLeftTopClockHook.java @@ -13,18 +13,18 @@ import com.tianma.tweaks.miui.xp.hook.BaseSubHook; import com.tianma.tweaks.miui.xp.hook.systemui.tick.TickObserver; import com.tianma.tweaks.miui.xp.hook.systemui.tick.TimeTicker; +import com.tianma.tweaks.miui.xp.wrapper.MethodHookWrapper; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import java.util.Locale; -import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XSharedPreferences; import de.robv.android.xposed.XposedHelpers; -import static de.robv.android.xposed.XposedBridge.hookAllConstructors; -import static de.robv.android.xposed.XposedHelpers.findAndHookMethod; +import static com.tianma.tweaks.miui.xp.wrapper.XposedWrapper.findAndHookMethod; +import static com.tianma.tweaks.miui.xp.wrapper.XposedWrapper.hookAllConstructors; /** * 锁屏界面 @@ -66,17 +66,13 @@ public void startHook() { private void hookUpdateTime() { findAndHookMethod(mMiuiKeyguardLeftTopClockCls, "updateTime", - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - try { - TextView mTimeText = (TextView) XposedHelpers.getObjectField(param.thisObject, "mTimeText"); - if (mTimeText != null) { - String originalTimeStr = mTimeText.getText().toString(); - mTimeText.setText(addInSecond(originalTimeStr)); - } - } catch (Throwable t) { - XLog.e("", t); + protected void after(MethodHookParam param) { + TextView mTimeText = (TextView) XposedHelpers.getObjectField(param.thisObject, "mTimeText"); + if (mTimeText != null) { + String originalTimeStr = mTimeText.getText().toString(); + mTimeText.setText(addInSecond(originalTimeStr)); } } }); @@ -91,35 +87,31 @@ private String addInSecond(String originalTimeStr) { // com.android.keyguard.MiuiKeyguardLeftTopClock#access() private void hookConstructor() { hookAllConstructors(mMiuiKeyguardLeftTopClockCls, - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - try { - final View keyguardClock = (View) param.thisObject; - keyguardClock.getViewTreeObserver().addOnWindowAttachListener(new ViewTreeObserver.OnWindowAttachListener() { - @Override - public void onWindowAttached() { - addClock(keyguardClock); - } - - @Override - public void onWindowDetached() { - removeClock(keyguardClock); - } - }); - addClock(keyguardClock); - - // register receiver - IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_SCREEN_ON); - filter.addAction(Intent.ACTION_USER_PRESENT); - filter.addAction(Intent.ACTION_SCREEN_OFF); - filter.addAction(IntentAction.KEYGUARD_STOP_TIME_TICK); - - keyguardClock.getContext().registerReceiver(mScreenReceiver, filter); - } catch (Throwable e) { - XLog.e("", e); - } + protected void after(MethodHookParam param) { + final View keyguardClock = (View) param.thisObject; + keyguardClock.getViewTreeObserver().addOnWindowAttachListener(new ViewTreeObserver.OnWindowAttachListener() { + @Override + public void onWindowAttached() { + addClock(keyguardClock); + } + + @Override + public void onWindowDetached() { + removeClock(keyguardClock); + } + }); + addClock(keyguardClock); + + // register receiver + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_SCREEN_ON); + filter.addAction(Intent.ACTION_USER_PRESENT); + filter.addAction(Intent.ACTION_SCREEN_OFF); + filter.addAction(IntentAction.KEYGUARD_STOP_TIME_TICK); + + keyguardClock.getContext().registerReceiver(mScreenReceiver, filter); } }); } @@ -131,7 +123,7 @@ private synchronized void addClock(View clock) { int size = mKeyguardClockList.size(); int limitedSize = 2; if (size > limitedSize) { - for (int i = 0; i < size - limitedSize; i ++) { + for (int i = 0; i < size - limitedSize; i++) { View item = mKeyguardClockList.get(i); mKeyguardClockList.remove(item); } @@ -160,7 +152,7 @@ public void onReceive(Context context, Intent intent) { } else if (Intent.ACTION_USER_PRESENT.equals(action) || Intent.ACTION_SCREEN_OFF.equals(action)) { TimeTicker.get().unregisterObserver(MiuiKeyguardLeftTopClockHook.this); - } else if (IntentAction.KEYGUARD_STOP_TIME_TICK.equals(action)){ + } else if (IntentAction.KEYGUARD_STOP_TIME_TICK.equals(action)) { TimeTicker.get().unregisterObserver(MiuiKeyguardLeftTopClockHook.this); } } diff --git a/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/keyguard/MiuiKeyguardVerticalClockHook.java b/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/keyguard/MiuiKeyguardVerticalClockHook.java index ef12a30..d8268bf 100644 --- a/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/keyguard/MiuiKeyguardVerticalClockHook.java +++ b/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/keyguard/MiuiKeyguardVerticalClockHook.java @@ -17,18 +17,18 @@ import com.tianma.tweaks.miui.xp.hook.BaseSubHook; import com.tianma.tweaks.miui.xp.hook.systemui.tick.TickObserver; import com.tianma.tweaks.miui.xp.hook.systemui.tick.TimeTicker; +import com.tianma.tweaks.miui.xp.wrapper.MethodHookWrapper; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import java.util.Locale; -import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XSharedPreferences; import de.robv.android.xposed.XposedHelpers; -import static de.robv.android.xposed.XposedBridge.hookAllConstructors; -import static de.robv.android.xposed.XposedHelpers.findAndHookMethod; +import static com.tianma.tweaks.miui.xp.wrapper.XposedWrapper.findAndHookMethod; +import static com.tianma.tweaks.miui.xp.wrapper.XposedWrapper.hookAllConstructors; import static de.robv.android.xposed.XposedHelpers.getAdditionalInstanceField; import static de.robv.android.xposed.XposedHelpers.getBooleanField; import static de.robv.android.xposed.XposedHelpers.getFloatField; @@ -99,38 +99,34 @@ public void startHook() { private void hookOnFinishInflate() { findAndHookMethod(mMiuiKeyguardVerticalClockCls, "onFinishInflate", - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - try { - LinearLayout miuiKeyguardClock = (LinearLayout) param.thisObject; - - if (mShowHorizontalSec) { - // horizontal layout - LinearLayout mHorizontalTimeLayout = (LinearLayout) getObjectField(miuiKeyguardClock, M_HORIZONTAL_TIME_LAYOUT); - - TextView mHorizontalDot = (TextView) getObjectField(miuiKeyguardClock, M_HORIZONTAL_DOT); - TextView mHorizontalDot2 = createTextViewByCopyAttributes(mHorizontalDot); - mHorizontalTimeLayout.addView(mHorizontalDot2); - setAdditionalInstanceField(miuiKeyguardClock, M_HORIZONTAL_DOT_2, mHorizontalDot2); - - TextView mHorizontalMin = (TextView) getObjectField(miuiKeyguardClock, M_HORIZONTAL_MIN); - TextView mHorizontalSec = createTextViewByCopyAttributes(mHorizontalMin); - mHorizontalTimeLayout.addView(mHorizontalSec); - setAdditionalInstanceField(miuiKeyguardClock, M_HORIZONTAL_SEC, mHorizontalSec); - } + protected void after(MethodHookParam param) { + LinearLayout miuiKeyguardClock = (LinearLayout) param.thisObject; + + if (mShowHorizontalSec) { + // horizontal layout + LinearLayout mHorizontalTimeLayout = (LinearLayout) getObjectField(miuiKeyguardClock, M_HORIZONTAL_TIME_LAYOUT); + + TextView mHorizontalDot = (TextView) getObjectField(miuiKeyguardClock, M_HORIZONTAL_DOT); + TextView mHorizontalDot2 = createTextViewByCopyAttributes(mHorizontalDot); + mHorizontalTimeLayout.addView(mHorizontalDot2); + setAdditionalInstanceField(miuiKeyguardClock, M_HORIZONTAL_DOT_2, mHorizontalDot2); + + TextView mHorizontalMin = (TextView) getObjectField(miuiKeyguardClock, M_HORIZONTAL_MIN); + TextView mHorizontalSec = createTextViewByCopyAttributes(mHorizontalMin); + mHorizontalTimeLayout.addView(mHorizontalSec); + setAdditionalInstanceField(miuiKeyguardClock, M_HORIZONTAL_SEC, mHorizontalSec); + } - if (mShowVerticalSec) { - // vertical layout - LinearLayout mVerticalTimeLayout = (LinearLayout) getObjectField(miuiKeyguardClock, M_VERTICAL_TIME_LAYOUT); + if (mShowVerticalSec) { + // vertical layout + LinearLayout mVerticalTimeLayout = (LinearLayout) getObjectField(miuiKeyguardClock, M_VERTICAL_TIME_LAYOUT); - TextView mVerticalMin = (TextView) getObjectField(miuiKeyguardClock, M_VERTICAL_MIN); - TextView mVerticalSec = createTextViewByCopyAttributes(mVerticalMin); - mVerticalTimeLayout.addView(mVerticalSec); - setAdditionalInstanceField(miuiKeyguardClock, M_VERTICAL_SEC, mVerticalSec); - } - } catch (Throwable t) { - XLog.e("", t); + TextView mVerticalMin = (TextView) getObjectField(miuiKeyguardClock, M_VERTICAL_MIN); + TextView mVerticalSec = createTextViewByCopyAttributes(mVerticalMin); + mVerticalTimeLayout.addView(mVerticalSec); + setAdditionalInstanceField(miuiKeyguardClock, M_VERTICAL_SEC, mVerticalSec); } } @@ -155,31 +151,27 @@ private TextView createTextViewByCopyAttributes(TextView origin) { private void hookUpdateViewTextSize() { findAndHookMethod(mMiuiKeyguardVerticalClockCls, "updateViewsTextSize", - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - try { - Object keyguardClock = param.thisObject; - - TextView mHorizontalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_HORIZONTAL_SEC); - if (mHorizontalSec != null) { - TextView mHorizontalMin = (TextView) getObjectField(keyguardClock, M_HORIZONTAL_MIN); - mHorizontalSec.setTextSize(TypedValue.COMPLEX_UNIT_PX, mHorizontalMin.getTextSize()); - } + protected void after(MethodHookParam param) { + Object keyguardClock = param.thisObject; - TextView mHorizontalDot2 = (TextView) getAdditionalInstanceField(keyguardClock, M_HORIZONTAL_DOT_2); - if (mHorizontalDot2 != null) { - TextView mHorizontalDot = (TextView) getObjectField(keyguardClock, M_HORIZONTAL_DOT); - mHorizontalDot2.setTextSize(TypedValue.COMPLEX_UNIT_PX, mHorizontalDot.getTextSize()); - } + TextView mHorizontalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_HORIZONTAL_SEC); + if (mHorizontalSec != null) { + TextView mHorizontalMin = (TextView) getObjectField(keyguardClock, M_HORIZONTAL_MIN); + mHorizontalSec.setTextSize(TypedValue.COMPLEX_UNIT_PX, mHorizontalMin.getTextSize()); + } - TextView mVerticalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_VERTICAL_SEC); - if (mVerticalSec != null) { - TextView mVerticalMin = (TextView) getObjectField(keyguardClock, M_VERTICAL_MIN); - mVerticalSec.setTextSize(TypedValue.COMPLEX_UNIT_PX, mVerticalMin.getTextSize()); - } - } catch (Throwable t) { - XLog.e("", t); + TextView mHorizontalDot2 = (TextView) getAdditionalInstanceField(keyguardClock, M_HORIZONTAL_DOT_2); + if (mHorizontalDot2 != null) { + TextView mHorizontalDot = (TextView) getObjectField(keyguardClock, M_HORIZONTAL_DOT); + mHorizontalDot2.setTextSize(TypedValue.COMPLEX_UNIT_PX, mHorizontalDot.getTextSize()); + } + + TextView mVerticalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_VERTICAL_SEC); + if (mVerticalSec != null) { + TextView mVerticalMin = (TextView) getObjectField(keyguardClock, M_VERTICAL_MIN); + mVerticalSec.setTextSize(TypedValue.COMPLEX_UNIT_PX, mVerticalMin.getTextSize()); } } }); @@ -189,26 +181,22 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable { private void hookUpdateTime() { findAndHookMethod(mMiuiKeyguardVerticalClockCls, "updateTime", - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - try { - Object keyguardClock = param.thisObject; + protected void after(MethodHookParam param) { + Object keyguardClock = param.thisObject; - int sec = Calendar.getInstance().get(Calendar.SECOND); - String secStr = String.format(Locale.getDefault(), "%02d", sec); + int sec = Calendar.getInstance().get(Calendar.SECOND); + String secStr = String.format(Locale.getDefault(), "%02d", sec); - TextView mHorizontalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_HORIZONTAL_SEC); - if (mHorizontalSec != null) { - mHorizontalSec.setText(secStr); - } + TextView mHorizontalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_HORIZONTAL_SEC); + if (mHorizontalSec != null) { + mHorizontalSec.setText(secStr); + } - TextView mVerticalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_VERTICAL_SEC); - if (mVerticalSec != null) { - mVerticalSec.setText(secStr); - } - } catch (Throwable t) { - XLog.e("", t); + TextView mVerticalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_VERTICAL_SEC); + if (mVerticalSec != null) { + mVerticalSec.setText(secStr); } } }); @@ -217,44 +205,40 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable { // com.android.keyguard.MiuiKeyguardVerticalClock#access() private void hookConstructor() { hookAllConstructors(mMiuiKeyguardVerticalClockCls, - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - try { - final LinearLayout keyguardClock = (LinearLayout) param.thisObject; + protected void after(MethodHookParam param) { + final LinearLayout keyguardClock = (LinearLayout) param.thisObject; - if (mShowVerticalSec) { - AnimatorSet mVerticalToHorizontalAnim2 = new AnimatorSet(); - setAdditionalInstanceField(keyguardClock, M_VERTICAL_TO_HORIZONTAL_ANIM_2, mVerticalToHorizontalAnim2); + if (mShowVerticalSec) { + AnimatorSet mVerticalToHorizontalAnim2 = new AnimatorSet(); + setAdditionalInstanceField(keyguardClock, M_VERTICAL_TO_HORIZONTAL_ANIM_2, mVerticalToHorizontalAnim2); - AnimatorSet mHorizontalToVerticalAnim2 = new AnimatorSet(); - setAdditionalInstanceField(keyguardClock, M_HORIZONTAL_TO_VERTICAL_ANIM_2, mHorizontalToVerticalAnim2); + AnimatorSet mHorizontalToVerticalAnim2 = new AnimatorSet(); + setAdditionalInstanceField(keyguardClock, M_HORIZONTAL_TO_VERTICAL_ANIM_2, mHorizontalToVerticalAnim2); + } + + keyguardClock.getViewTreeObserver().addOnWindowAttachListener(new ViewTreeObserver.OnWindowAttachListener() { + @Override + public void onWindowAttached() { + addClock(keyguardClock); } - keyguardClock.getViewTreeObserver().addOnWindowAttachListener(new ViewTreeObserver.OnWindowAttachListener() { - @Override - public void onWindowAttached() { - addClock(keyguardClock); - } - - @Override - public void onWindowDetached() { - removeClock(keyguardClock); - } - }); - addClock(keyguardClock); - - // register receiver - IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_SCREEN_ON); - filter.addAction(Intent.ACTION_USER_PRESENT); - filter.addAction(Intent.ACTION_SCREEN_OFF); - filter.addAction(IntentAction.KEYGUARD_STOP_TIME_TICK); - - keyguardClock.getContext().registerReceiver(mScreenReceiver, filter); - } catch (Throwable e) { - XLog.e("", e); - } + @Override + public void onWindowDetached() { + removeClock(keyguardClock); + } + }); + addClock(keyguardClock); + + // register receiver + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_SCREEN_ON); + filter.addAction(Intent.ACTION_USER_PRESENT); + filter.addAction(Intent.ACTION_SCREEN_OFF); + filter.addAction(IntentAction.KEYGUARD_STOP_TIME_TICK); + + keyguardClock.getContext().registerReceiver(mScreenReceiver, filter); } }); } @@ -266,7 +250,7 @@ private synchronized void addClock(View clock) { int size = mKeyguardClockList.size(); int limitedSize = 2; if (size > limitedSize) { - for (int i = 0; i < size - limitedSize; i ++) { + for (int i = 0; i < size - limitedSize; i++) { View item = mKeyguardClockList.get(i); mKeyguardClockList.remove(item); } @@ -314,21 +298,17 @@ public void onReceive(Context context, Intent intent) { private void hookShowHorizontalTime() { findAndHookMethod(mMiuiKeyguardVerticalClockCls, "showHorizontalTime", - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - try { - Object keyguardClock = param.thisObject; - - TextView mVerticalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_VERTICAL_SEC); - if (mVerticalSec != null) { - boolean mShowHorizontalTime = getBooleanField(param.thisObject, "mShowHorizontalTime"); - if (mShowHorizontalTime) { - mVerticalSec.setAlpha(0.0f); - } + protected void after(MethodHookParam param) { + Object keyguardClock = param.thisObject; + + TextView mVerticalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_VERTICAL_SEC); + if (mVerticalSec != null) { + boolean mShowHorizontalTime = getBooleanField(param.thisObject, "mShowHorizontalTime"); + if (mShowHorizontalTime) { + mVerticalSec.setAlpha(0.0f); } - } catch (Throwable t) { - XLog.e("", t); } } }); @@ -338,22 +318,18 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable { private void hookShowVerticalTime() { findAndHookMethod(mMiuiKeyguardVerticalClockCls, "showVerticalTime", - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - try { - Object keyguardClock = param.thisObject; - - TextView mVerticalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_VERTICAL_SEC); - if (mVerticalSec != null) { - boolean mShowHorizontalTime = getBooleanField(param.thisObject, "mShowHorizontalTime"); - if (!mShowHorizontalTime) { - mVerticalSec.setAlpha(1.0f); - mVerticalSec.setTranslationY(0.0f); - } + protected void after(MethodHookParam param) { + Object keyguardClock = param.thisObject; + + TextView mVerticalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_VERTICAL_SEC); + if (mVerticalSec != null) { + boolean mShowHorizontalTime = getBooleanField(param.thisObject, "mShowHorizontalTime"); + if (!mShowHorizontalTime) { + mVerticalSec.setAlpha(1.0f); + mVerticalSec.setTranslationY(0.0f); } - } catch (Throwable t) { - XLog.e("", t); } } }); @@ -363,36 +339,33 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable { private void hookPlayVerticalToHorizontalAnim() { findAndHookMethod(mMiuiKeyguardVerticalClockCls, "playVerticalToHorizontalAnim", - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { + protected void after(MethodHookParam param) { Object keyguardClock = param.thisObject; AnimatorSet mVerticalToHorizontalAnim2 = (AnimatorSet) getAdditionalInstanceField(keyguardClock, M_VERTICAL_TO_HORIZONTAL_ANIM_2); TextView mVerticalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_VERTICAL_SEC); if (mVerticalToHorizontalAnim2 == null || mVerticalSec == null) { return; } - try { - float mVerticalTimeLayoutHeight = getFloatField(keyguardClock, "mVerticalTimeLayoutHeight"); - float mVerticalTimePaddingTop = getFloatField(keyguardClock, "mVerticalTimePaddingTop"); - float mHorizontalTimeLayoutHeight = getFloatField(keyguardClock, "mHorizontalTimeLayoutHeight"); - float mHorizontalTimePaddingTop = getFloatField(keyguardClock, "mHorizontalTimePaddingTop"); - - float[] f = new float[]{0.0f, -((((mVerticalTimeLayoutHeight - mVerticalTimePaddingTop) / 2.0f) + mVerticalTimePaddingTop) - (((mHorizontalTimeLayoutHeight - mHorizontalTimePaddingTop) / 2.0f) + mHorizontalTimePaddingTop))}; - ObjectAnimator translationYAnim = ObjectAnimator.ofFloat(mVerticalSec, "translationY", f); - translationYAnim.setDuration(425); - translationYAnim.setInterpolator(Ease.Cubic.easeInOut); - - float[] f2 = new float[]{1.0f, 0.0f}; - ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(mVerticalSec, "alpha", f2); - alphaAnim.setDuration(425); - alphaAnim.setInterpolator(Ease.Sine.easeInOut); - - mVerticalToHorizontalAnim2.play(translationYAnim).with(alphaAnim); - mVerticalToHorizontalAnim2.start(); - } catch (Throwable t) { - XLog.e("", t); - } + + float mVerticalTimeLayoutHeight = getFloatField(keyguardClock, "mVerticalTimeLayoutHeight"); + float mVerticalTimePaddingTop = getFloatField(keyguardClock, "mVerticalTimePaddingTop"); + float mHorizontalTimeLayoutHeight = getFloatField(keyguardClock, "mHorizontalTimeLayoutHeight"); + float mHorizontalTimePaddingTop = getFloatField(keyguardClock, "mHorizontalTimePaddingTop"); + + float[] f = new float[]{0.0f, -((((mVerticalTimeLayoutHeight - mVerticalTimePaddingTop) / 2.0f) + mVerticalTimePaddingTop) - (((mHorizontalTimeLayoutHeight - mHorizontalTimePaddingTop) / 2.0f) + mHorizontalTimePaddingTop))}; + ObjectAnimator translationYAnim = ObjectAnimator.ofFloat(mVerticalSec, "translationY", f); + translationYAnim.setDuration(425); + translationYAnim.setInterpolator(Ease.Cubic.easeInOut); + + float[] f2 = new float[]{1.0f, 0.0f}; + ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(mVerticalSec, "alpha", f2); + alphaAnim.setDuration(425); + alphaAnim.setInterpolator(Ease.Sine.easeInOut); + + mVerticalToHorizontalAnim2.play(translationYAnim).with(alphaAnim); + mVerticalToHorizontalAnim2.start(); } }); } @@ -401,38 +374,35 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable { private void hookPlayHorizontalToVerticalAnim() { findAndHookMethod(mMiuiKeyguardVerticalClockCls, "playHorizontalToVerticalAnim", - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { + protected void after(MethodHookParam param) { Object keyguardClock = param.thisObject; AnimatorSet mHorizontalToVerticalAnim2 = (AnimatorSet) getAdditionalInstanceField(keyguardClock, M_HORIZONTAL_TO_VERTICAL_ANIM_2); TextView mVerticalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_VERTICAL_SEC); if (mHorizontalToVerticalAnim2 == null || mVerticalSec == null) { return; } - try { - float mVerticalTimeLayoutHeight = getFloatField(keyguardClock, "mVerticalTimeLayoutHeight"); - float mVerticalTimePaddingTop = getFloatField(keyguardClock, "mVerticalTimePaddingTop"); - float mHorizontalTimeLayoutHeight = getFloatField(keyguardClock, "mHorizontalTimeLayoutHeight"); - float mHorizontalTimePaddingTop = getFloatField(keyguardClock, "mHorizontalTimePaddingTop"); + float mVerticalTimeLayoutHeight = getFloatField(keyguardClock, "mVerticalTimeLayoutHeight"); + float mVerticalTimePaddingTop = getFloatField(keyguardClock, "mVerticalTimePaddingTop"); + float mHorizontalTimeLayoutHeight = getFloatField(keyguardClock, "mHorizontalTimeLayoutHeight"); + float mHorizontalTimePaddingTop = getFloatField(keyguardClock, "mHorizontalTimePaddingTop"); - float[] f1 = new float[]{-((((mVerticalTimeLayoutHeight - mVerticalTimePaddingTop) / 2.0f) + mVerticalTimePaddingTop) - (((mHorizontalTimeLayoutHeight - mHorizontalTimePaddingTop) / 2.0f) + mHorizontalTimePaddingTop)), 0.0f}; - ObjectAnimator translationYAnim = ObjectAnimator.ofFloat(mVerticalSec, "translationY", f1); - translationYAnim.setDuration(425); - translationYAnim.setInterpolator(Ease.Cubic.easeOut); - float[] f2 = new float[]{0.0f, 1.0f}; - ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(mVerticalSec, "alpha", f2); - alphaAnim.setDuration(425); - alphaAnim.setInterpolator(Ease.Sine.easeInOut); + float[] f1 = new float[]{-((((mVerticalTimeLayoutHeight - mVerticalTimePaddingTop) / 2.0f) + mVerticalTimePaddingTop) - (((mHorizontalTimeLayoutHeight - mHorizontalTimePaddingTop) / 2.0f) + mHorizontalTimePaddingTop)), 0.0f}; + ObjectAnimator translationYAnim = ObjectAnimator.ofFloat(mVerticalSec, "translationY", f1); + translationYAnim.setDuration(425); + translationYAnim.setInterpolator(Ease.Cubic.easeOut); + float[] f2 = new float[]{0.0f, 1.0f}; + ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(mVerticalSec, "alpha", f2); + alphaAnim.setDuration(425); + alphaAnim.setInterpolator(Ease.Sine.easeInOut); - mHorizontalToVerticalAnim2.play(translationYAnim).with(alphaAnim); - mHorizontalToVerticalAnim2.start(); - } catch (Throwable t) { - XLog.e("", t); - } + + mHorizontalToVerticalAnim2.play(translationYAnim).with(alphaAnim); + mHorizontalToVerticalAnim2.start(); } }); } @@ -441,9 +411,9 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable { private void hookClearAnim() { findAndHookMethod(mMiuiKeyguardVerticalClockCls, "clearAnim", - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { + protected void after(MethodHookParam param) { Object keyguardClock = param.thisObject; AnimatorSet mHorizontalToVerticalAnim2 = (AnimatorSet) getAdditionalInstanceField(keyguardClock, M_HORIZONTAL_TO_VERTICAL_ANIM_2); if (mHorizontalToVerticalAnim2 != null) { @@ -468,9 +438,9 @@ private void hookSetDarkMode() { findAndHookMethod(mMiuiKeyguardVerticalClockCls, "setDarkMode", boolean.class, - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { + protected void after(MethodHookParam param) { Object keyguardClock = param.thisObject; TextView mHorizontalSec = (TextView) getAdditionalInstanceField(keyguardClock, M_HORIZONTAL_SEC); diff --git a/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/statusbar/CollapsedStatusBarFragmentHook.java b/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/statusbar/CollapsedStatusBarFragmentHook.java index 68591a8..7f4f8da 100644 --- a/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/statusbar/CollapsedStatusBarFragmentHook.java +++ b/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/statusbar/CollapsedStatusBarFragmentHook.java @@ -10,11 +10,13 @@ import com.tianma.tweaks.miui.utils.rom.MiuiVersion; import com.tianma.tweaks.miui.xp.hook.BaseSubHook; import com.tianma.tweaks.miui.xp.hook.systemui.helper.ResHelpers; +import com.tianma.tweaks.miui.xp.wrapper.MethodHookWrapper; -import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XSharedPreferences; import de.robv.android.xposed.XposedHelpers; +import static com.tianma.tweaks.miui.xp.wrapper.XposedWrapper.findAndHookMethod; + public class CollapsedStatusBarFragmentHook extends BaseSubHook { private static final String CLASS_STATUS_BAR_FRAGMENT = "com.android.systemui.statusbar.phone.CollapsedStatusBarFragment"; @@ -47,47 +49,43 @@ public void startHook() { // CollapsedStatusBarFragment#onViewCreated() private void hookCollapsedStatusBarFragment() { - XposedHelpers.findAndHookMethod(CLASS_STATUS_BAR_FRAGMENT, + findAndHookMethod(CLASS_STATUS_BAR_FRAGMENT, mClassLoader, "onViewCreated", View.class, Bundle.class, - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - try { - ViewGroup phoneStatusBarView = (ViewGroup) XposedHelpers.getObjectField(param.thisObject, "mStatusBar"); - Resources res = phoneStatusBarView.getResources(); - - View signalClusterViewContainer = phoneStatusBarView - .findViewById(ResHelpers.getId(res, "signal_cluster_view")); - ((ViewGroup) signalClusterViewContainer.getParent()).removeView(signalClusterViewContainer); - - if (mMiuiVersion.getTime() >= MiuiVersion.V_19_5_7.getTime()) { - ViewGroup contentsContainer = phoneStatusBarView - .findViewById(ResHelpers.getId(res, "phone_status_bar_contents_container")); - contentsContainer.addView(signalClusterViewContainer, 0); - } else { - ViewGroup statusBarContents = phoneStatusBarView - .findViewById(ResHelpers.getId(res, "status_bar_contents")); - statusBarContents.addView(signalClusterViewContainer, 0); - } - } catch (Throwable t) { - XLog.e("", t); + protected void after(MethodHookParam param) { + ViewGroup phoneStatusBarView = (ViewGroup) XposedHelpers.getObjectField(param.thisObject, "mStatusBar"); + Resources res = phoneStatusBarView.getResources(); + + View signalClusterViewContainer = phoneStatusBarView + .findViewById(ResHelpers.getId(res, "signal_cluster_view")); + ((ViewGroup) signalClusterViewContainer.getParent()).removeView(signalClusterViewContainer); + + if (mMiuiVersion.getTime() >= MiuiVersion.V_19_5_7.getTime()) { + ViewGroup contentsContainer = phoneStatusBarView + .findViewById(ResHelpers.getId(res, "phone_status_bar_contents_container")); + contentsContainer.addView(signalClusterViewContainer, 0); + } else { + ViewGroup statusBarContents = phoneStatusBarView + .findViewById(ResHelpers.getId(res, "status_bar_contents")); + statusBarContents.addView(signalClusterViewContainer, 0); } } }); } private void hookClockVisibleAnimate() { - XposedHelpers.findAndHookMethod(CLASS_STATUS_BAR_FRAGMENT, + findAndHookMethod(CLASS_STATUS_BAR_FRAGMENT, mClassLoader, "clockVisibleAnimate", boolean.class, boolean.class, - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void beforeHookedMethod(MethodHookParam param) throws Throwable { + protected void before(MethodHookParam param) { View mStatusClock = (View) XposedHelpers.getObjectField(param.thisObject, "mStatusClock"); mStatusClock.setVisibility(View.VISIBLE); param.setResult(null); diff --git a/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/statusbar/PhoneStatusBarViewHook.java b/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/statusbar/PhoneStatusBarViewHook.java index 0fc7154..fd73b1e 100644 --- a/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/statusbar/PhoneStatusBarViewHook.java +++ b/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/statusbar/PhoneStatusBarViewHook.java @@ -13,10 +13,12 @@ import com.tianma.tweaks.miui.utils.XSPUtils; import com.tianma.tweaks.miui.xp.hook.BaseSubHook; import com.tianma.tweaks.miui.xp.hook.systemui.SystemUIHook; +import com.tianma.tweaks.miui.xp.wrapper.MethodHookWrapper; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XSharedPreferences; -import de.robv.android.xposed.XposedHelpers; + +import static com.tianma.tweaks.miui.xp.wrapper.XposedWrapper.findAndHookMethod; /** * 状态栏时钟居中显示 @@ -63,18 +65,14 @@ public void startHook() { } private void hookSetBar() { - XposedHelpers.findAndHookMethod(CLASS_PHONE_STATUS_BAR_VIEW, + findAndHookMethod(CLASS_PHONE_STATUS_BAR_VIEW, mClassLoader, "setBar", CLASS_STATUS_BAR, - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - try { - prepareLayoutStatusBar(param); - } catch (Throwable t) { - XLog.e("", t); - } + protected void after(MethodHookParam param) { + prepareLayoutStatusBar(param); } }); } @@ -86,8 +84,8 @@ private void prepareLayoutStatusBar(XC_MethodHook.MethodHookParam param) { Context context = phoneStatusBarView.getContext(); Resources res = context.getResources(); -// LinearLayout statusBarContents = phoneStatusBarView.findViewById( -// res.getIdentifier("status_bar_contents", "id", PACKAGE_NAME)); + // LinearLayout statusBarContents = phoneStatusBarView.findViewById( + // res.getIdentifier("status_bar_contents", "id", PACKAGE_NAME)); TextView clock = phoneStatusBarView.findViewById( res.getIdentifier("clock", "id", PACKAGE_NAME)); @@ -114,12 +112,12 @@ private void prepareLayoutStatusBar(XC_MethodHook.MethodHookParam param) { } private void hookGetActualWidth() { - XposedHelpers.findAndHookMethod(CLASS_NOTIFICATION_ICON_CONTAINER, + findAndHookMethod(CLASS_NOTIFICATION_ICON_CONTAINER, mClassLoader, "getActualWidth", - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { + protected void after(MethodHookParam param) { if (mCenterLayout == null) return; if (mCenterLayout.getChildCount() == 0) diff --git a/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/statusbar/SignalClusterViewHook.java b/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/statusbar/SignalClusterViewHook.java index f71a43a..cead9d1 100644 --- a/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/statusbar/SignalClusterViewHook.java +++ b/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/statusbar/SignalClusterViewHook.java @@ -5,15 +5,18 @@ import com.tianma.tweaks.miui.utils.XLog; import com.tianma.tweaks.miui.utils.XSPUtils; +import com.tianma.tweaks.miui.utils.rom.MiuiVersion; import com.tianma.tweaks.miui.xp.hook.BaseSubHook; +import com.tianma.tweaks.miui.xp.wrapper.MethodHookWrapper; + +import java.util.List; -import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XSharedPreferences; +import de.robv.android.xposed.XposedHelpers; -import static de.robv.android.xposed.XposedHelpers.findAndHookMethod; +import static com.tianma.tweaks.miui.xp.wrapper.XposedWrapper.findAndHookMethod; import static de.robv.android.xposed.XposedHelpers.getObjectField; import static de.robv.android.xposed.XposedHelpers.getSurroundingThis; -import static de.robv.android.xposed.XposedHelpers.setBooleanField; public class SignalClusterViewHook extends BaseSubHook { @@ -27,8 +30,8 @@ public class SignalClusterViewHook extends BaseSubHook { private boolean mCustomMobileNetworkTypeEnabled; private String mCustomMobileNetworkType = ""; - public SignalClusterViewHook(ClassLoader classLoader, XSharedPreferences xsp) { - super(classLoader, xsp); + public SignalClusterViewHook(ClassLoader classLoader, XSharedPreferences xsp, MiuiVersion miuiVersion) { + super(classLoader, xsp, miuiVersion); mDualMobileSignal = XSPUtils.isDualMobileSignal(xsp); mHideVpnIcon = XSPUtils.isHideVpnIcon(xsp); @@ -44,8 +47,7 @@ public void startHook() { try { XLog.d("Hooking SignalClusterView... "); if (mDualMobileSignal) { - hookUpdateSwitches(); - hookUpdateNotchEar(); + hookSetSubs(); } if (mHideVpnIcon) { @@ -60,37 +62,18 @@ public void startHook() { } } - // SignalClusterView#updateSwitches() - private void hookUpdateSwitches() { - findAndHookMethod(CLASS_SIGNAL_CLUSTER_VIEW, - mClassLoader, - "updateSwitches", - new XC_MethodHook() { - @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - try { - Object signalClusterView = param.thisObject; - setBooleanField(signalClusterView, "mNotchEarDualEnable", true); - } catch (Throwable t) { - XLog.e("", t); - } - } - }); - } - - // SignalClusterView#updateNotchEar() - private void hookUpdateNotchEar() { + // SignalClusterView#hookSetSubs() + private void hookSetSubs() { findAndHookMethod(CLASS_SIGNAL_CLUSTER_VIEW, mClassLoader, - "updateNotchEar", - new XC_MethodHook() { + "setSubs", + List.class, + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - try { - Object signalClusterView = param.thisObject; - setBooleanField(signalClusterView, "mNotchEar", true); - } catch (Throwable t) { - XLog.e("", t); + protected void before(MethodHookParam param) { + XposedHelpers.setBooleanField(param.thisObject, "mNotchEar", true); + if (mMiuiVersion.getTime() >= MiuiVersion.V_19_5_7.getTime()) { + XposedHelpers.setBooleanField(param.thisObject, "mNotchEarDualEnable", true); } } }); @@ -101,17 +84,13 @@ private void hookApply() { findAndHookMethod(CLASS_SIGNAL_CLUSTER_VIEW, mClassLoader, "apply", - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - try { - Object signalClusterView = param.thisObject; - View mVpn = (View) getObjectField(signalClusterView, "mVpn"); - if (mVpn != null && mVpn.getVisibility() != View.GONE) { - mVpn.setVisibility(View.GONE); - } - } catch (Throwable t) { - XLog.e("", t); + protected void after(MethodHookParam param) { + Object signalClusterView = param.thisObject; + View mVpn = (View) getObjectField(signalClusterView, "mVpn"); + if (mVpn != null && mVpn.getVisibility() != View.GONE) { + mVpn.setVisibility(View.GONE); } } }); @@ -124,21 +103,17 @@ private void hookPhoneStateApply() { mClassLoader, "apply", boolean.class, - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - try { - Object phoneState = param.thisObject; - Object signalClusterView = getSurroundingThis(phoneState); - - TextView mMobileType = (TextView) getObjectField(phoneState, "mMobileType"); - TextView mSignalDualNotchMobileType = (TextView) getObjectField(signalClusterView, "mSignalDualNotchMobileType"); - - mMobileType.setText(mCustomMobileNetworkType); - mSignalDualNotchMobileType.setText(mCustomMobileNetworkType); - } catch (Throwable t) { - XLog.e("", t); - } + protected void after(MethodHookParam param) { + Object phoneState = param.thisObject; + Object signalClusterView = getSurroundingThis(phoneState); + + TextView mMobileType = (TextView) getObjectField(phoneState, "mMobileType"); + TextView mSignalDualNotchMobileType = (TextView) getObjectField(signalClusterView, "mSignalDualNotchMobileType"); + + mMobileType.setText(mCustomMobileNetworkType); + mSignalDualNotchMobileType.setText(mCustomMobileNetworkType); } }); } diff --git a/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/statusbar/StatusBarClockHook.java b/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/statusbar/StatusBarClockHook.java index b51db62..8766e3f 100644 --- a/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/statusbar/StatusBarClockHook.java +++ b/app/src/main/java/com/tianma/tweaks/miui/xp/hook/systemui/statusbar/StatusBarClockHook.java @@ -15,6 +15,7 @@ import com.tianma.tweaks.miui.xp.hook.systemui.helper.ResHelpers; import com.tianma.tweaks.miui.xp.hook.systemui.tick.TickObserver; import com.tianma.tweaks.miui.xp.hook.systemui.tick.TimeTicker; +import com.tianma.tweaks.miui.xp.wrapper.MethodHookWrapper; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -23,12 +24,13 @@ import java.util.Locale; import java.util.Set; -import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XC_MethodReplacement; import de.robv.android.xposed.XSharedPreferences; -import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; +import static com.tianma.tweaks.miui.xp.wrapper.XposedWrapper.findAndHookMethod; +import static com.tianma.tweaks.miui.xp.wrapper.XposedWrapper.hookAllConstructors; + /** * 状态栏时钟 Hook * 适用版本 9.4.x+ @@ -134,38 +136,34 @@ public void startHook() { // com.android.systemui.statusbar.policy.Clock#updateClock private void hookClockUpdateClock() { - XposedHelpers.findAndHookMethod(mClockCls, + findAndHookMethod(mClockCls, "updateClock", - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - try { - TextView clockView = (TextView) param.thisObject; - Resources res = clockView.getResources(); - int id = clockView.getId(); - String timeStr = clockView.getText().toString(); - if (id == ResHelpers.getId(res, "clock")) { - if (mStatusBarClockFormatEnabled) { - timeStr = getCustomFormatTime(); - } else if (mShowSecInStatusBar) { - timeStr = addInSecond(timeStr); - } else { - return; - } - } else if (id == ResHelpers.getId(res, "big_time") - || id == ResHelpers.getId(res, "date_time")) { - if (mShowSecInDropdownStatusBar) { - timeStr = addInSecond(timeStr); - } else { - return; - } + protected void after(MethodHookParam param) { + TextView clockView = (TextView) param.thisObject; + Resources res = clockView.getResources(); + int id = clockView.getId(); + String timeStr = clockView.getText().toString(); + if (id == ResHelpers.getId(res, "clock")) { + if (mStatusBarClockFormatEnabled) { + timeStr = getCustomFormatTime(); + } else if (mShowSecInStatusBar) { + timeStr = addInSecond(timeStr); + } else { + return; + } + } else if (id == ResHelpers.getId(res, "big_time") + || id == ResHelpers.getId(res, "date_time")) { + if (mShowSecInDropdownStatusBar) { + timeStr = addInSecond(timeStr); } else { return; } - clockView.setText(timeStr); - } catch (Throwable t) { - XLog.e("", t); + } else { + return; } + clockView.setText(timeStr); } }); } @@ -182,38 +180,34 @@ private String getCustomFormatTime() { // com.android.systemui.statusbar.policy.Clock#access() private void hookClockConstructor() { - XposedBridge.hookAllConstructors(mClockCls, - new XC_MethodHook() { + hookAllConstructors(mClockCls, + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - try { - TextView clock = (TextView) param.thisObject; - Resources res = clock.getResources(); - int id = clock.getId(); - if (id == ResHelpers.getId(res, "clock")) { - if (mBlockSystemTimeTick) { - addClock(clock); - } - if (mStatusBarClockColorEnabled) { - clock.setTextColor(mStatusBarClockColor); - } - } else if (id == ResHelpers.getId(res, "big_time")) { - if (mBlockSystemTimeTick) { - addClock(clock); - } - if (mDropdownStatusBarClockColorEnabled) { - clock.setTextColor(mDropdownStatusBarClockColor); - } - } else if (id == ResHelpers.getId(res, "date_time")) { - if (mBlockSystemTimeTick) { - addClock(clock); - } - if (mDropdownStatusBarClockColorEnabled) { - clock.setTextColor(mDropdownStatusBarDateColor); - } + protected void after(MethodHookParam param) { + TextView clock = (TextView) param.thisObject; + Resources res = clock.getResources(); + int id = clock.getId(); + if (id == ResHelpers.getId(res, "clock")) { + if (mBlockSystemTimeTick) { + addClock(clock); + } + if (mStatusBarClockColorEnabled) { + clock.setTextColor(mStatusBarClockColor); + } + } else if (id == ResHelpers.getId(res, "big_time")) { + if (mBlockSystemTimeTick) { + addClock(clock); + } + if (mDropdownStatusBarClockColorEnabled) { + clock.setTextColor(mDropdownStatusBarClockColor); + } + } else if (id == ResHelpers.getId(res, "date_time")) { + if (mBlockSystemTimeTick) { + addClock(clock); + } + if (mDropdownStatusBarClockColorEnabled) { + clock.setTextColor(mDropdownStatusBarDateColor); } - } catch (Throwable e) { - XLog.e("", e); } } }); @@ -221,7 +215,7 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable { private void hookOnDarkChanged() { if (mStatusBarClockColorEnabled) { - XposedHelpers.findAndHookMethod(mClockCls, + findAndHookMethod(mClockCls, "onDarkChanged", Rect.class, float.class, @@ -241,24 +235,20 @@ private void hookStatusBar() { // com.android.systemui.statusbar.phone.StatusBar#makeStatusBarView() private void hookMakeStatusBarView() { - XposedHelpers.findAndHookMethod(CLASS_STATUS_BAR, + findAndHookMethod(CLASS_STATUS_BAR, mClassLoader, "makeStatusBarView", - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - try { - Object statusBar = param.thisObject; - Context context = (Context) XposedHelpers.getObjectField(statusBar, "mContext"); - - // register receiver - IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_SCREEN_ON); - filter.addAction(Intent.ACTION_SCREEN_OFF); - context.registerReceiver(mScreenReceiver, filter); - } catch (Throwable t) { - XLog.e("", t); - } + protected void after(MethodHookParam param) { + Object statusBar = param.thisObject; + Context context = (Context) XposedHelpers.getObjectField(statusBar, "mContext"); + + // register receiver + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_SCREEN_ON); + filter.addAction(Intent.ACTION_SCREEN_OFF); + context.registerReceiver(mScreenReceiver, filter); } }); } @@ -299,40 +289,36 @@ private void hookReceiverInfo() { // com.android.systemui.statusbar.policy.Clock$ReceiverInfo#register() private void hookRegister() { - XposedHelpers.findAndHookMethod(CLASS_RECEIVER_INFO, + findAndHookMethod(CLASS_RECEIVER_INFO, mClassLoader, "register", Context.class, - new XC_MethodHook() { + new MethodHookWrapper() { @Override - protected void beforeHookedMethod(MethodHookParam param) throws Throwable { - try { - Object thisObject = param.thisObject; - Context context = (Context) param.args[0]; - IntentFilter filter = new IntentFilter(); - // 不再接收 TIME_TICK 广播 - // filter.addAction("android.intent.action.TIME_TICK"); - filter.addAction("android.intent.action.TIME_SET"); - filter.addAction("android.intent.action.TIMEZONE_CHANGED"); - filter.addAction("android.intent.action.CONFIGURATION_CHANGED"); - filter.addAction("android.intent.action.USER_SWITCHED"); - Object receiver = XposedHelpers.getObjectField(thisObject, "mReceiver"); - Object USER_HANDLE_ALL = XposedHelpers.getStaticObjectField(UserHandle.class, "ALL"); - Class dependencyClass = XposedHelpers.findClass(CLASS_DEPENDENCY, mClassLoader); - Object TIME_TICK_HANDLER = XposedHelpers.getStaticObjectField(dependencyClass, "TIME_TICK_HANDLER"); - Object handler = XposedHelpers.callStaticMethod(dependencyClass, "get", TIME_TICK_HANDLER); - // context.registerReceiverAsUser(this.mReceiver, UserHandle.ALL, filter, null, (Handler) Dependency.get(Dependency.TIME_TICK_HANDLER)); - XposedHelpers.callMethod(context, - "registerReceiverAsUser", - receiver, - USER_HANDLE_ALL, - filter, - null, - handler); - param.setResult(null); - } catch (Throwable t) { - XLog.e("", t); - } + protected void before(MethodHookParam param) { + Object thisObject = param.thisObject; + Context context = (Context) param.args[0]; + IntentFilter filter = new IntentFilter(); + // 不再接收 TIME_TICK 广播 + // filter.addAction("android.intent.action.TIME_TICK"); + filter.addAction("android.intent.action.TIME_SET"); + filter.addAction("android.intent.action.TIMEZONE_CHANGED"); + filter.addAction("android.intent.action.CONFIGURATION_CHANGED"); + filter.addAction("android.intent.action.USER_SWITCHED"); + Object receiver = XposedHelpers.getObjectField(thisObject, "mReceiver"); + Object USER_HANDLE_ALL = XposedHelpers.getStaticObjectField(UserHandle.class, "ALL"); + Class dependencyClass = XposedHelpers.findClass(CLASS_DEPENDENCY, mClassLoader); + Object TIME_TICK_HANDLER = XposedHelpers.getStaticObjectField(dependencyClass, "TIME_TICK_HANDLER"); + Object handler = XposedHelpers.callStaticMethod(dependencyClass, "get", TIME_TICK_HANDLER); + // context.registerReceiverAsUser(this.mReceiver, UserHandle.ALL, filter, null, (Handler) Dependency.get(Dependency.TIME_TICK_HANDLER)); + XposedHelpers.callMethod(context, + "registerReceiverAsUser", + receiver, + USER_HANDLE_ALL, + filter, + null, + handler); + param.setResult(null); } }); } diff --git a/app/src/main/java/com/tianma/tweaks/miui/xp/wrapper/MethodHookWrapper.java b/app/src/main/java/com/tianma/tweaks/miui/xp/wrapper/MethodHookWrapper.java new file mode 100644 index 0000000..6075ed2 --- /dev/null +++ b/app/src/main/java/com/tianma/tweaks/miui/xp/wrapper/MethodHookWrapper.java @@ -0,0 +1,32 @@ +package com.tianma.tweaks.miui.xp.wrapper; + +import com.tianma.tweaks.miui.utils.XLog; + +import de.robv.android.xposed.XC_MethodHook; + +public abstract class MethodHookWrapper extends XC_MethodHook { + + @Override + final protected void beforeHookedMethod(MethodHookParam param) throws Throwable { + try { + before(param); + } catch (Throwable t) { + XLog.d("Error in hook %s", param.method.getName(), t); + } + } + + protected void before(MethodHookParam param) { + } + + @Override + final protected void afterHookedMethod(MethodHookParam param) throws Throwable { + try { + after(param); + } catch (Throwable t) { + XLog.e("Error in hook %s", param.method.getName(), t); + } + } + + protected void after(MethodHookParam param) { + } +} diff --git a/app/src/main/java/com/tianma/tweaks/miui/xp/wrapper/XposedWrapper.java b/app/src/main/java/com/tianma/tweaks/miui/xp/wrapper/XposedWrapper.java new file mode 100644 index 0000000..3e8826e --- /dev/null +++ b/app/src/main/java/com/tianma/tweaks/miui/xp/wrapper/XposedWrapper.java @@ -0,0 +1,46 @@ +package com.tianma.tweaks.miui.xp.wrapper; + +import com.tianma.tweaks.miui.utils.XLog; + +import java.util.Set; + +import de.robv.android.xposed.XC_MethodHook; +import de.robv.android.xposed.XposedBridge; +import de.robv.android.xposed.XposedHelpers; + +/** + * Xposed Wrapper Utils + */ +public class XposedWrapper { + + private XposedWrapper() { + } + + public static XC_MethodHook.Unhook findAndHookMethod(String className, ClassLoader classLoader, String methodName, Object... parameterTypesAndCallback) { + try { + return XposedHelpers.findAndHookMethod(className, classLoader, methodName, parameterTypesAndCallback); + } catch (Throwable t) { + XLog.e("Error in hook %s#%s", className, methodName, t); + return null; + } + } + + public static XC_MethodHook.Unhook findAndHookMethod(Class clazz, String methodName, Object... parameterTypesAndCallback) { + try { + return XposedHelpers.findAndHookMethod(clazz, methodName, parameterTypesAndCallback); + } catch (Throwable t) { + XLog.e("Error in hook %s#%s", clazz.getName(), methodName, t); + return null; + } + } + + public static Set hookAllConstructors(Class hookClass, XC_MethodHook callback) { + try { + return XposedBridge.hookAllConstructors(hookClass, callback); + } catch (Throwable t) { + XLog.e("Error in hookAllConstructors: %s", hookClass.getName(), t); + return null; + } + } + +}