Skip to content

Commit ea44a89

Browse files
implement freesnap splitscreen mod
1 parent 1bedda0 commit ea44a89

File tree

6 files changed

+52
-0
lines changed

6 files changed

+52
-0
lines changed

SplitScreenMods/Readme.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,6 @@ Keep the split screen ratio, when switching one of the split apps.
1717
Only required on Android 14 and later,
1818
since previous versions did not force a split resize in this situation.
1919

20+
## FreeSnap
21+
22+
Allow any split ratio instead of snapping to predefined ratios.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
com.programminghoch10.SplitScreenMods.AlwaysAllowMultiInstanceSplitHook
2+
com.programminghoch10.SplitScreenMods.FreeSnapHook
23
com.programminghoch10.SplitScreenMods.KeepSplitScreenRatioHook
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.programminghoch10.SplitScreenMods
2+
3+
import android.os.Build
4+
import com.programminghoch10.SplitScreenMods.BuildConfig.SHARED_PREFERENCES_NAME
5+
import com.programminghoch10.SplitScreenMods.FreeSnapHookConfig.enabled
6+
import de.binarynoise.logger.Logger.log
7+
import de.robv.android.xposed.IXposedHookLoadPackage
8+
import de.robv.android.xposed.XC_MethodHook
9+
import de.robv.android.xposed.XSharedPreferences
10+
import de.robv.android.xposed.XposedBridge
11+
import de.robv.android.xposed.XposedHelpers
12+
import de.robv.android.xposed.callbacks.XC_LoadPackage
13+
14+
object FreeSnapHookConfig {
15+
@JvmField
16+
val enabled = Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE
17+
}
18+
19+
class FreeSnapHook : IXposedHookLoadPackage {
20+
override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) {
21+
if (lpparam.packageName != "com.android.systemui") return
22+
if (!enabled) return
23+
log("handleLoadPackage(${lpparam.packageName} in process ${lpparam.processName})")
24+
val preferences = XSharedPreferences(BuildConfig.APPLICATION_ID, SHARED_PREFERENCES_NAME)
25+
val enabled = preferences.getBoolean("FreeSnap", false)
26+
if (!enabled) return
27+
28+
val DividerSnapAlgorithmClass =
29+
XposedHelpers.findClass("com.android.wm.shell.common.split.DividerSnapAlgorithm", lpparam.classLoader)
30+
XposedBridge.hookAllConstructors(DividerSnapAlgorithmClass, object : XC_MethodHook() {
31+
override fun afterHookedMethod(param: MethodHookParam) {
32+
XposedHelpers.setBooleanField(param.thisObject, "mFreeSnapMode", true)
33+
log("${DividerSnapAlgorithmClass.simpleName} mFreeSnapMode constant changed to true")
34+
}
35+
})
36+
}
37+
}

SplitScreenMods/src/main/res/values/strings.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,8 @@
1515
Keep the split screen ratio, when switching one of the split apps.
1616
</string>
1717
<string name="restart_required">A restart is required to apply changes!</string>
18+
<string name="freesnap_title">FreeSnap</string>
19+
<string name="freesnap_summary">
20+
Allow any split ratio instead of snapping to predefined ratios.
21+
</string>
1822
</resources>

SplitScreenMods/src/main/res/xml/root_preferences.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,10 @@
1717
app:summary="@string/keepsplitscreenratio_summary"
1818
app:title="@string/keepsplitscreenratio_title"
1919
/>
20+
<CheckBoxPreference
21+
app:iconSpaceReserved="false"
22+
app:key="FreeSnap"
23+
app:summary="@string/freesnap_summary"
24+
app:title="@string/freesnap_title"
25+
/>
2026
</PreferenceScreen>

metadata/com.programminghoch10.SplitScreenMods/en-US/full_description.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ A collection of various SplitScreen modifications.
22

33
* AlwaysAllowMultiInstanceSplit
44
* KeepSplitScreenRatio
5+
* FreeSnap

0 commit comments

Comments
 (0)