diff --git a/src/com/android/settings/SettingsPreferenceBindingFactory.kt b/src/com/android/settings/SettingsPreferenceBindingFactory.kt index dbc6c60b267..02504fcea62 100644 --- a/src/com/android/settings/SettingsPreferenceBindingFactory.kt +++ b/src/com/android/settings/SettingsPreferenceBindingFactory.kt @@ -20,8 +20,11 @@ import androidx.preference.Preference import com.android.settings.restriction.PreferenceRestrictionMixin import com.android.settings.restriction.getRestrictionEnforcedAdmin import com.android.settings.restriction.hasBaseUserRestriction +import com.android.settings.widget.FooterPreferenceBinding +import com.android.settings.widget.FooterPreferenceMetadata import com.android.settingslib.RestrictedPreferenceHelperProvider import com.android.settingslib.metadata.PreferenceHierarchyNode +import com.android.settingslib.metadata.PreferenceMetadata import com.android.settingslib.preference.DefaultPreferenceBindingFactory import com.android.settingslib.preference.PreferenceBinding @@ -49,4 +52,11 @@ class SettingsPreferenceBindingFactory : DefaultPreferenceBindingFactory() { } } } + + override fun getPreferenceBinding(metadata: PreferenceMetadata) = + metadata as? PreferenceBinding + ?: when (metadata) { + is FooterPreferenceMetadata -> FooterPreferenceBinding.INSTANCE + else -> super.getPreferenceBinding(metadata) + } } diff --git a/src/com/android/settings/connecteddevice/BluetoothFooterPreference.kt b/src/com/android/settings/connecteddevice/BluetoothFooterPreference.kt index 72e51a36a3a..f39affbd13d 100644 --- a/src/com/android/settings/connecteddevice/BluetoothFooterPreference.kt +++ b/src/com/android/settings/connecteddevice/BluetoothFooterPreference.kt @@ -25,28 +25,24 @@ import com.android.settings.R import com.android.settings.bluetooth.Utils import com.android.settings.core.SubSettingLauncher import com.android.settings.location.BluetoothScanningFragment +import com.android.settings.widget.FooterPreferenceBinding +import com.android.settings.widget.FooterPreferenceMetadata import com.android.settingslib.metadata.PreferenceMetadata -import com.android.settingslib.metadata.PreferenceSummaryProvider -import com.android.settingslib.preference.PreferenceBinding +import com.android.settingslib.metadata.PreferenceTitleProvider import com.android.settingslib.widget.FooterPreference class BluetoothFooterPreference(private val bluetoothDataStore: BluetoothDataStore) : - PreferenceMetadata, PreferenceBinding, PreferenceSummaryProvider { + FooterPreferenceMetadata, FooterPreferenceBinding, PreferenceTitleProvider { override val key: String get() = KEY - override fun isIndexable(context: Context) = false - override fun dependencies(context: Context) = arrayOf(BluetoothPreference.KEY) override fun intent(context: Context): Intent? = subSettingLauncher(context).toIntent() - override fun createWidget(context: Context) = FooterPreference(context) - override fun bind(preference: Preference, metadata: PreferenceMetadata) { super.bind(preference, metadata) - preference.isSelectable = false val bluetoothDisabled = bluetoothDataStore.getBoolean(BluetoothPreference.KEY) != true val footerPreference = preference as FooterPreference val context = preference.context @@ -64,7 +60,7 @@ class BluetoothFooterPreference(private val bluetoothDataStore: BluetoothDataSto .setDestination(BluetoothScanningFragment::class.java.name) .setSourceMetricsCategory(SettingsEnums.BLUETOOTH_FRAGMENT) - override fun getSummary(context: Context): CharSequence? { + override fun getTitle(context: Context): CharSequence? { val bluetoothDisabled = bluetoothDataStore.getBoolean(BluetoothPreference.KEY) != true val resId = if (bluetoothDisabled && Utils.isBluetoothScanningEnabled(context)) { diff --git a/src/com/android/settings/widget/FooterPreference.kt b/src/com/android/settings/widget/FooterPreference.kt new file mode 100644 index 00000000000..f4f5b108345 --- /dev/null +++ b/src/com/android/settings/widget/FooterPreference.kt @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2025 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.settings.widget + +import android.content.Context +import androidx.preference.Preference +import com.android.settingslib.metadata.PreferenceMetadata +import com.android.settingslib.preference.PreferenceBinding +import com.android.settingslib.widget.FooterPreference +import com.android.settingslib.widget.preference.footer.R + +/** Metadata of [FooterPreference]. */ +interface FooterPreferenceMetadata : PreferenceMetadata { + override val icon: Int + get() = R.drawable.settingslib_ic_info_outline_24 + + override fun isIndexable(context: Context) = false +} + +/** Binding for [FooterPreferenceMetadata]. */ +interface FooterPreferenceBinding : PreferenceBinding { + override fun createWidget(context: Context) = FooterPreference(context) + + override fun bind(preference: Preference, metadata: PreferenceMetadata) { + super.bind(preference, metadata) + // In FooterPreference, setSummary is redirected to setTitle, and title is + // reset unexpectedly. So rebind the title again. + preference.title = metadata.getPreferenceTitle(preference.context) + preference.isSelectable = false + } + + companion object { + @JvmStatic val INSTANCE = object : FooterPreferenceBinding {} + } +}