Loading packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingPreference.java +2 −0 Original line number Diff line number Diff line Loading @@ -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; } Loading packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingRepository.kt +34 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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( Loading packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/shared/model/DeviceSettingModel.kt +14 −0 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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 { Loading packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingRepositoryTest.kt +62 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) { Loading Loading @@ -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 -> {} } } Loading Loading @@ -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 + Loading @@ -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, Loading Loading @@ -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) Loading Loading @@ -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( Loading Loading
packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingPreference.java +2 −0 Original line number Diff line number Diff line Loading @@ -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; } Loading
packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingRepository.kt +34 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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( Loading
packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/shared/model/DeviceSettingModel.kt +14 −0 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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 { Loading
packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingRepositoryTest.kt +62 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) { Loading Loading @@ -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 -> {} } } Loading Loading @@ -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 + Loading @@ -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, Loading Loading @@ -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) Loading Loading @@ -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( Loading