@@ -9,6 +9,7 @@ import android.content.ContentProvider
99import android.content.ContentValues
1010import android.content.Context
1111import android.content.Context.MODE_PRIVATE
12+ import android.content.pm.ApplicationInfo
1213import android.content.SharedPreferences
1314import android.database.Cursor
1415import 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 */
4041class 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