• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2025 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.settings.bluetooth
18 
19 import android.os.Bundle
20 import android.os.UserManager
21 import android.view.View
22 import androidx.preference.Preference
23 import androidx.preference.PreferenceCategory
24 import androidx.preference.PreferenceGroup
25 import com.android.settings.dashboard.RestrictedDashboardFragment
26 
27 /** Base class for bluetooth settings which makes the preference visibility/order configurable. */
28 abstract class BluetoothDetailsConfigurableFragment :
29     RestrictedDashboardFragment(UserManager.DISALLOW_CONFIG_BLUETOOTH) {
30     private var displayOrder: List<String>? = null
31 
setPreferenceDisplayOrdernull32     fun setPreferenceDisplayOrder(prefKeyOrder: List<String>?) {
33         if (displayOrder == prefKeyOrder) {
34             return
35         }
36         displayOrder = prefKeyOrder
37         updatePreferenceOrder()
38     }
39 
<lambda>null40     private val invisiblePrefCategory: PreferenceGroup by lazy {
41         preferenceScreen.findPreference<PreferenceGroup>(INVISIBLE_CATEGORY)
42             ?: run {
43                 PreferenceCategory(requireContext())
44                     .apply {
45                         key = INVISIBLE_CATEGORY
46                         isVisible = false
47                         isOrderingAsAdded = true
48                     }
49                     .also { preferenceScreen.addPreference(it) }
50             }
51     }
52 
onViewCreatednull53     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
54         super.onViewCreated(view, savedInstanceState)
55         updatePreferenceOrder()
56     }
57 
updatePreferenceOrdernull58     private fun updatePreferenceOrder() {
59         val order = displayOrder?: return
60         if (preferenceScreen == null) {
61             return
62         }
63         preferenceScreen.isOrderingAsAdded = true
64         val allPrefs =
65             (invisiblePrefCategory.getAndRemoveAll() + preferenceScreen.getAndRemoveAll()).filter {
66                 it != invisiblePrefCategory
67             }
68         allPrefs.forEach { it.order = Preference.DEFAULT_ORDER }
69         val visiblePrefs =
70             allPrefs.filter { order.contains(it.key) }.sortedBy { order.indexOf(it.key) }
71         val invisiblePrefs = allPrefs.filter { !order.contains(it.key) }
72         preferenceScreen.addPreferences(visiblePrefs)
73         preferenceScreen.addPreference(invisiblePrefCategory)
74         invisiblePrefCategory.addPreferences(invisiblePrefs)
75     }
76 
getAndRemoveAllnull77     private fun PreferenceGroup.getAndRemoveAll(): List<Preference> {
78         val prefs = mutableListOf<Preference>()
79         for (i in 0..<preferenceCount) {
80             prefs.add(getPreference(i))
81         }
82         removeAll()
83         return prefs
84     }
85 
addPreferencesnull86     private fun PreferenceGroup.addPreferences(prefs: List<Preference>) {
87         for (pref in prefs) {
88             addPreference(pref)
89         }
90     }
91 
92     private companion object {
93         const val INVISIBLE_CATEGORY = "invisible_profile_category"
94     }
95 }
96