Skip to content

Commit fea30e2

Browse files
committed
Settings: Read defaults from the bundled partition (#2852)
Use `ApplicationInfo` partition flags to detect whether GmsCore was originally bundled on `product` or `system_ext`, and read `etc/microg.xml` from that partition. Keep `/system/etc/microg.xml` as a shared defaults source underneath partition-specific overrides.
1 parent a5e0d97 commit fea30e2

1 file changed

Lines changed: 47 additions & 17 deletions

File tree

play-services-base/core/src/main/kotlin/org/microg/gms/settings/SettingsProvider.kt

Lines changed: 47 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import android.content.ContentProvider
99
import android.content.ContentValues
1010
import android.content.Context
1111
import android.content.Context.MODE_PRIVATE
12+
import android.content.pm.ApplicationInfo
1213
import android.content.SharedPreferences
1314
import android.database.Cursor
1415
import android.database.MatrixCursor
@@ -38,6 +39,43 @@ private const val SETTINGS_PREFIX = "org.microg.gms.settings."
3839
* because it provides safe access from different processes which normal [SharedPreferences] don't.
3940
*/
4041
class SettingsProvider : ContentProvider() {
42+
private fun getFilePreferences(path: String): SharedPreferences? {
43+
return try {
44+
Context::class.java.getDeclaredMethod(
45+
"getSharedPreferences",
46+
File::class.java,
47+
Int::class.javaPrimitiveType
48+
).invoke(context, File(path), MODE_PRIVATE) as SharedPreferences
49+
} catch (ignored: Exception) {
50+
null
51+
}
52+
}
53+
54+
private fun ApplicationInfo.invokeHiddenBooleanMethod(name: String): Boolean? {
55+
return try {
56+
ApplicationInfo::class.java.getMethod(name).invoke(this) as Boolean
57+
} catch (ignored: Exception) {
58+
null
59+
}
60+
}
61+
62+
private fun gatherDefaultPreferences(): List<SharedPreferences?> {
63+
val applicationInfo = context?.applicationInfo ?: return emptyList()
64+
val systemDefaultPreferences = getFilePreferences("/system/etc/microg.xml")
65+
return when {
66+
applicationInfo.invokeHiddenBooleanMethod("isProduct") == true ->
67+
listOf(
68+
getFilePreferences("/product/etc/microg.xml"),
69+
systemDefaultPreferences
70+
)
71+
applicationInfo.invokeHiddenBooleanMethod("isSystemExt") == true ->
72+
listOf(
73+
getFilePreferences("/system_ext/etc/microg.xml"),
74+
systemDefaultPreferences
75+
)
76+
else -> listOf(systemDefaultPreferences)
77+
}
78+
}
4179

4280
private val preferences: SharedPreferences by lazy {
4381
PreferenceManager.getDefaultSharedPreferences(context)
@@ -48,16 +86,8 @@ class SettingsProvider : ContentProvider() {
4886
private val unifiedNlpPreferences by lazy {
4987
context!!.getSharedPreferences("unified_nlp", MODE_PRIVATE)
5088
}
51-
private val systemDefaultPreferences: SharedPreferences? by lazy {
52-
try {
53-
Context::class.java.getDeclaredMethod(
54-
"getSharedPreferences",
55-
File::class.java,
56-
Int::class.javaPrimitiveType
57-
).invoke(context, File("/system/etc/microg.xml"), MODE_PRIVATE) as SharedPreferences
58-
} catch (ignored: Exception) {
59-
null
60-
}
89+
private val packagedDefaultPreferences: List<SharedPreferences?> by lazy {
90+
gatherDefaultPreferences()
6191
}
6292
private val metaDataPreferences: SharedPreferences by lazy {
6393
MetaDataPreferences(context!!, SETTINGS_PREFIX)
@@ -279,7 +309,7 @@ class SettingsProvider : ContentProvider() {
279309
DroidGuard.ENABLED -> getSettingsBoolean(key, false)
280310
DroidGuard.MODE -> getSettingsString(key)
281311
DroidGuard.NETWORK_SERVER_URL -> getSettingsString(key)
282-
DroidGuard.FORCE_LOCAL_DISABLED -> systemDefaultPreferences?.getBoolean(key, false) ?: false
312+
DroidGuard.FORCE_LOCAL_DISABLED -> packagedDefaultPreferences.getBoolean(key, false)
283313
DroidGuard.HARDWARE_ATTESTATION_BLOCKED -> getSettingsBoolean(key, true)
284314
else -> throw IllegalArgumentException("Unknown key: $key")
285315
}
@@ -459,17 +489,17 @@ class SettingsProvider : ContentProvider() {
459489

460490
/**
461491
* Returns the current setting of the given [key]
462-
* using the default value from [systemDefaultPreferences] or [def] if not available.
492+
* using packaged defaults from the original system partition before falling back to [def].
463493
* @return the current setting as [Int], because [ContentProvider] does not support [Boolean].
464494
*/
465495
private fun getSettingsBoolean(key: String, def: Boolean): Int {
466-
return listOf(preferences, systemDefaultPreferences, metaDataPreferences).getBooleanAsInt(key, def)
496+
return (listOf(preferences) + packagedDefaultPreferences + metaDataPreferences).getBooleanAsInt(key, def)
467497
}
468498

469-
private fun getSettingsString(key: String, def: String? = null): String? = listOf(preferences, systemDefaultPreferences, metaDataPreferences).getString(key, def)
470-
private fun getSettingsInt(key: String, def: Int): Int = listOf(preferences, systemDefaultPreferences, metaDataPreferences).getInt(key, def)
471-
private fun getSettingsLong(key: String, def: Long): Long = listOf(preferences, systemDefaultPreferences, metaDataPreferences).getLong(key, def)
472-
private fun getUnifiedNlpSettingsStringSetCompat(key: String, def: Set<String>): Set<String> = listOf(unifiedNlpPreferences, preferences, systemDefaultPreferences).getStringSetCompat(key, def)
499+
private fun getSettingsString(key: String, def: String? = null): String? = (listOf(preferences) + packagedDefaultPreferences + metaDataPreferences).getString(key, def)
500+
private fun getSettingsInt(key: String, def: Int): Int = (listOf(preferences) + packagedDefaultPreferences + metaDataPreferences).getInt(key, def)
501+
private fun getSettingsLong(key: String, def: Long): Long = (listOf(preferences) + packagedDefaultPreferences + metaDataPreferences).getLong(key, def)
502+
private fun getUnifiedNlpSettingsStringSetCompat(key: String, def: Set<String>): Set<String> = (listOf(unifiedNlpPreferences, preferences) + packagedDefaultPreferences).getStringSetCompat(key, def)
473503

474504
private fun SharedPreferences.getStringSetCompat(key: String, def: Set<String>): Set<String> {
475505
if (SDK_INT >= 11) {

0 commit comments

Comments
 (0)