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