Skip to content

Commit 8931085

Browse files
SplitScreenMods: fix DividerSnapAlgorithm constructor hook on B
1 parent a12e1c5 commit 8931085

5 files changed

Lines changed: 34 additions & 12 deletions

File tree

SplitScreenMods/src/main/java/com/programminghoch10/SplitScreenMods/AdditionalSnapTargetsHook.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import de.robv.android.xposed.IXposedHookInitPackageResources
1010
import de.robv.android.xposed.IXposedHookLoadPackage
1111
import de.robv.android.xposed.XC_MethodHook
1212
import de.robv.android.xposed.XSharedPreferences
13-
import de.robv.android.xposed.XposedBridge
1413
import de.robv.android.xposed.XposedHelpers
1514
import de.robv.android.xposed.callbacks.XC_InitPackageResources
1615
import de.robv.android.xposed.callbacks.XC_LoadPackage
@@ -45,7 +44,7 @@ class AdditionalSnapTargetsHook : IXposedHookLoadPackage, IXposedHookInitPackage
4544
return snapTarget
4645
}
4746

48-
XposedBridge.hookAllConstructors(DividerSnapAlgorithmClass, object : XC_MethodHook() {
47+
hookDividerSnapAlgorithmAfterConstructor(lpparam.classLoader, object : XC_MethodHook() {
4948
override fun afterHookedMethod(param: MethodHookParam) {
5049
log("after ${DividerSnapAlgorithmClass.simpleName} constructor")
5150
val res = param.args[0] as Resources

SplitScreenMods/src/main/java/com/programminghoch10/SplitScreenMods/DisableFlingToDismissHook.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import de.binarynoise.logger.Logger.log
77
import de.robv.android.xposed.IXposedHookLoadPackage
88
import de.robv.android.xposed.XC_MethodHook
99
import de.robv.android.xposed.XSharedPreferences
10-
import de.robv.android.xposed.XposedBridge
1110
import de.robv.android.xposed.XposedHelpers
1211
import de.robv.android.xposed.callbacks.XC_LoadPackage
1312

@@ -25,8 +24,7 @@ class DisableFlingToDismissHook : IXposedHookLoadPackage {
2524
val enabled = preferences.getBoolean("DisableFlingToDismiss", false)
2625
if (!enabled) return
2726

28-
val DividerSnapAlgorithmClass = XposedHelpers.findClass("com.android.wm.shell.common.split.DividerSnapAlgorithm", lpparam.classLoader)
29-
XposedBridge.hookAllConstructors(DividerSnapAlgorithmClass, object : XC_MethodHook() {
27+
hookDividerSnapAlgorithmAfterConstructor(lpparam.classLoader, object : XC_MethodHook() {
3028
override fun afterHookedMethod(param: MethodHookParam) {
3129
log("disabling dismiss targets")
3230
XposedHelpers.setObjectField(

SplitScreenMods/src/main/java/com/programminghoch10/SplitScreenMods/DisableSnapToDismissHook.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import de.binarynoise.logger.Logger.log
77
import de.robv.android.xposed.IXposedHookLoadPackage
88
import de.robv.android.xposed.XC_MethodHook
99
import de.robv.android.xposed.XSharedPreferences
10-
import de.robv.android.xposed.XposedBridge
1110
import de.robv.android.xposed.XposedHelpers
1211
import de.robv.android.xposed.callbacks.XC_LoadPackage
1312

@@ -30,8 +29,7 @@ class DisableSnapToDismissHook : IXposedHookLoadPackage {
3029
val enabled = preferences.getBoolean("DisableSnapToDismiss", false)
3130
if (!enabled) return
3231

33-
val DividerSnapAlgorithmClass = XposedHelpers.findClass("com.android.wm.shell.common.split.DividerSnapAlgorithm", lpparam.classLoader)
34-
XposedBridge.hookAllConstructors(DividerSnapAlgorithmClass, object : XC_MethodHook() {
32+
hookDividerSnapAlgorithmAfterConstructor(lpparam.classLoader, object : XC_MethodHook() {
3533
override fun afterHookedMethod(param: MethodHookParam) {
3634
val mTargets = XposedHelpers.getObjectField(param.thisObject, "mTargets") as ArrayList<Any?>
3735
if (mTargets.isEmpty()) return

SplitScreenMods/src/main/java/com/programminghoch10/SplitScreenMods/FreeSnapHook.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import de.binarynoise.logger.Logger.log
66
import de.robv.android.xposed.IXposedHookLoadPackage
77
import de.robv.android.xposed.XC_MethodHook
88
import de.robv.android.xposed.XSharedPreferences
9-
import de.robv.android.xposed.XposedBridge
109
import de.robv.android.xposed.XposedHelpers
1110
import de.robv.android.xposed.callbacks.XC_LoadPackage
1211

@@ -24,11 +23,10 @@ class FreeSnapHook : IXposedHookLoadPackage {
2423
val enabled = preferences.getBoolean("FreeSnap", false)
2524
if (!enabled) return
2625

27-
val DividerSnapAlgorithmClass = XposedHelpers.findClass("com.android.wm.shell.common.split.DividerSnapAlgorithm", lpparam.classLoader)
28-
XposedBridge.hookAllConstructors(DividerSnapAlgorithmClass, object : XC_MethodHook() {
26+
hookDividerSnapAlgorithmAfterConstructor(lpparam.classLoader, object : XC_MethodHook() {
2927
override fun afterHookedMethod(param: MethodHookParam) {
3028
XposedHelpers.setBooleanField(param.thisObject, "mFreeSnapMode", true)
31-
log("${DividerSnapAlgorithmClass.simpleName} mFreeSnapMode constant changed to true")
29+
log("${param.thisObject::class.java.simpleName} mFreeSnapMode constant changed to true")
3230
}
3331
})
3432
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.programminghoch10.SplitScreenMods
2+
3+
import android.os.Build
4+
import de.robv.android.xposed.XC_MethodHook
5+
import de.robv.android.xposed.XposedBridge
6+
import de.robv.android.xposed.XposedHelpers
7+
8+
/**
9+
* hook after `DividerSnapAlgorithm` constructor
10+
* this is needed because [Build.VERSION_CODES.BAKLAVA] removed the constructor entirely,
11+
* so we hook the calling function instead
12+
*/
13+
fun hookDividerSnapAlgorithmAfterConstructor(classLoader: ClassLoader, methodHook: XC_MethodHook) {
14+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA) {
15+
val SplitLayoutClass = XposedHelpers.findClass("com.android.wm.shell.common.split.SplitLayout", classLoader)
16+
XposedHelpers.findAndHookMethod(SplitLayoutClass, "updateLayouts", object : XC_MethodHook() {
17+
override fun afterHookedMethod(param: MethodHookParam) {
18+
val mDividerSnapAlgorithm = XposedHelpers.getObjectField(param.thisObject, "mDividerSnapAlgorithm")
19+
//param.thisObject = mDividerSnapAlgorithm
20+
val newParam = XposedHelpers.newInstance(MethodHookParam::class.java) as MethodHookParam
21+
newParam.thisObject = mDividerSnapAlgorithm
22+
XposedHelpers.callMethod(methodHook, "afterHookedMethod", newParam)
23+
}
24+
})
25+
} else {
26+
val DividerSnapAlgorithmClass = XposedHelpers.findClass("com.android.wm.shell.common.split.DividerSnapAlgorithm", classLoader)
27+
XposedBridge.hookAllConstructors(DividerSnapAlgorithmClass, methodHook)
28+
}
29+
}

0 commit comments

Comments
 (0)