1 /*
2 * Copyright (C) 2024 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 package com.android.settingslib.preference
18
19 import androidx.preference.Preference
20 import androidx.preference.PreferenceDataStore
21 import androidx.preference.PreferenceGroup
22 import com.android.settingslib.datastore.KeyValueStore
23 import com.android.settingslib.metadata.PreferenceMetadata
24 import com.android.settingslib.metadata.PreferenceScreenMetadata
25 import com.android.settingslib.metadata.PreferenceScreenRegistry
26
27 /** Traversals preference hierarchy recursively and applies an action. */
forEachRecursivelynull28 fun PreferenceGroup.forEachRecursively(action: (Preference) -> Unit) {
29 action.invoke(this)
30 for (index in 0 until preferenceCount) {
31 val preference = getPreference(index)
32 if (preference is PreferenceGroup) {
33 preference.forEachRecursively(action)
34 } else {
35 action.invoke(preference)
36 }
37 }
38 }
39
40 /**
41 * Converts [KeyValueStore] to [PreferenceDataStore].
42 *
43 * [PreferenceScreenRegistry.preferenceUiActionMetricsLogger] is wrapped on top of
44 * [PreferenceDataStoreDelegate] to log metrics.
45 *
46 * Note: Only user interaction changes are logged.
47 */
toPreferenceDataStorenull48 fun KeyValueStore.toPreferenceDataStore(
49 screen: PreferenceScreenMetadata,
50 preference: PreferenceMetadata,
51 ): PreferenceDataStore {
52 val preferenceDataStore: PreferenceDataStore = PreferenceDataStoreAdapter(this)
53 val metricsLogger =
54 PreferenceScreenRegistry.preferenceUiActionMetricsLogger ?: return preferenceDataStore
55 return object : PreferenceDataStoreDelegate(preferenceDataStore) {
56 override fun putBoolean(key: String, value: Boolean) {
57 super.putBoolean(key, value)
58 metricsLogger.logPreferenceValueChange(screen, preference, value)
59 }
60
61 override fun putFloat(key: String, value: Float) {
62 super.putFloat(key, value)
63 metricsLogger.logPreferenceValueChange(screen, preference, value)
64 }
65
66 override fun putInt(key: String, value: Int) {
67 super.putInt(key, value)
68 metricsLogger.logPreferenceValueChange(screen, preference, value)
69 }
70
71 override fun putLong(key: String, value: Long) {
72 super.putLong(key, value)
73 metricsLogger.logPreferenceValueChange(screen, preference, value)
74 }
75
76 override fun putString(key: String, value: String?) {
77 super.putString(key, value)
78 metricsLogger.logPreferenceValueChange(screen, preference, value)
79 }
80
81 override fun putStringSet(key: String, values: Set<String>?) {
82 super.putStringSet(key, values)
83 metricsLogger.logPreferenceValueChange(screen, preference, values)
84 }
85 }
86 }
87