浏览代码

Implement a generic preference overlay mechanism

We'll need this as we'll probably soon have more priv/unpriv-specific
preferences. For example, exposing removable eSIMs to the system.
Peter Cai 1 年之前
父节点
当前提交
4a482b9c73

+ 18 - 1
app-common/src/main/java/im/angry/openeuicc/ui/SettingsFragment.kt

@@ -1,6 +1,5 @@
 package im.angry.openeuicc.ui
 
-import android.content.Context
 import android.content.Intent
 import android.net.Uri
 import android.os.Build
@@ -137,4 +136,22 @@ open class SettingsFragment: PreferenceFragmentCompat() {
             true
         }
     }
+
+    protected fun mergePreferenceOverlay(overlayKey: String, targetKey: String) {
+        val overlayCat = findPreference<PreferenceCategory>(overlayKey)!!
+        val targetCat = findPreference<PreferenceCategory>(targetKey)!!
+
+        val prefs = buildList {
+            for (i in 0..<overlayCat.preferenceCount) {
+                add(overlayCat.getPreference(i))
+            }
+        }
+
+        prefs.forEach {
+            overlayCat.removePreference(it)
+            targetCat.addPreference(it)
+        }
+
+        overlayCat.parent?.removePreference(overlayCat)
+    }
 }

+ 2 - 8
app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedSettingsFragment.kt

@@ -6,7 +6,6 @@ import android.content.pm.PackageManager
 import android.os.Bundle
 import android.widget.Toast
 import androidx.preference.Preference
-import androidx.preference.PreferenceCategory
 import im.angry.easyeuicc.R
 import im.angry.openeuicc.util.encodeHex
 import java.security.MessageDigest
@@ -29,9 +28,9 @@ class UnprivilegedSettingsFragment : SettingsFragment() {
     override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
         super.onCreatePreferences(savedInstanceState, rootKey)
         addPreferencesFromResource(R.xml.pref_unprivileged_settings)
+        mergePreferenceOverlay("pref_info_overlay", "pref_info")
+
         findPreference<Preference>("pref_info_ara_m")?.apply {
-            moveCategory(this, "pref_info")
-            isVisible = true
             summary = firstSigner.encodeHex()
             setOnPreferenceClickListener {
                 requireContext().getSystemService(ClipboardManager::class.java)!!
@@ -42,9 +41,4 @@ class UnprivilegedSettingsFragment : SettingsFragment() {
             }
         }
     }
-
-    private fun moveCategory(preference: Preference, key: String) {
-        preference.parent!!.removePreference(preference)
-        findPreference<PreferenceCategory>(key)!!.addPreference(preference)
-    }
 }

+ 8 - 5
app-unpriv/src/main/res/xml/pref_unprivileged_settings.xml

@@ -1,9 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
-    <Preference
-        app:enableCopying="true"
-        app:iconSpaceReserved="false"
+    <PreferenceCategory
         app:isPreferenceVisible="false"
-        app:key="pref_info_ara_m"
-        app:title="@string/pref_developer_ara_m" />
+        app:key="pref_info_overlay">
+        <Preference
+            app:enableCopying="true"
+            app:iconSpaceReserved="false"
+            app:key="pref_info_ara_m"
+            app:title="@string/pref_developer_ara_m" />
+    </PreferenceCategory>
 </PreferenceScreen>