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

Commit 5add9d18 authored by Jacky Wang's avatar Jacky Wang
Browse files

[Catalyst] Add PreferenceBindingFactory.bind

Bug: 332201912
Flag: EXEMPT framework
Test: N/A
Change-Id: I4ff19ed2f775cfe5b373d97d98b21b9dd81e2697
parent fde9ab1f
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.settingslib.preference

import androidx.preference.Preference
import com.android.settingslib.metadata.MainSwitchPreference
import com.android.settingslib.metadata.PreferenceGroup
import com.android.settingslib.metadata.PreferenceMetadata
@@ -24,6 +25,19 @@ import com.android.settingslib.metadata.SwitchPreference
/** Factory to map [PreferenceMetadata] to [PreferenceBinding]. */
interface PreferenceBindingFactory {

    /**
     * Binds [Preference] and its associated [PreferenceMetadata] with given [PreferenceBinding]
     * (`getPreferenceBinding(metadata)` is used if [preferenceBinding] is `null`).
     *
     * Subclass could override this callback to handle common binding logic. For instance,
     * restricted preference with policy transparency.
     */
    fun bind(
        preference: Preference,
        metadata: PreferenceMetadata,
        preferenceBinding: PreferenceBinding? = null,
    ) = (preferenceBinding ?: getPreferenceBinding(metadata))?.bind(preference, metadata)

    /** Returns the [PreferenceBinding] associated with the [PreferenceMetadata]. */
    fun getPreferenceBinding(metadata: PreferenceMetadata): PreferenceBinding?
}
+4 −6
Original line number Diff line number Diff line
@@ -21,7 +21,6 @@ import androidx.preference.PreferenceGroup
import com.android.settingslib.datastore.KeyValueStore
import com.android.settingslib.metadata.PersistentPreference
import com.android.settingslib.metadata.PreferenceHierarchy
import com.android.settingslib.metadata.PreferenceMetadata

/** Inflates [PreferenceHierarchy] into given [PreferenceGroup] recursively. */
fun PreferenceGroup.inflatePreferenceHierarchy(
@@ -29,12 +28,11 @@ fun PreferenceGroup.inflatePreferenceHierarchy(
    hierarchy: PreferenceHierarchy,
    storages: MutableMap<KeyValueStore, PreferenceDataStore> = mutableMapOf(),
) {
    fun PreferenceMetadata.preferenceBinding() = preferenceBindingFactory.getPreferenceBinding(this)

    hierarchy.metadata.let { it.preferenceBinding()?.bind(this, it) }
    preferenceBindingFactory.bind(this, hierarchy.metadata)
    hierarchy.forEach {
        val metadata = it.metadata
        val preferenceBinding = metadata.preferenceBinding() ?: return@forEach
        val preferenceBinding =
            preferenceBindingFactory.getPreferenceBinding(metadata) ?: return@forEach
        val widget = preferenceBinding.createWidget(context)
        if (it is PreferenceHierarchy) {
            val preferenceGroup = widget as PreferenceGroup
@@ -42,7 +40,7 @@ fun PreferenceGroup.inflatePreferenceHierarchy(
            addPreference(preferenceGroup)
            preferenceGroup.inflatePreferenceHierarchy(preferenceBindingFactory, it)
        } else {
            preferenceBinding.bind(widget, metadata)
            preferenceBindingFactory.bind(widget, metadata, preferenceBinding)
            (metadata as? PersistentPreference<*>)?.storage(context)?.let { storage ->
                widget.preferenceDataStore =
                    storages.getOrPut(storage) { PreferenceDataStoreAdapter(storage) }
+3 −8
Original line number Diff line number Diff line
@@ -122,7 +122,7 @@ class PreferenceScreenBindingHelper(

        // bind preference to update UI
        preferenceScreen.findPreference<Preference>(key)?.let {
            preferenceBindingFactory.bind(it, preferences[key])
            preferences[key]?.let { metadata -> preferenceBindingFactory.bind(it, metadata) }
        }

        // check reason to avoid potential infinite loop
@@ -225,7 +225,7 @@ class PreferenceScreenBindingHelper(
            preferences: Map<String, PreferenceMetadata>,
            storages: MutableMap<KeyValueStore, PreferenceDataStore> = mutableMapOf(),
        ) {
            preferenceBindingFactory.bind(this, preferences[key])
            preferences[key]?.let { preferenceBindingFactory.bind(this, it) }
            val count = preferenceCount
            for (index in 0 until count) {
                val preference = getPreference(index)
@@ -233,7 +233,7 @@ class PreferenceScreenBindingHelper(
                    preference.bindRecursively(preferenceBindingFactory, preferences, storages)
                } else {
                    preferences[preference.key]?.let {
                        preferenceBindingFactory.getPreferenceBinding(it)?.bind(preference, it)
                        preferenceBindingFactory.bind(preference, it)
                        (it as? PersistentPreference<*>)?.storage(context)?.let { storage ->
                            preference.preferenceDataStore =
                                storages.getOrPut(storage) { PreferenceDataStoreAdapter(storage) }
@@ -242,10 +242,5 @@ class PreferenceScreenBindingHelper(
                }
            }
        }

        private fun PreferenceBindingFactory.bind(
            preference: Preference,
            metadata: PreferenceMetadata?,
        ) = metadata?.let { getPreferenceBinding(it)?.bind(preference, it) }
    }
}