Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2c8cd7e0 authored by Ze Li's avatar Ze Li Committed by Android (Google) Code Review
Browse files

Merge "[Bluetooth Diagnosis] Add banner preference to device details page" into main

parents 66d707b1 0bdddaac
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -44,6 +44,8 @@ public abstract class DeviceSettingPreference {
                return DeviceSettingFooterPreference.readFromParcel(in);
            case DeviceSettingType.DEVICE_SETTING_TYPE_HELP:
                return DeviceSettingHelpPreference.readFromParcel(in);
            case DeviceSettingType.DEVICE_SETTING_TYPE_BANNER:
                return BannerPreference.readFromParcel(in);
            default:
                return UNKNOWN;
        }
+34 −1
Original line number Diff line number Diff line
@@ -18,11 +18,15 @@ package com.android.settingslib.bluetooth.devicesettings.data.repository

import android.content.Context
import android.text.TextUtils
import com.android.settingslib.R
import com.android.settingslib.bluetooth.CachedBluetoothDevice
import com.android.settingslib.bluetooth.devicesettings.ActionSwitchPreference
import com.android.settingslib.bluetooth.devicesettings.BannerPreference
import com.android.settingslib.bluetooth.devicesettings.ButtonInfo
import com.android.settingslib.bluetooth.devicesettings.DeviceSetting
import com.android.settingslib.bluetooth.devicesettings.DeviceSettingAction
import com.android.settingslib.bluetooth.devicesettings.DeviceSettingContract
import com.android.settingslib.bluetooth.devicesettings.DeviceSettingDefaultIcon
import com.android.settingslib.bluetooth.devicesettings.DeviceSettingFooterPreference
import com.android.settingslib.bluetooth.devicesettings.DeviceSettingHelpPreference
import com.android.settingslib.bluetooth.devicesettings.DeviceSettingId
@@ -32,6 +36,7 @@ import com.android.settingslib.bluetooth.devicesettings.DeviceSettingPendingInte
import com.android.settingslib.bluetooth.devicesettings.DeviceSettingsConfig
import com.android.settingslib.bluetooth.devicesettings.MultiTogglePreference
import com.android.settingslib.bluetooth.devicesettings.ToggleInfo
import com.android.settingslib.bluetooth.devicesettings.shared.model.ButtonModel
import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingActionModel
import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingConfigItemModel
import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingConfigItemModel.AppProvidedItem
@@ -206,12 +211,40 @@ class DeviceSettingRepositoryImpl(
                    intent = pref.intent,
                )

            is BannerPreference ->
                DeviceSettingModel.BannerPreference(
                    cachedDevice = cachedDevice,
                    id = settingId,
                    title = pref.title,
                    message = pref.message,
                    icon = pref.icon.toModel(),
                    positiveButton = pref.positiveButtonInfo?.toModel(),
                    negativeButton = pref.negativeButtonInfo?.toModel(),
                )

            else -> DeviceSettingModel.Unknown(cachedDevice, settingId)
        }

    private fun ToggleInfo.toModel(): ToggleModel =
        ToggleModel(label, DeviceSettingIcon.BitmapIcon(icon))

    private fun com.android.settingslib.bluetooth.devicesettings.DeviceSettingIcon.toModel():
            DeviceSettingIcon? {
        val bitmapIcon = customizedIcon
        if (bitmapIcon != null) {
            return DeviceSettingIcon.BitmapIcon(bitmapIcon)
        }
        when (defaultIcon) {
            // TODO: Add more supported default icon type here
            DeviceSettingDefaultIcon.DEVICE_SETTING_DEFAULT_ICON_WARNING ->
                return DeviceSettingIcon.ResourceIcon(R.drawable.bluetooth_warning_icon)
        }
        return null
    }

    private fun ButtonInfo.toModel(): ButtonModel =
        ButtonModel(label, action.toModel())

    companion object {
        private val EXPANDABLE_SETTING_IDS =
            listOf(
+14 −0
Original line number Diff line number Diff line
@@ -67,6 +67,17 @@ sealed interface DeviceSettingModel {
        val intent: Intent,
    ) : DeviceSettingModel

    /** Models a device setting which should be displayed as a banner preference. */
    data class BannerPreference(
        override val cachedDevice: CachedBluetoothDevice,
        @DeviceSettingId override val id: Int,
        val title: String,
        val message: String,
        val icon: DeviceSettingIcon? = null,
        val positiveButton: ButtonModel? = null,
        val negativeButton: ButtonModel? = null,
    ) : DeviceSettingModel

    /** Models an unknown preference. */
    data class Unknown(
        override val cachedDevice: CachedBluetoothDevice,
@@ -77,6 +88,9 @@ sealed interface DeviceSettingModel {
/** Models a toggle in [DeviceSettingModel.MultiTogglePreference]. */
data class ToggleModel(val label: String, val icon: DeviceSettingIcon)

/** Models a button in [DeviceSettingModel.BannerPreference]. */
data class ButtonModel(val label: String, val action: DeviceSettingActionModel?)

/** Models an icon in device settings. */
sealed interface DeviceSettingIcon {

+62 −0
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@ import android.graphics.Bitmap
import com.android.settingslib.bluetooth.CachedBluetoothDevice
import com.android.settingslib.bluetooth.devicesettings.ActionSwitchPreference
import com.android.settingslib.bluetooth.devicesettings.ActionSwitchPreferenceState
import com.android.settingslib.bluetooth.devicesettings.BannerPreference
import com.android.settingslib.bluetooth.devicesettings.ButtonInfo
import com.android.settingslib.bluetooth.devicesettings.DeviceInfo
import com.android.settingslib.bluetooth.devicesettings.DeviceSetting
import com.android.settingslib.bluetooth.devicesettings.DeviceSettingHelpPreference
@@ -359,6 +361,24 @@ class DeviceSettingRepositoryTest {
        }
    }

    @Test
    fun getDeviceSetting_bannerPreference_success() {
        testScope.runTest {
            setUpConfigService(true, DEVICE_SETTING_CONFIG)
            setUpProviderService(settingProviderService1, true, listOf(DEVICE_SETTING_BANNER))
            setUpProviderService(settingProviderService2, true, listOf())
            var setting: DeviceSettingModel? = null

            underTest
                .getDeviceSetting(cachedDevice, DEVICE_SETTING_ID_BANNER)
                .onEach { setting = it }
                .launchIn(backgroundScope)
            runCurrent()

            assertDeviceSetting(setting!!, DEVICE_SETTING_BANNER)
        }
    }

    private fun assertDeviceSetting(actual: DeviceSettingModel, serviceResponse: DeviceSetting) {
        assertThat(actual.id).isEqualTo(serviceResponse.settingId)
        when (actual) {
@@ -394,6 +414,15 @@ class DeviceSettingRepositoryTest {
                val pref = serviceResponse.preference as DeviceSettingHelpPreference
                assertThat(actual.intent).isSameInstanceAs(pref.intent)
            }
            is DeviceSettingModel.BannerPreference -> {
                assertThat(serviceResponse.preference)
                    .isInstanceOf(BannerPreference::class.java)
                val pref = serviceResponse.preference as BannerPreference
                assertThat(actual.title).isEqualTo(pref.title)
                assertThat(actual.message).isEqualTo(pref.message)
                assertThat(actual.positiveButton?.label).isEqualTo(pref.positiveButtonInfo?.label)
                assertThat(actual.negativeButton?.label).isEqualTo(pref.negativeButtonInfo?.label)
            }
            else -> {}
        }
    }
@@ -464,6 +493,12 @@ class DeviceSettingRepositoryTest {
            "com.android.fake.settingproviderservice2.Service"
        const val SETTING_PROVIDER_SERVICE_INTENT_ACTION_2 =
            "com.android.fake.settingproviderservice2.BIND"
        const val SETTING_PROVIDER_SERVICE_PACKAGE_NAME_3 =
            "com.android.fake.settingproviderservice3"
        const val SETTING_PROVIDER_SERVICE_CLASS_NAME_3 =
            "com.android.fake.settingproviderservice3.Service"
        const val SETTING_PROVIDER_SERVICE_INTENT_ACTION_3 =
            "com.android.fake.settingproviderservice3.BIND"
        const val BLUETOOTH_DEVICE_METADATA =
            "<DEVICE_SETTINGS_CONFIG_PACKAGE_NAME>" +
                CONFIG_SERVICE_PACKAGE_NAME +
@@ -476,6 +511,7 @@ class DeviceSettingRepositoryTest {
                "</DEVICE_SETTINGS_CONFIG_ACTION>"
        val DEVICE_INFO = DeviceInfo.Builder().setBluetoothAddress(BLUETOOTH_ADDRESS).build()
        const val DEVICE_SETTING_ID_HELP = 12345
        const val DEVICE_SETTING_ID_BANNER = 54321
        val DEVICE_SETTING_APP_PROVIDED_ITEM_1 =
            DeviceSettingItem(
                DeviceSettingId.DEVICE_SETTING_ID_HEADER,
@@ -520,6 +556,13 @@ class DeviceSettingRepositoryTest {
                SETTING_PROVIDER_SERVICE_CLASS_NAME_2,
                SETTING_PROVIDER_SERVICE_INTENT_ACTION_2,
            )
        val DEVICE_SETTING_BANNER_ITEM =
            DeviceSettingItem(
                DEVICE_SETTING_ID_BANNER,
                SETTING_PROVIDER_SERVICE_PACKAGE_NAME_3,
                SETTING_PROVIDER_SERVICE_CLASS_NAME_3,
                SETTING_PROVIDER_SERVICE_INTENT_ACTION_3,
            )
        val DEVICE_SETTING_1 =
            DeviceSetting.Builder()
                .setSettingId(DeviceSettingId.DEVICE_SETTING_ID_HEADER)
@@ -558,6 +601,25 @@ class DeviceSettingRepositoryTest {
                .setSettingId(DEVICE_SETTING_ID_HELP)
                .setPreference(DeviceSettingHelpPreference.Builder().setIntent(Intent()).build())
                .build()
        val DEVICE_SETTING_BANNER =
            DeviceSetting.Builder()
                .setSettingId(DEVICE_SETTING_ID_BANNER)
                .setPreference(
                    BannerPreference.Builder()
                        .setTitle("title")
                        .setMessage("message")
                        .setPositiveButtonInfo(
                            ButtonInfo.Builder()
                                .setLabel("positive")
                                .build()
                        )
                        .setNegativeButtonInfo(
                            ButtonInfo.Builder()
                                .setLabel("negative")
                                .build()
                        )
                        .build()
                ).build()
        val DEVICE_SETTING_CONFIG =
            DeviceSettingsConfig(
                listOf(