Loading packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBindingFactory.kt +14 −0 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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? } Loading packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceHierarchyInflater.kt +4 −6 Original line number Diff line number Diff line Loading @@ -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( Loading @@ -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 Loading @@ -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) } Loading packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt +3 −8 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) Loading @@ -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) } Loading @@ -242,10 +242,5 @@ class PreferenceScreenBindingHelper( } } } private fun PreferenceBindingFactory.bind( preference: Preference, metadata: PreferenceMetadata?, ) = metadata?.let { getPreferenceBinding(it)?.bind(preference, it) } } } Loading
packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBindingFactory.kt +14 −0 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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? } Loading
packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceHierarchyInflater.kt +4 −6 Original line number Diff line number Diff line Loading @@ -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( Loading @@ -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 Loading @@ -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) } Loading
packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt +3 −8 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) Loading @@ -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) } Loading @@ -242,10 +242,5 @@ class PreferenceScreenBindingHelper( } } } private fun PreferenceBindingFactory.bind( preference: Preference, metadata: PreferenceMetadata?, ) = metadata?.let { getPreferenceBinding(it)?.bind(preference, it) } } }