Skip to content

Commit aff8e4e

Browse files
committed
allow open settings for apps from settings activity
1 parent 30a3f34 commit aff8e4e

6 files changed

Lines changed: 124 additions & 23 deletions

File tree

app/src/main/AndroidManifest.xml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,22 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
xmlns:tools="http://schemas.android.com/tools">
44

5+
<queries>
6+
<package android:name="com.xingin.xhs" />
7+
<package android:name="com.kiwibrowser.browser" />
8+
<package android:name="com.android.chrome" />
9+
<package android:name="org.telegram.messenger" />
10+
<package android:name="org.telegram.messenger.web" />
11+
<package android:name="org.telegram.messenger.beta" />
12+
<package android:name="org.telegram.plus" />
13+
<package android:name="com.exteragram.messenger" />
14+
<package android:name="com.radolyn.ayugram" />
15+
<package android:name="uz.unnarsx.cherrygram" />
16+
<package android:name="xyz.nextalone.nagram" />
17+
<package android:name="nu.gpu.nagram" />
18+
<package android:name="com.xtaolabs.pagergram" />
19+
</queries>
20+
521
<application
622
android:allowBackup="true"
723
android:label="@string/app_name"

app/src/main/java/io/github/a13e300/myinjector/ChromeHandler.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@ object ChromeHandler : DynHookManager<ChromeSettings>() {
7474
override fun onHook() {
7575
if (loadPackageParam.processName.contains(":")) return
7676
super.onHook()
77+
addSettingsIntentInterceptor {
78+
ChromeSettingsDialog(it).show()
79+
}
7780
val name = loadPackageParam.appInfo.className
7881
// ensure split apk (split-chrome) is loaded, see:
7982
// https://source.chromium.org/chromium/chromium/src/+/main:chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatAppComponentFactory.java;l=136?q=SplitCompatAppComponentFactory&ss=chromium

app/src/main/java/io/github/a13e300/myinjector/SettingsActivity.kt

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@ import android.app.PendingIntent
99
import android.content.Intent
1010
import android.content.SharedPreferences
1111
import android.content.SharedPreferences.OnSharedPreferenceChangeListener
12+
import android.content.pm.PackageManager
1213
import android.graphics.Insets
1314
import android.os.Build
1415
import android.os.Bundle
1516
import android.preference.Preference
17+
import android.preference.PreferenceCategory
1618
import android.preference.PreferenceFragment
1719
import android.view.LayoutInflater
1820
import android.view.View
@@ -22,6 +24,7 @@ import android.widget.Button
2224
import android.widget.TextView
2325
import io.github.a13e300.myinjector.system_server.ResultReceiver
2426
import java.util.Arrays
27+
import java.util.UUID
2528
import java.util.stream.Collectors
2629

2730
@Suppress("deprecation")
@@ -41,6 +44,68 @@ class SettingsActivity : Activity() {
4144
super.onCreate(savedInstanceState)
4245
preferenceManager.sharedPreferencesName = "system_server"
4346
addPreferencesFromResource(R.xml.prefs)
47+
48+
val pm = context.packageManager
49+
50+
val cat = PreferenceCategory(context).apply {
51+
title = "Apps"
52+
}
53+
var added = false
54+
55+
fun addPackageSettings(pkg: String) {
56+
runCatching {
57+
val info = try {
58+
pm.getApplicationInfo(pkg, 0)
59+
} catch (_: PackageManager.NameNotFoundException) {
60+
return
61+
}
62+
val label = info.loadLabel(pm)
63+
if (!added) {
64+
preferenceScreen.addPreference(cat)
65+
added = true
66+
}
67+
Preference(context).apply {
68+
cat.addPreference(this)
69+
title = "打开 $label 设置"
70+
setOnPreferenceClickListener {
71+
runCatching {
72+
val intent = pm.getLaunchIntentForPackage(pkg)!!
73+
intent.action = "io.github.a13e300.myinjector.SHOW_SETTINGS"
74+
intent.categories.clear()
75+
intent.addCategory("io.github.a13e300.myinjector.SHOW_SETTINGS")
76+
intent.addCategory(UUID.randomUUID().toString())
77+
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
78+
startActivity(intent)
79+
}.onFailure {
80+
logE("failed to open settings for $pkg:", it)
81+
}
82+
true
83+
}
84+
}
85+
}.onFailure {
86+
logE("addPackageSettings $pkg")
87+
}
88+
}
89+
90+
val list = listOf(
91+
"com.xingin.xhs",
92+
"com.kiwibrowser.browser",
93+
"com.android.chrome",
94+
"org.telegram.messenger",
95+
"org.telegram.messenger.web",
96+
"org.telegram.messenger.beta",
97+
"org.telegram.plus",
98+
"com.exteragram.messenger",
99+
"com.radolyn.ayugram",
100+
"uz.unnarsx.cherrygram",
101+
"xyz.nextalone.nagram",
102+
"nu.gpu.nagram",
103+
"com.xtaolabs.pagergram",
104+
)
105+
106+
for (l in list) {
107+
addPackageSettings(l)
108+
}
44109
}
45110

46111
@Deprecated("Deprecated in Java")

app/src/main/java/io/github/a13e300/myinjector/SettingsDialog.kt

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@
22

33
package io.github.a13e300.myinjector
44

5+
import android.app.Activity
56
import android.app.AlertDialog
7+
import android.app.Instrumentation
68
import android.content.Context
9+
import android.content.Intent
710
import android.content.pm.ApplicationInfo
811
import android.content.res.Resources
912
import android.graphics.Typeface
13+
import android.os.Bundle
1014
import android.preference.ListPreference
1115
import android.preference.MultiSelectListPreference
1216
import android.preference.Preference
@@ -29,9 +33,13 @@ import android.widget.FrameLayout
2933
import android.widget.LinearLayout
3034
import android.widget.ListAdapter
3135
import android.widget.ListView
36+
import io.github.a13e300.myinjector.arch.IHook
3237
import io.github.a13e300.myinjector.arch.call
38+
import io.github.a13e300.myinjector.arch.deoptimize
3339
import io.github.a13e300.myinjector.arch.forceSetSelection
3440
import io.github.a13e300.myinjector.arch.getObjAs
41+
import io.github.a13e300.myinjector.arch.hookAfter
42+
import io.github.a13e300.myinjector.arch.hookAllAfter
3543
import io.github.a13e300.myinjector.arch.inflateLayout
3644
import io.github.a13e300.myinjector.arch.newInstAs
3745
import io.github.a13e300.myinjector.arch.restartApplication
@@ -313,3 +321,28 @@ abstract class SettingDialog(val activityCtx: Context) : Preference.OnPreference
313321
}
314322
}
315323
}
324+
325+
fun IHook.addSettingsIntentInterceptor(callback: (activity: Activity) -> Unit) = runCatching {
326+
Activity::class.java.hookAllAfter("performNewIntent") { param ->
327+
val activity = param.thisObject as Activity
328+
val intent = param.args[0] as Intent
329+
// logD("newIntent $intent")
330+
if (intent.action == "io.github.a13e300.myinjector.SHOW_SETTINGS" || intent.hasCategory("io.github.a13e300.myinjector.SHOW_SETTINGS")) {
331+
callback(activity)
332+
}
333+
}
334+
335+
Activity::class.java.hookAfter("performCreate", Bundle::class.java) { param ->
336+
val activity = param.thisObject as Activity
337+
val intent = activity.intent
338+
// logD("create Intent $intent")
339+
if (intent.action == "io.github.a13e300.myinjector.SHOW_SETTINGS" || intent.hasCategory("io.github.a13e300.myinjector.SHOW_SETTINGS")) {
340+
callback(activity)
341+
}
342+
}
343+
344+
Instrumentation::class.java.deoptimize("callActivityOnCreate")
345+
Instrumentation::class.java.deoptimize("callActivityOnNewIntent")
346+
}.onFailure {
347+
logE("addSettingsInterceptor", it)
348+
}

app/src/main/java/io/github/a13e300/myinjector/XhsHandler.kt

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
package io.github.a13e300.myinjector
22

3-
import android.app.Activity
43
import android.app.AndroidAppHelper
5-
import android.app.Instrumentation
64
import android.content.ClipData
75
import android.content.ClipboardManager
86
import android.content.Context
9-
import android.content.Intent
107
import android.net.Uri
11-
import android.os.Bundle
128
import android.preference.Preference
139
import android.preference.PreferenceScreen
1410
import android.preference.SwitchPreference
@@ -21,11 +17,9 @@ import io.github.a13e300.myinjector.arch.DynHookManager
2117
import io.github.a13e300.myinjector.arch.IHook
2218
import io.github.a13e300.myinjector.arch.ObfsTableCreator
2319
import io.github.a13e300.myinjector.arch.call
24-
import io.github.a13e300.myinjector.arch.deoptimize
2520
import io.github.a13e300.myinjector.arch.getObj
2621
import io.github.a13e300.myinjector.arch.getObjAs
2722
import io.github.a13e300.myinjector.arch.getObjAsN
28-
import io.github.a13e300.myinjector.arch.hookAfter
2923
import io.github.a13e300.myinjector.arch.hookAllAfter
3024
import io.github.a13e300.myinjector.arch.hookAllBefore
3125
import io.github.a13e300.myinjector.arch.hookAllConstantIf
@@ -366,25 +360,10 @@ class XhsSettingsDialog(ctx: Context) : SettingDialog(ctx) {
366360

367361
class SettingsHook : IHook() {
368362
override fun onHook() {
369-
Activity::class.java.hookAllAfter("performNewIntent") { param ->
370-
val activity = param.thisObject as Activity
371-
val intent = param.args[0] as Intent
372-
if (intent.action == "io.github.a13e300.myinjector.SHOW_SETTINGS") {
373-
XhsSettingsDialog(activity).show()
374-
}
363+
addSettingsIntentInterceptor { activity ->
364+
XhsSettingsDialog(activity).show()
375365
}
376366

377-
Activity::class.java.hookAfter("performCreate", Bundle::class.java) { param ->
378-
val activity = param.thisObject as Activity
379-
val intent = activity.intent
380-
if (intent.action == "io.github.a13e300.myinjector.SHOW_SETTINGS") {
381-
XhsSettingsDialog(activity).show()
382-
}
383-
}
384-
385-
Instrumentation::class.java.deoptimize("callActivityOnCreate")
386-
Instrumentation::class.java.deoptimize("callActivityOnNewIntent")
387-
388367
val creator = XhsHandler.creator
389368
val buttonClassInfo = creator.create("settingshook.buttonClass") { bridge ->
390369
bridge.findClass {

app/src/main/java/io/github/a13e300/myinjector/telegram/Settings.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import android.preference.PreferenceScreen
77
import android.preference.SwitchPreference
88
import android.view.View
99
import io.github.a13e300.myinjector.SettingDialog
10+
import io.github.a13e300.myinjector.addSettingsIntentInterceptor
1011
import io.github.a13e300.myinjector.arch.IHook
1112
import io.github.a13e300.myinjector.arch.call
1213
import io.github.a13e300.myinjector.arch.callS
@@ -391,6 +392,10 @@ class TgSettingsDialog(context: Context) : SettingDialog(context) {
391392
class Settings : IHook() {
392393
@Suppress("UNCHECKED_CAST")
393394
override fun onHook() {
395+
addSettingsIntentInterceptor {
396+
TgSettingsDialog(it).show()
397+
}
398+
394399
// removed after 12.4.0
395400
findClassOrNull("org.telegram.ui.Adapters.DrawerLayoutAdapter")?.let { drawerLayoutAdapterClass ->
396401
val itemClass = findClass("org.telegram.ui.Adapters.DrawerLayoutAdapter\$Item")

0 commit comments

Comments
 (0)