diff options
author | 2024-11-08 14:59:22 +0800 | |
---|---|---|
committer | 2024-11-08 14:59:22 +0800 | |
commit | f82364f04d66b8f3607c1cd638aa8b1b940c6466 (patch) | |
tree | 7e94fdb0aee28c0527bd21d08011887dbed892e8 | |
parent | 3ea041fc25480d09b5db4af6006c6ddf16f50019 (diff) |
[Catalyst] Add PreferenceHierarchy.forEachRecursively
Bug: 377600992
Flag: com.android.settings.flags.catalyst
Test: manual
Change-Id: Id0902cf87e59e62ef9e29bd9c976ac19f22a0f60
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 |