@@ -2,26 +2,91 @@ package com.programminghoch10.KeepSplitScreenRatio
22
33import android.os.IBinder
44import de.robv.android.xposed.IXposedHookLoadPackage
5+ import de.robv.android.xposed.XC_MethodReplacement
6+ import de.robv.android.xposed.XposedBridge
57import de.robv.android.xposed.XposedHelpers
68import de.robv.android.xposed.callbacks.XC_LoadPackage
79import de.robv.android.xposed.XC_MethodHook as MethodHook
810
11+
912class Hook : IXposedHookLoadPackage {
1013
1114 override fun handleLoadPackage (lpparam : XC_LoadPackage .LoadPackageParam ) {
1215 if (lpparam.packageName != " com.android.systemui" ) return
1316
14- val SplitScreenTransitionsClass = XposedHelpers .findClass(" com.android.wm.shell.splitscreen.SplitScreenTransitions" , lpparam.classLoader)
17+ val SplitLayoutClass = XposedHelpers .findClass(" com.android.wm.shell.common.split.SplitLayout" , lpparam.classLoader)
18+ val StageCoordinatorClass = XposedHelpers .findClass(" com.android.wm.shell.splitscreen.StageCoordinator" , lpparam.classLoader)
19+
20+ /*
21+ Currently this module disables SplitScreen enter and dismiss animations completely.
22+
23+ Before animating, the Divider state is initialized in
24+ https://github.com/LineageOS/android_frameworks_base/blob/2dc97cf3d6234c87497ca78b2734bb3ed604c349/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java#L1849
25+ then a "fling to center" is started in
26+ https://github.com/LineageOS/android_frameworks_base/blob/2dc97cf3d6234c87497ca78b2734bb3ed604c349/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java#L3586
27+ Since this "fling to center" is embedded deeply,
28+ we currently simply disable it.
29+ */
30+
1531 XposedHelpers .findAndHookMethod(
16- SplitScreenTransitionsClass ,
17- " setEnterTransition" ,
18- IBinder ::class .java,
19- " android.window.RemoteTransition" ,
32+ StageCoordinatorClass ,
33+ " onSnappedToDismiss" ,
2034 Int ::class .java,
2135 Boolean ::class .java,
36+ object : MethodHook () {
37+ override fun afterHookedMethod (param : MethodHookParam ) {
38+ // reset the divider position after a fling to dismiss is finished,
39+ // since the SplitScreen enter animation won't take care of it anymore
40+ val mSplitLayout = XposedHelpers .getObjectField(param.thisObject, " mSplitLayout" )
41+ // XposedHelpers.callMethod(mSplitLayout, "resetDividerPosition")
42+ XposedBridge .invokeOriginalMethod(
43+ XposedHelpers .findMethodExact(
44+ SplitLayoutClass ,
45+ " resetDividerPosition" ,
46+ * arrayOf<Any >(),
47+ ),
48+ mSplitLayout,
49+ arrayOf(),
50+ )
51+ }
52+ },
53+ )
54+
55+ // disable resetDividerPosition entirely
56+ XposedHelpers .findAndHookMethod(
57+ SplitLayoutClass ,
58+ " resetDividerPosition" ,
59+ XC_MethodReplacement .DO_NOTHING ,
60+ )
61+
62+ XposedHelpers .findAndHookMethod(
63+ StageCoordinatorClass ,
64+ " prepareSplitLayout" ,
65+ " android.window.WindowContainerTransaction" ,
66+ Boolean ::class .java,
67+ object : MethodHook () {
68+ override fun beforeHookedMethod (param : MethodHookParam ) {
69+ // disabling resizeAnim makes the method call resetDividerPosition()
70+ param.args[1 ] = false
71+ }
72+ },
73+ )
74+
75+ val startPendingAnimationMethod =
76+ StageCoordinatorClass .declaredMethods.find { it.name == " startPendingAnimation" && it.parameterTypes[0 ] == IBinder ::class .java }!!
77+ XposedBridge .hookMethod(
78+ startPendingAnimationMethod,
2279 object : MethodHook () {
2380 override fun beforeHookedMethod (param : MethodHookParam ) {
24- param.args[3 ] = false
81+ val binder = param.args[0 ] as IBinder
82+ val stageCoordinator = param.thisObject
83+ val mSplitTransitions = XposedHelpers .getObjectField(stageCoordinator, " mSplitTransitions" )
84+ val isPendingEnter = XposedHelpers .callMethod(mSplitTransitions, " isPendingEnter" , binder) as Boolean
85+ if (! isPendingEnter) return
86+ val mPendingEnter = XposedHelpers .getObjectField(mSplitTransitions, " mPendingEnter" )
87+ XposedHelpers .getBooleanField(mPendingEnter, " mResizeAnim" )
88+ // disable resizeAnim when entering SplitScreen
89+ XposedHelpers .setBooleanField(mPendingEnter, " mResizeAnim" , false )
2590 }
2691 },
2792 )
0 commit comments