1 /* <lambda>null2 * 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.PreferenceDataStore 20 import androidx.preference.PreferenceGroup 21 import androidx.preference.PreferenceScreen 22 import com.android.settingslib.datastore.KeyValueStore 23 import com.android.settingslib.metadata.PersistentPreference 24 import com.android.settingslib.metadata.PreferenceHierarchy 25 import com.android.settingslib.metadata.PreferenceScreenMetadata 26 27 /** Inflates [PreferenceHierarchy] into given [PreferenceGroup] recursively. */ 28 fun PreferenceScreen.inflatePreferenceHierarchy( 29 preferenceBindingFactory: PreferenceBindingFactory, 30 hierarchy: PreferenceHierarchy, 31 ) = 32 inflatePreferenceHierarchy( 33 hierarchy.metadata as PreferenceScreenMetadata, 34 preferenceBindingFactory, 35 hierarchy, 36 mutableMapOf(), 37 ) 38 39 /** Inflates [PreferenceHierarchy] into given [PreferenceGroup] recursively. */ 40 private fun PreferenceGroup.inflatePreferenceHierarchy( 41 preferenceScreenMetadata: PreferenceScreenMetadata, 42 preferenceBindingFactory: PreferenceBindingFactory, 43 hierarchy: PreferenceHierarchy, 44 storages: MutableMap<KeyValueStore, PreferenceDataStore>, 45 ) { 46 preferenceBindingFactory.bind(this, hierarchy) 47 hierarchy.forEach { 48 val metadata = it.metadata 49 val preferenceBinding = 50 preferenceBindingFactory.getPreferenceBinding(metadata) ?: return@forEach 51 val widget = preferenceBinding.createWidget(context) 52 if (it is PreferenceHierarchy) { 53 val preferenceGroup = widget as PreferenceGroup 54 // MUST add preference before binding, otherwise exception is raised when add child 55 addPreference(preferenceGroup) 56 preferenceGroup.inflatePreferenceHierarchy( 57 preferenceScreenMetadata, 58 preferenceBindingFactory, 59 it, 60 storages, 61 ) 62 } else { 63 (metadata as? PersistentPreference<*>)?.storage(context)?.let { storage -> 64 widget.preferenceDataStore = 65 storages.getOrPut(storage) { 66 storage.toPreferenceDataStore(preferenceScreenMetadata, metadata) 67 } 68 } 69 preferenceBindingFactory.bind(widget, it, preferenceBinding) 70 // MUST add preference after binding for persistent preference to get initial value 71 // (preference key is set within bind method) 72 addPreference(widget) 73 } 74 } 75 } 76