Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ff515c54 authored by Jacky Wang's avatar Jacky Wang Committed by Android (Google) Code Review
Browse files

Merge "[Catalyst] Add PreferenceHierarchy.forEachRecursively" into main

parents d469420a f82364f0
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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. */
+13 −12
Original line number Diff line number Diff line
@@ -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) } }
}

/**
+4 −2
Original line number Diff line number Diff line
@@ -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"
+5 −4
Original line number Diff line number Diff line
@@ -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