Skip to content

Commit f0bdbfe

Browse files
create snaptarget instances using Unsafe
this removes a lot of sdk int checks and should be more reliable since the constructor parameters cannot be randomly swapped anymore
1 parent da46604 commit f0bdbfe

File tree

3 files changed

+11
-14
lines changed

3 files changed

+11
-14
lines changed

SplitScreenMods/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,5 @@ dependencies {
1717
implementation(libs.androidx.fragment.ktx)
1818
implementation(libs.androidx.preference.ktx)
1919
implementation(project(":logger"))
20+
compileOnly(libs.androidx.performance.unsafe)
2021
}

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

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import de.robv.android.xposed.XposedBridge
1414
import de.robv.android.xposed.XposedHelpers
1515
import de.robv.android.xposed.callbacks.XC_InitPackageResources
1616
import de.robv.android.xposed.callbacks.XC_LoadPackage
17+
import sun.misc.Unsafe
1718

1819
// https://github.com/LineageOS/android_frameworks_base/blob/f0964915f5992fd38cf1e5e3f87c0d3ac719aa09/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/split/SplitScreenConstants.java
1920
const val SNAP_TO_2_33_66 = 0
@@ -42,21 +43,14 @@ class AdditionalSnapTargetsHook : IXposedHookLoadPackage, IXposedHookInitPackage
4243

4344
val DividerSnapAlgorithmClass = XposedHelpers.findClass("com.android.wm.shell.common.split.DividerSnapAlgorithm", lpparam.classLoader)
4445
val SnapTargetClass = XposedHelpers.findClass(DividerSnapAlgorithmClass.name + "\$SnapTarget", lpparam.classLoader)
45-
val SnapTargetClassConstructor = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) XposedHelpers.findConstructorExact(
46-
SnapTargetClass,
47-
Int::class.java,
48-
Int::class.java,
49-
)
50-
else XposedHelpers.findConstructorExact(
51-
SnapTargetClass,
52-
Int::class.java,
53-
Int::class.java,
54-
Int::class.java,
55-
)
56-
46+
val UnsafeClass = XposedHelpers.findClass("sun.misc.Unsafe",lpparam.classLoader)
47+
val unsafe = XposedHelpers.callStaticMethod(UnsafeClass, "getUnsafe") as Unsafe
5748
fun createNewSnapTargetInstance(position: Int, snapPosition: Int): Any {
58-
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) SnapTargetClassConstructor.newInstance(position, snapPosition)
59-
else SnapTargetClassConstructor.newInstance(position, 0, snapPosition)
49+
val snapTarget = unsafe.allocateInstance(SnapTargetClass)
50+
XposedHelpers.setIntField(snapTarget, "position", position)
51+
XposedHelpers.setIntField(snapTarget, "snapPosition", snapPosition)
52+
XposedHelpers.setFloatField(snapTarget, "distanceMultiplier", 1f)
53+
return snapTarget
6054
}
6155

6256
XposedBridge.hookAllConstructors(DividerSnapAlgorithmClass, object : XC_MethodHook() {

gradle/libs.versions.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ hiddenapibypass = "6.1"
1111
jebrainsAnnotations = "26.0.2-1"
1212
kotlin = "2.2.20"
1313
libsu = "6.0.0"
14+
performanceUnsafe = "1.0.0-alpha01"
1415
preference = "1.2.1"
1516
xposed = "82"
1617

@@ -22,6 +23,7 @@ androidx-annotation = { module = "androidx.annotation:annotation", version.ref =
2223
androidx-collection-ktx = { module = "androidx.collection:collection-ktx", version.ref = "collection" }
2324
androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "core" }
2425
androidx-fragment-ktx = { group = "androidx.fragment", name = "fragment-ktx", version.ref = "fragment" }
26+
androidx-performance-unsafe = { module = "androidx.performance:performance-unsafe", version.ref = "performanceUnsafe" }
2527
androidx-preference = { group = "androidx.preference", name = "preference", version.ref = "preference" }
2628
androidx-preference-ktx = { group = "androidx.preference", name = "preference-ktx", version.ref = "preference" }
2729
github-api = { module = "org.kohsuke:github-api", version.ref = "githubApi" }

0 commit comments

Comments
 (0)