Skip to content

Commit 1bedda0

Browse files
implement SplitScreenMods SettingsActivity
1 parent 8930d8d commit 1bedda0

File tree

11 files changed

+160
-14
lines changed

11 files changed

+160
-14
lines changed

.idea/codeStyles/Project.xml

Lines changed: 4 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

SplitScreenMods/build.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,12 @@ android {
99
defaultConfig {
1010
minSdk = 33
1111
targetSdk = 36
12+
buildConfigField("String", "SHARED_PREFERENCES_NAME", "\"splitscreen\"")
1213
}
1314
}
1415

1516
dependencies {
17+
implementation(libs.androidx.fragment.ktx)
18+
implementation(libs.androidx.preference.ktx)
1619
implementation(project(":logger"))
1720
}

SplitScreenMods/src/main/AndroidManifest.xml

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,19 @@
33
xmlns:android="http://schemas.android.com/apk/res/android">
44

55
<application android:label="@string/app_name">
6+
<activity
7+
android:name=".SettingsActivity"
8+
android:excludeFromRecents="true"
9+
android:exported="true"
10+
android:label="@string/title_activity_settings"
11+
android:theme="@style/AppTheme"
12+
>
13+
<intent-filter>
14+
<action android:name="android.intent.action.MAIN" />
15+
<category android:name="de.robv.android.xposed.category.MODULE_SETTINGS" />
16+
</intent-filter>
17+
</activity>
18+
619
<meta-data
720
android:name="xposedmodule"
821
android:value="true"
@@ -13,7 +26,7 @@
1326
/>
1427
<meta-data
1528
android:name="xposedminversion"
16-
android:value="53"
29+
android:value="93"
1730
/>
1831
<meta-data
1932
android:name="xposedscope"

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

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,47 @@ package com.programminghoch10.SplitScreenMods
33
import android.content.ComponentName
44
import android.content.pm.ActivityInfo
55
import android.os.Build
6+
import com.programminghoch10.SplitScreenMods.AlwaysAllowMultiInstanceSplitHookConfig.enabled
7+
import com.programminghoch10.SplitScreenMods.BuildConfig.SHARED_PREFERENCES_NAME
68
import de.binarynoise.logger.Logger.log
79
import de.robv.android.xposed.IXposedHookLoadPackage
810
import de.robv.android.xposed.XC_MethodHook
911
import de.robv.android.xposed.XC_MethodReplacement
12+
import de.robv.android.xposed.XSharedPreferences
1013
import de.robv.android.xposed.XposedBridge
1114
import de.robv.android.xposed.XposedHelpers
1215
import de.robv.android.xposed.callbacks.XC_LoadPackage
1316

17+
object AlwaysAllowMultiInstanceSplitHookConfig {
18+
@JvmField
19+
val enabled = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU
20+
}
21+
1422
class AlwaysAllowMultiInstanceSplitHook : IXposedHookLoadPackage {
1523

16-
val supportedSdk = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU
17-
1824
override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) {
19-
if (!supportedSdk) return
25+
if (!enabled) return
2026
log("handleLoadPackage(${lpparam.packageName} in process ${lpparam.processName})")
27+
val preferences = XSharedPreferences(BuildConfig.APPLICATION_ID, SHARED_PREFERENCES_NAME)
28+
val enabled = preferences.getBoolean("AlwaysAllowMultiInstanceSplit", false)
29+
if (!enabled) return
2130

2231
when (lpparam.packageName) {
2332
"com.android.systemui" -> {
2433
try {
2534
val method = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
2635
XposedHelpers.findMethodExact(
27-
Class.forName("com.android.wm.shell.common.MultiInstanceHelper", false, lpparam.classLoader),
36+
Class.forName(
37+
"com.android.wm.shell.common.MultiInstanceHelper", false, lpparam.classLoader
38+
),
2839
"supportsMultiInstanceSplit",
2940
ComponentName::class.java,
3041
)
3142
} else {
3243
XposedHelpers.findMethodExact(
33-
Class.forName("com.android.wm.shell.splitscreen.SplitScreenController", false, lpparam.classLoader),
44+
Class.forName(
45+
"com.android.wm.shell.splitscreen.SplitScreenController", false, lpparam.classLoader
46+
),
3447
"supportMultiInstancesSplit",
3548
ComponentName::class.java,
3649
)
@@ -43,8 +56,10 @@ class AlwaysAllowMultiInstanceSplitHook : IXposedHookLoadPackage {
4356
}
4457
"android" -> {
4558
try {
46-
val ActivityStarterClass = Class.forName("com.android.server.wm.ActivityStarter", false, lpparam.classLoader)
47-
val ActivityStarterRequestClass = Class.forName(ActivityStarterClass.name + "\$Request", false, lpparam.classLoader)
59+
val ActivityStarterClass =
60+
Class.forName("com.android.server.wm.ActivityStarter", false, lpparam.classLoader)
61+
val ActivityStarterRequestClass =
62+
Class.forName(ActivityStarterClass.name + "\$Request", false, lpparam.classLoader)
4863
XposedHelpers.findAndHookMethod(
4964
ActivityStarterClass,
5065
"executeRequest",

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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,32 @@ package com.programminghoch10.SplitScreenMods
22

33
import android.os.Build
44
import android.os.IBinder
5+
import com.programminghoch10.SplitScreenMods.BuildConfig.SHARED_PREFERENCES_NAME
6+
import com.programminghoch10.SplitScreenMods.KeepSplitScreenRatioHookConfig.enabled
57
import de.binarynoise.logger.Logger.log
68
import de.robv.android.xposed.IXposedHookLoadPackage
79
import de.robv.android.xposed.XC_MethodReplacement
10+
import de.robv.android.xposed.XSharedPreferences
811
import de.robv.android.xposed.XposedBridge
912
import de.robv.android.xposed.XposedHelpers
1013
import de.robv.android.xposed.callbacks.XC_LoadPackage
1114
import de.robv.android.xposed.XC_MethodHook as MethodHook
1215

1316

17+
object KeepSplitScreenRatioHookConfig {
18+
@JvmField
19+
val enabled = Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE
20+
}
21+
1422
class KeepSplitScreenRatioHook : IXposedHookLoadPackage {
1523

16-
val supportedSdk = Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE
17-
1824
override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) {
1925
if (lpparam.packageName != "com.android.systemui") return
20-
if (!supportedSdk) return
26+
if (!enabled) return
2127
log("handleLoadPackage(${lpparam.packageName} in process ${lpparam.processName})")
28+
val preferences = XSharedPreferences(BuildConfig.APPLICATION_ID, SHARED_PREFERENCES_NAME)
29+
val enabled = preferences.getBoolean("KeepSplitScreenRatio", false)
30+
if (!enabled) return
2231

2332
val SplitLayoutClass =
2433
XposedHelpers.findClass("com.android.wm.shell.common.split.SplitLayout", lpparam.classLoader)
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.programminghoch10.SplitScreenMods
2+
3+
import android.content.Context
4+
import android.os.Bundle
5+
import androidx.fragment.app.FragmentActivity
6+
import androidx.preference.PreferenceFragmentCompat
7+
import androidx.preference.children
8+
import com.programminghoch10.SplitScreenMods.BuildConfig.SHARED_PREFERENCES_NAME
9+
10+
class SettingsActivity : FragmentActivity() {
11+
12+
override fun onCreate(savedInstanceState: Bundle?) {
13+
super.onCreate(savedInstanceState)
14+
setContentView(R.layout.settings_activity)
15+
if (savedInstanceState == null) {
16+
supportFragmentManager.beginTransaction().replace(R.id.settings, SettingsFragment()).commit()
17+
}
18+
actionBar?.setDisplayHomeAsUpEnabled(true)
19+
}
20+
21+
override fun onNavigateUp(): Boolean {
22+
finish()
23+
return true
24+
}
25+
26+
class SettingsFragment : PreferenceFragmentCompat() {
27+
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
28+
preferenceManager.sharedPreferencesName = SHARED_PREFERENCES_NAME
29+
preferenceManager.sharedPreferencesMode = Context.MODE_WORLD_READABLE
30+
setPreferencesFromResource(R.xml.root_preferences, rootKey)
31+
32+
for (preference in preferenceScreen.children) {
33+
if (!preference.hasKey()) continue
34+
val clazz = Class.forName(
35+
this::class.java.packageName + "." + preference.key + "HookConfig",
36+
false,
37+
this::class.java.classLoader,
38+
)
39+
val enabled = clazz.declaredFields.find { it.name == "enabled" }!!.getBoolean(null)
40+
preference.isEnabled = enabled
41+
preference.isVisible = enabled
42+
}
43+
}
44+
}
45+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<LinearLayout
2+
xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:layout_width="match_parent"
4+
android:layout_height="match_parent"
5+
android:theme="@style/AppTheme.Edge2EdgeFix"
6+
>
7+
8+
<FrameLayout
9+
android:id="@+id/settings"
10+
android:layout_width="match_parent"
11+
android:layout_height="match_parent"
12+
/>
13+
</LinearLayout>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
4+
<style name="AppTheme"
5+
parent="@android:style/Theme.DeviceDefault.Settings" />
6+
</resources>
Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,18 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<resources>
33
<string name="app_name">SplitScreenMods</string>
4+
<string name="title_activity_settings">@string/app_name</string>
45
<string name="description">
56
Collection of various SplitScreen modifications.
6-
Enter settings to configure them.
77
</string>
8+
<string name="alwaysallowmultiinstancesplit_title">AlwaysAllowMultiInstanceSplit</string>
9+
<string name="alwaysallowmultiinstancesplit_summary">
10+
Allow all apps to be launched twice side-by-side in a split screen.
11+
\nUndefined behaviour ahead!
12+
</string>
13+
<string name="keepsplitscreenratio_title">KeepSplitScreenRatio</string>
14+
<string name="keepsplitscreenratio_summary">
15+
Keep the split screen ratio, when switching one of the split apps.
16+
</string>
17+
<string name="restart_required">A restart is required to apply changes!</string>
818
</resources>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
4+
<style name="AppTheme"
5+
parent="@android:style/Theme.DeviceDefault" />
6+
7+
<style name="AppTheme.Edge2EdgeFix">
8+
<item name="android:fitsSystemWindows">true</item>
9+
</style>
10+
</resources>

0 commit comments

Comments
 (0)