@@ -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,48 @@ 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 getPartitionDefaultPreferences (partition : String , packageName : String ): List <SharedPreferences ?> {
63+ return listOf (
64+ getFilePreferences(" /$partition /etc/$packageName /settings.xml" ),
65+ getFilePreferences(" /$partition /etc/microg.xml" )
66+ )
67+ }
68+
69+ private fun gatherDefaultPreferences (): List <SharedPreferences ?> {
70+ val context = context ? : return emptyList()
71+ val applicationInfo = context.applicationInfo
72+ val isProduct = applicationInfo.invokeHiddenBooleanMethod(" isProduct" )
73+ val isSystemExt = applicationInfo.invokeHiddenBooleanMethod(" isSystemExt" )
74+ val systemDefaultPreferences = getFilePreferences(" /system/etc/microg.xml" )
75+ val packagedDefaults = when {
76+ isProduct == true ->
77+ getPartitionDefaultPreferences(" product" , context.packageName) + systemDefaultPreferences
78+ isSystemExt == true ->
79+ getPartitionDefaultPreferences(" system_ext" , context.packageName) + systemDefaultPreferences
80+ else -> listOf (systemDefaultPreferences)
81+ }
82+ return packagedDefaults
83+ }
4184
4285 private val preferences: SharedPreferences by lazy {
4386 PreferenceManager .getDefaultSharedPreferences(context)
@@ -48,16 +91,8 @@ class SettingsProvider : ContentProvider() {
4891 private val unifiedNlpPreferences by lazy {
4992 context!! .getSharedPreferences(" unified_nlp" , MODE_PRIVATE )
5093 }
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- }
94+ private val packagedDefaultPreferences: List <SharedPreferences ?> by lazy {
95+ gatherDefaultPreferences()
6196 }
6297 private val metaDataPreferences: SharedPreferences by lazy {
6398 MetaDataPreferences (context!! , SETTINGS_PREFIX )
@@ -279,7 +314,7 @@ class SettingsProvider : ContentProvider() {
279314 DroidGuard .ENABLED -> getSettingsBoolean(key, false )
280315 DroidGuard .MODE -> getSettingsString(key)
281316 DroidGuard .NETWORK_SERVER_URL -> getSettingsString(key)
282- DroidGuard .FORCE_LOCAL_DISABLED -> systemDefaultPreferences? .getBoolean(key, false ) ? : false
317+ DroidGuard .FORCE_LOCAL_DISABLED -> packagedDefaultPreferences .getBoolean(key, false )
283318 DroidGuard .HARDWARE_ATTESTATION_BLOCKED -> getSettingsBoolean(key, true )
284319 else -> throw IllegalArgumentException (" Unknown key: $key " )
285320 }
@@ -462,18 +497,18 @@ class SettingsProvider : ContentProvider() {
462497 }
463498
464499 /* *
465- * Returns the current setting of the given [key]
466- * using the default value from [systemDefaultPreferences] or [def] if not available .
500+ * Returns the current setting of the given [key] using user preferences,
501+ * packaged defaults, manifest metadata defaults, and finally [def].
467502 * @return the current setting as [Int], because [ContentProvider] does not support [Boolean].
468503 */
469504 private fun getSettingsBoolean (key : String , def : Boolean ): Int {
470- return listOf (preferences, systemDefaultPreferences, metaDataPreferences).getBooleanAsInt(key, def)
505+ return ( listOf (preferences) + packagedDefaultPreferences + metaDataPreferences).getBooleanAsInt(key, def)
471506 }
472507
473- private fun getSettingsString (key : String , def : String? = null): String? = listOf (preferences, systemDefaultPreferences, metaDataPreferences).getString(key, def)
474- private fun getSettingsInt (key : String , def : Int ): Int = listOf (preferences, systemDefaultPreferences, metaDataPreferences).getInt(key, def)
475- private fun getSettingsLong (key : String , def : Long ): Long = listOf (preferences, systemDefaultPreferences, metaDataPreferences).getLong(key, def)
476- private fun getUnifiedNlpSettingsStringSetCompat (key : String , def : Set <String >): Set <String > = listOf (unifiedNlpPreferences, preferences, systemDefaultPreferences ).getStringSetCompat(key, def)
508+ private fun getSettingsString (key : String , def : String? = null): String? = ( listOf (preferences) + packagedDefaultPreferences + metaDataPreferences).getString(key, def)
509+ private fun getSettingsInt (key : String , def : Int ): Int = ( listOf (preferences) + packagedDefaultPreferences + metaDataPreferences).getInt(key, def)
510+ private fun getSettingsLong (key : String , def : Long ): Long = ( listOf (preferences) + packagedDefaultPreferences + metaDataPreferences).getLong(key, def)
511+ private fun getUnifiedNlpSettingsStringSetCompat (key : String , def : Set <String >): Set <String > = ( listOf (unifiedNlpPreferences, preferences) + packagedDefaultPreferences ).getStringSetCompat(key, def)
477512
478513 private fun SharedPreferences.getStringSetCompat (key : String , def : Set <String >): Set <String > {
479514 if (SDK_INT >= 11 ) {
0 commit comments