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

Commit 1e10d8ee authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[Catalyst] Improve observer mechanism for binding helper" into main

parents 4aaa6a63 c6281845
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -20,7 +20,7 @@ import androidx.preference.PreferenceDataStore
import com.android.settingslib.datastore.KeyValueStore

/** Adapter to translate [KeyValueStore] into [PreferenceDataStore]. */
class PreferenceDataStoreAdapter(private val keyValueStore: KeyValueStore) : PreferenceDataStore() {
class PreferenceDataStoreAdapter(val keyValueStore: KeyValueStore) : PreferenceDataStore() {

    override fun getBoolean(key: String, defValue: Boolean): Boolean =
        keyValueStore.getValue(key, Boolean::class.javaObjectType) ?: defValue
+13 −9
Original line number Diff line number Diff line
@@ -74,16 +74,12 @@ class PreferenceScreenBindingHelper(
    private val preferences: ImmutableMap<String, PreferenceHierarchyNode>
    private val dependencies: ImmutableMultimap<String, String>
    private val lifecycleAwarePreferences: Array<PreferenceLifecycleProvider>
    private val storages = mutableSetOf<KeyedObservable<String>>()
    private val storages = mutableMapOf<String, KeyedObservable<String>>()

    private val preferenceObserver: KeyedObserver<String?>

    private val storageObserver =
        KeyedObserver<String?> { key, _ ->
            if (key != null) {
                notifyChange(key, CHANGE_REASON_VALUE)
            }
        }
        KeyedObserver<String> { key, _ -> notifyChange(key, CHANGE_REASON_VALUE) }

    init {
        val preferencesBuilder = ImmutableMap.builder<String, PreferenceHierarchyNode>()
@@ -98,7 +94,6 @@ class PreferenceScreenBindingHelper(
                preferencesBuilder.put(it.key, this)
                it.dependencyOfEnabledState(context)?.addDependency(it)
                if (it is PreferenceLifecycleProvider) lifecycleAwarePreferences.add(it)
                if (it is PersistentPreference<*>) storages.add(it.storage(context))
            }
        }

@@ -120,7 +115,16 @@ class PreferenceScreenBindingHelper(

        preferenceObserver = KeyedObserver { key, reason -> onPreferenceChange(key, reason) }
        addObserver(preferenceObserver, mainExecutor)
        for (storage in storages) storage.addObserver(storageObserver, mainExecutor)

        preferenceScreen.forEachRecursively {
            val preferenceDataStore = it.preferenceDataStore
            if (preferenceDataStore is PreferenceDataStoreAdapter) {
                val key = it.key
                val keyValueStore = preferenceDataStore.keyValueStore
                storages[key] = keyValueStore
                keyValueStore.addObserver(key, storageObserver, mainExecutor)
            }
        }
    }

    private fun onPreferenceChange(key: String?, reason: Int) {
@@ -181,7 +185,7 @@ class PreferenceScreenBindingHelper(

    fun onDestroy() {
        removeObserver(preferenceObserver)
        for (storage in storages) storage.removeObserver(storageObserver)
        for ((key, storage) in storages) storage.removeObserver(key, storageObserver)
        for (preference in lifecycleAwarePreferences) {
            preference.onDestroy(preferenceLifecycleContext)
        }
+33 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settingslib.preference

import androidx.preference.Preference
import androidx.preference.PreferenceGroup

/** Traversals preference hierarchy recursively and applies an action. */
fun PreferenceGroup.forEachRecursively(action: (Preference) -> Unit) {
    action.invoke(this)
    for (index in 0 until preferenceCount) {
        val preference = getPreference(index)
        if (preference is PreferenceGroup) {
            preference.forEachRecursively(action)
        } else {
            action.invoke(preference)
        }
    }
}