Skip to content

Commit baa1c5c

Browse files
fix KeepSplitScreenRatio keeping 100%/0% split after dragging to close
1 parent c28f003 commit baa1c5c

File tree

1 file changed

+71
-6
lines changed
  • KeepSplitScreenRatio/src/main/java/com/programminghoch10/KeepSplitScreenRatio

1 file changed

+71
-6
lines changed

KeepSplitScreenRatio/src/main/java/com/programminghoch10/KeepSplitScreenRatio/Hook.kt

Lines changed: 71 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,91 @@ package com.programminghoch10.KeepSplitScreenRatio
22

33
import android.os.IBinder
44
import de.robv.android.xposed.IXposedHookLoadPackage
5+
import de.robv.android.xposed.XC_MethodReplacement
6+
import de.robv.android.xposed.XposedBridge
57
import de.robv.android.xposed.XposedHelpers
68
import de.robv.android.xposed.callbacks.XC_LoadPackage
79
import de.robv.android.xposed.XC_MethodHook as MethodHook
810

11+
912
class 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

Comments
 (0)