summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jacky Wang <jiannan@google.com> 2024-11-08 14:59:22 +0800
committer Jacky Wang <jiannan@google.com> 2024-11-08 14:59:22 +0800
commitf82364f04d66b8f3607c1cd638aa8b1b940c6466 (patch)
tree7e94fdb0aee28c0527bd21d08011887dbed892e8
parent3ea041fc25480d09b5db4af6006c6ddf16f50019 (diff)
[Catalyst] Add PreferenceHierarchy.forEachRecursively
Bug: 377600992 Flag: com.android.settings.flags.catalyst Test: manual Change-Id: Id0902cf87e59e62ef9e29bd9c976ac19f22a0f60
-rw-r--r--packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/KeyedObserver.kt6
-rw-r--r--packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceHierarchy.kt25
-rw-r--r--packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt6
-rw-r--r--packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt9
4 files changed, 28 insertions, 18 deletions
diff --git a/packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/KeyedObserver.kt b/packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/KeyedObserver.kt
index 843d2aadf333..cd03dd7ca1b3 100644
--- a/packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/KeyedObserver.kt
+++ b/packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/KeyedObserver.kt
@@ -202,6 +202,12 @@ open class KeyedDataObservable<K> : KeyedObservable<K> {
entry.value.execute { observer.onKeyChanged(key, reason) }
}
}
+
+ fun hasAnyObserver(): Boolean {
+ synchronized(observers) { if (observers.isNotEmpty()) return true }
+ synchronized(keyedObservers) { if (keyedObservers.isNotEmpty()) return true }
+ return false
+ }
}
/** [KeyedObservable] with no-op implementations for all interfaces. */
diff --git a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceHierarchy.kt b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceHierarchy.kt
index 94d373bed0a5..bde4217b3962 100644
--- a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceHierarchy.kt
+++ b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceHierarchy.kt
@@ -136,6 +136,18 @@ class PreferenceHierarchy internal constructor(metadata: PreferenceMetadata) :
for (it in children) action(it)
}
+ /** Traversals preference hierarchy recursively and applies given action. */
+ fun forEachRecursively(action: (PreferenceHierarchyNode) -> Unit) {
+ action(this)
+ for (child in children) {
+ if (child is PreferenceHierarchy) {
+ child.forEachRecursively(action)
+ } else {
+ action(child)
+ }
+ }
+ }
+
/** Traversals preference hierarchy and applies given action. */
suspend fun forEachAsync(action: suspend (PreferenceHierarchyNode) -> Unit) {
for (it in children) action(it)
@@ -157,18 +169,7 @@ class PreferenceHierarchy internal constructor(metadata: PreferenceMetadata) :
/** Returns all the [PreferenceHierarchyNode]s appear in the hierarchy. */
fun getAllPreferences(): List<PreferenceHierarchyNode> =
- mutableListOf<PreferenceHierarchyNode>().also { getAllPreferences(it) }
-
- private fun getAllPreferences(result: MutableList<PreferenceHierarchyNode>) {
- result.add(this)
- for (child in children) {
- if (child is PreferenceHierarchy) {
- child.getAllPreferences(result)
- } else {
- result.add(child)
- }
- }
- }
+ mutableListOf<PreferenceHierarchyNode>().apply { forEachRecursively { add(it) } }
}
/**
diff --git a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt
index 41a626fe8efa..991d5b7791e9 100644
--- a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt
+++ b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt
@@ -32,7 +32,7 @@ import com.android.settingslib.widget.SettingsBasePreferenceFragment
open class PreferenceFragment :
SettingsBasePreferenceFragment(), PreferenceScreenProvider, PreferenceScreenBindingKeyProvider {
- private var preferenceScreenBindingHelper: PreferenceScreenBindingHelper? = null
+ protected var preferenceScreenBindingHelper: PreferenceScreenBindingHelper? = null
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
preferenceScreen = createPreferenceScreen()
@@ -129,7 +129,9 @@ open class PreferenceFragment :
}
protected fun getPreferenceKeysInHierarchy(): Set<String> =
- preferenceScreenBindingHelper?.getPreferences()?.map { it.metadata.key }?.toSet() ?: setOf()
+ preferenceScreenBindingHelper?.let {
+ mutableSetOf<String>().apply { it.forEachRecursively { add(it.metadata.key) } }
+ } ?: setOf()
companion object {
private const val TAG = "PreferenceFragment"
diff --git a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt
index 022fb1dbe99c..fbe892710d40 100644
--- a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt
+++ b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt
@@ -143,7 +143,8 @@ class PreferenceScreenBindingHelper(
}
}
- fun getPreferences() = preferenceHierarchy.getAllPreferences()
+ fun forEachRecursively(action: (PreferenceHierarchyNode) -> Unit) =
+ preferenceHierarchy.forEachRecursively(action)
fun onCreate() {
for (preference in lifecycleAwarePreferences) {
@@ -191,11 +192,11 @@ class PreferenceScreenBindingHelper(
companion object {
/** Preference value is changed. */
- private const val CHANGE_REASON_VALUE = 0
+ const val CHANGE_REASON_VALUE = 0
/** Preference state (title/summary, enable state, etc.) is changed. */
- private const val CHANGE_REASON_STATE = 1
+ const val CHANGE_REASON_STATE = 1
/** Dependent preference state is changed. */
- private const val CHANGE_REASON_DEPENDENT = 2
+ const val CHANGE_REASON_DEPENDENT = 2
/** Updates preference screen that has incomplete hierarchy. */
@JvmStatic