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

Commit 95118bd1 authored by Jacky Wang's avatar Jacky Wang
Browse files

[Catalyst] Enhance PreferenceBindingPlaceholder support

The preference widget created for PreferenceBindingPlaceholder is
always added to preference screen, which does not respect the specified
hierarchy.

Bug: 332201912
Flag: EXEMPT library
Test: manual
Change-Id: Icccae11291b3ff69e2e262225f6f8e4530b72c71
parent 6e14ced4
Loading
Loading
Loading
Loading
+21 −23
Original line number Diff line number Diff line
@@ -265,8 +265,6 @@ class PreferenceScreenBindingHelper(
            preferenceHierarchy: PreferenceHierarchy,
        ) {
            val preferenceScreenMetadata = preferenceHierarchy.metadata as PreferenceScreenMetadata
            val preferences = mutableMapOf<String, PreferenceHierarchyNode>()
            preferenceHierarchy.forEachRecursively { preferences[it.metadata.key] = it }
            val storages = mutableMapOf<KeyValueStore, PreferenceDataStore>()

            fun Preference.setPreferenceDataStore(metadata: PreferenceMetadata) {
@@ -278,32 +276,32 @@ class PreferenceScreenBindingHelper(
                }
            }

            fun PreferenceGroup.bindRecursively() {
                preferences.remove(key)?.let { preferenceBindingFactory.bind(this, it) }
                val count = preferenceCount
                for (index in 0 until count) {
                    val preference = getPreference(index)
                    if (preference is PreferenceGroup) {
                        preference.bindRecursively()
            fun PreferenceHierarchy.bindRecursively(preferenceGroup: PreferenceGroup) {
                preferenceBindingFactory.bind(preferenceGroup, this)
                val preferences = mutableMapOf<String, PreferenceHierarchyNode>()
                forEach { preferences[it.metadata.key] = it }
                for (index in 0 until preferenceGroup.preferenceCount) {
                    val preference = preferenceGroup.getPreference(index)
                    val node = preferences.remove(preference.key) ?: continue
                    if (node is PreferenceHierarchy) {
                        node.bindRecursively(preference as PreferenceGroup)
                    } else {
                        preferences.remove(preference.key)?.let {
                            preference.setPreferenceDataStore(it.metadata)
                            preferenceBindingFactory.bind(preference, it)
                        }
                    }
                        preference.setPreferenceDataStore(node.metadata)
                        preferenceBindingFactory.bind(preference, node)
                    }
                }

            preferenceScreen.bindRecursively()
                for (node in preferences.values) {
                    val metadata = node.metadata
                    val binding = preferenceBindingFactory.getPreferenceBinding(metadata)
                    if (binding !is PreferenceBindingPlaceholder) continue
                val preference = binding.createWidget(preferenceScreen.context)
                    val preference = binding.createWidget(preferenceGroup.context)
                    preference.setPreferenceDataStore(metadata)
                    preferenceBindingFactory.bind(preference, node, binding)
                preferenceScreen.addPreference(preference)
                    preferenceGroup.addPreference(preference)
                }
            }

            preferenceHierarchy.bindRecursively(preferenceScreen)
        }
    }
}