1 /* <lambda>null2 * Copyright (C) 2024 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.settingslib.bluetooth.devicesettings.data.repository 18 19 import android.bluetooth.BluetoothAdapter 20 import android.bluetooth.BluetoothDevice 21 import android.content.ComponentName 22 import android.content.Context 23 import android.content.Intent 24 import android.content.ServiceConnection 25 import android.graphics.Bitmap 26 import com.android.settingslib.bluetooth.CachedBluetoothDevice 27 import com.android.settingslib.bluetooth.devicesettings.ActionSwitchPreference 28 import com.android.settingslib.bluetooth.devicesettings.ActionSwitchPreferenceState 29 import com.android.settingslib.bluetooth.devicesettings.DeviceInfo 30 import com.android.settingslib.bluetooth.devicesettings.DeviceSetting 31 import com.android.settingslib.bluetooth.devicesettings.DeviceSettingHelpPreference 32 import com.android.settingslib.bluetooth.devicesettings.DeviceSettingId 33 import com.android.settingslib.bluetooth.devicesettings.DeviceSettingItem 34 import com.android.settingslib.bluetooth.devicesettings.DeviceSettingState 35 import com.android.settingslib.bluetooth.devicesettings.DeviceSettingsConfig 36 import com.android.settingslib.bluetooth.devicesettings.DeviceSettingsConfigServiceStatus 37 import com.android.settingslib.bluetooth.devicesettings.DeviceSettingsProviderServiceStatus 38 import com.android.settingslib.bluetooth.devicesettings.IDeviceSettingsConfigProviderService 39 import com.android.settingslib.bluetooth.devicesettings.IDeviceSettingsListener 40 import com.android.settingslib.bluetooth.devicesettings.IDeviceSettingsProviderService 41 import com.android.settingslib.bluetooth.devicesettings.IGetDeviceSettingsConfigCallback 42 import com.android.settingslib.bluetooth.devicesettings.MultiTogglePreference 43 import com.android.settingslib.bluetooth.devicesettings.MultiTogglePreferenceState 44 import com.android.settingslib.bluetooth.devicesettings.ToggleInfo 45 import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingConfigItemModel 46 import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingConfigModel 47 import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingIcon 48 import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingModel 49 import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingStateModel 50 import com.android.settingslib.bluetooth.devicesettings.shared.model.ToggleModel 51 import com.google.common.truth.Truth.assertThat 52 import kotlinx.coroutines.ExperimentalCoroutinesApi 53 import kotlinx.coroutines.flow.launchIn 54 import kotlinx.coroutines.flow.onEach 55 import kotlinx.coroutines.test.TestScope 56 import kotlinx.coroutines.test.runCurrent 57 import kotlinx.coroutines.test.runTest 58 import org.junit.Before 59 import org.junit.Rule 60 import org.junit.Test 61 import org.junit.runner.RunWith 62 import org.mockito.ArgumentMatchers.any 63 import org.mockito.ArgumentMatchers.anyInt 64 import org.mockito.ArgumentMatchers.anyString 65 import org.mockito.Mock 66 import org.mockito.Mockito.doReturn 67 import org.mockito.Mockito.verify 68 import org.mockito.Mockito.`when` 69 import org.mockito.junit.MockitoJUnit 70 import org.mockito.junit.MockitoRule 71 import org.robolectric.RobolectricTestRunner 72 73 @RunWith(RobolectricTestRunner::class) 74 @OptIn(ExperimentalCoroutinesApi::class) 75 class DeviceSettingRepositoryTest { 76 @get:Rule val mockitoRule: MockitoRule = MockitoJUnit.rule() 77 78 @Mock private lateinit var cachedDevice: CachedBluetoothDevice 79 @Mock private lateinit var bluetoothDevice: BluetoothDevice 80 @Mock private lateinit var context: Context 81 @Mock private lateinit var bluetoothAdapter: BluetoothAdapter 82 @Mock private lateinit var configService: IDeviceSettingsConfigProviderService.Stub 83 @Mock private lateinit var settingProviderService1: IDeviceSettingsProviderService.Stub 84 @Mock private lateinit var settingProviderService2: IDeviceSettingsProviderService.Stub 85 86 private lateinit var underTest: DeviceSettingRepository 87 private val testScope = TestScope() 88 89 @Before 90 fun setUp() { 91 `when`(cachedDevice.device).thenReturn(bluetoothDevice) 92 `when`(cachedDevice.address).thenReturn(BLUETOOTH_ADDRESS) 93 `when`( 94 bluetoothDevice.getMetadata( 95 DeviceSettingServiceConnection.METADATA_FAST_PAIR_CUSTOMIZED_FIELDS 96 ) 97 ) 98 .thenReturn(BLUETOOTH_DEVICE_METADATA.toByteArray()) 99 100 `when`(configService.queryLocalInterface(anyString())).thenReturn(configService) 101 `when`(settingProviderService1.queryLocalInterface(anyString())) 102 .thenReturn(settingProviderService1) 103 `when`(settingProviderService2.queryLocalInterface(anyString())) 104 .thenReturn(settingProviderService2) 105 106 `when`(context.bindService(any(), anyInt(), any(), any())).then { input -> 107 val intent = input.getArgument<Intent?>(0) 108 val connection = input.getArgument<ServiceConnection>(3) 109 110 when (intent?.action) { 111 CONFIG_SERVICE_INTENT_ACTION -> 112 connection.onServiceConnected( 113 ComponentName(CONFIG_SERVICE_PACKAGE_NAME, CONFIG_SERVICE_CLASS_NAME), 114 configService, 115 ) 116 SETTING_PROVIDER_SERVICE_INTENT_ACTION_1 -> 117 connection.onServiceConnected( 118 ComponentName( 119 SETTING_PROVIDER_SERVICE_PACKAGE_NAME_1, 120 SETTING_PROVIDER_SERVICE_CLASS_NAME_1, 121 ), 122 settingProviderService1, 123 ) 124 SETTING_PROVIDER_SERVICE_INTENT_ACTION_2 -> 125 connection.onServiceConnected( 126 ComponentName( 127 SETTING_PROVIDER_SERVICE_PACKAGE_NAME_2, 128 SETTING_PROVIDER_SERVICE_CLASS_NAME_2, 129 ), 130 settingProviderService2, 131 ) 132 } 133 true 134 } 135 underTest = 136 DeviceSettingRepositoryImpl( 137 context, 138 bluetoothAdapter, 139 testScope.backgroundScope, 140 testScope.testScheduler, 141 ) 142 } 143 144 @Test 145 fun getDeviceSettingsConfig_withMetadata_success() { 146 testScope.runTest { 147 setUpConfigService(true, DEVICE_SETTING_CONFIG) 148 `when`(settingProviderService1.serviceStatus) 149 .thenReturn(DeviceSettingsProviderServiceStatus(true)) 150 `when`(settingProviderService2.serviceStatus) 151 .thenReturn(DeviceSettingsProviderServiceStatus(true)) 152 153 val config = underTest.getDeviceSettingsConfig(cachedDevice) 154 155 assertConfig(config!!, DEVICE_SETTING_CONFIG) 156 assertThat(config.mainItems[0]) 157 .isInstanceOf(DeviceSettingConfigItemModel.AppProvidedItem::class.java) 158 assertThat(config.mainItems[1]) 159 .isInstanceOf( 160 DeviceSettingConfigItemModel.BuiltinItem.CommonBuiltinItem::class.java 161 ) 162 assertThat(config.mainItems[2]) 163 .isInstanceOf( 164 DeviceSettingConfigItemModel.BuiltinItem.BluetoothProfilesItem::class.java 165 ) 166 } 167 } 168 169 @Test 170 fun getDeviceSettingsConfig_expandable_success() { 171 testScope.runTest { 172 setUpConfigService(true, DEVICE_SETTING_CONFIG_EXPANDABLE) 173 `when`(settingProviderService1.serviceStatus) 174 .thenReturn(DeviceSettingsProviderServiceStatus(true)) 175 `when`(settingProviderService2.serviceStatus) 176 .thenReturn(DeviceSettingsProviderServiceStatus(true)) 177 178 val config = underTest.getDeviceSettingsConfig(cachedDevice)!! 179 180 assertThat(config.mainItems.map { it.settingId }).isEqualTo( 181 IntRange( 182 DeviceSettingId.DEVICE_SETTING_ID_EXPANDABLE_1, 183 DeviceSettingId.DEVICE_SETTING_ID_EXPANDABLE_1 + 14 184 ).toList() 185 ) 186 } 187 } 188 189 @Test 190 fun getDeviceSettingsConfig_noMetadata_returnNull() { 191 testScope.runTest { 192 `when`( 193 bluetoothDevice.getMetadata( 194 DeviceSettingServiceConnection.METADATA_FAST_PAIR_CUSTOMIZED_FIELDS 195 ) 196 ) 197 .thenReturn("".toByteArray()) 198 setUpConfigService(true, DEVICE_SETTING_CONFIG) 199 `when`(settingProviderService1.serviceStatus) 200 .thenReturn(DeviceSettingsProviderServiceStatus(true)) 201 `when`(settingProviderService2.serviceStatus) 202 .thenReturn(DeviceSettingsProviderServiceStatus(true)) 203 204 val config = underTest.getDeviceSettingsConfig(cachedDevice) 205 206 assertThat(config).isNull() 207 } 208 } 209 210 @Test 211 fun getDeviceSettingsConfig_providerServiceNotEnabled_returnNull() { 212 testScope.runTest { 213 setUpConfigService(true, DEVICE_SETTING_CONFIG) 214 `when`(settingProviderService1.serviceStatus) 215 .thenReturn(DeviceSettingsProviderServiceStatus(false)) 216 `when`(settingProviderService2.serviceStatus) 217 .thenReturn(DeviceSettingsProviderServiceStatus(true)) 218 219 val config = underTest.getDeviceSettingsConfig(cachedDevice) 220 221 assertThat(config).isNull() 222 } 223 } 224 225 @Test 226 fun getDeviceSettingsConfig_bindingServiceFail_returnNull() { 227 testScope.runTest { 228 setUpConfigService(true, DEVICE_SETTING_CONFIG) 229 doReturn(false).`when`(context).bindService(any(), anyInt(), any(), any()) 230 231 val config = underTest.getDeviceSettingsConfig(cachedDevice) 232 233 assertThat(config).isNull() 234 } 235 } 236 237 @Test 238 fun getDeviceSetting_actionSwitchPreference_success() { 239 testScope.runTest { 240 setUpConfigService(true, DEVICE_SETTING_CONFIG) 241 `when`(settingProviderService1.registerDeviceSettingsListener(any(), any())).then { 242 input -> 243 input 244 .getArgument<IDeviceSettingsListener>(1) 245 .onDeviceSettingsChanged(listOf(DEVICE_SETTING_1)) 246 } 247 `when`(settingProviderService1.serviceStatus) 248 .thenReturn(DeviceSettingsProviderServiceStatus(true)) 249 `when`(settingProviderService2.serviceStatus) 250 .thenReturn(DeviceSettingsProviderServiceStatus(true)) 251 var setting: DeviceSettingModel? = null 252 253 underTest 254 .getDeviceSetting(cachedDevice, DeviceSettingId.DEVICE_SETTING_ID_HEADER) 255 .onEach { setting = it } 256 .launchIn(backgroundScope) 257 runCurrent() 258 259 assertDeviceSetting(setting!!, DEVICE_SETTING_1) 260 } 261 } 262 263 @Test 264 fun getDeviceSetting_multiTogglePreference_success() { 265 testScope.runTest { 266 setUpConfigService(true, DEVICE_SETTING_CONFIG) 267 `when`(settingProviderService2.registerDeviceSettingsListener(any(), any())).then { 268 input -> 269 input 270 .getArgument<IDeviceSettingsListener>(1) 271 .onDeviceSettingsChanged(listOf(DEVICE_SETTING_2)) 272 } 273 `when`(settingProviderService1.serviceStatus) 274 .thenReturn(DeviceSettingsProviderServiceStatus(true)) 275 `when`(settingProviderService2.serviceStatus) 276 .thenReturn(DeviceSettingsProviderServiceStatus(true)) 277 var setting: DeviceSettingModel? = null 278 279 underTest 280 .getDeviceSetting(cachedDevice, DeviceSettingId.DEVICE_SETTING_ID_ANC) 281 .onEach { setting = it } 282 .launchIn(backgroundScope) 283 runCurrent() 284 285 assertDeviceSetting(setting!!, DEVICE_SETTING_2) 286 } 287 } 288 289 @Test 290 fun getDeviceSetting_helpPreference_success() { 291 testScope.runTest { 292 setUpConfigService(true, DEVICE_SETTING_CONFIG) 293 `when`(settingProviderService2.registerDeviceSettingsListener(any(), any())).then { 294 input -> 295 input 296 .getArgument<IDeviceSettingsListener>(1) 297 .onDeviceSettingsChanged(listOf(DEVICE_SETTING_HELP)) 298 } 299 `when`(settingProviderService1.serviceStatus) 300 .thenReturn(DeviceSettingsProviderServiceStatus(true)) 301 `when`(settingProviderService2.serviceStatus) 302 .thenReturn(DeviceSettingsProviderServiceStatus(true)) 303 var setting: DeviceSettingModel? = null 304 305 underTest 306 .getDeviceSetting(cachedDevice, DEVICE_SETTING_ID_HELP) 307 .onEach { setting = it } 308 .launchIn(backgroundScope) 309 runCurrent() 310 311 assertDeviceSetting(setting!!, DEVICE_SETTING_HELP) 312 } 313 } 314 315 @Test 316 fun getDeviceSetting_noConfig_returnNull() { 317 testScope.runTest { 318 setUpConfigService(false, null) 319 `when`(settingProviderService1.registerDeviceSettingsListener(any(), any())).then { 320 input -> 321 input 322 .getArgument<IDeviceSettingsListener>(1) 323 .onDeviceSettingsChanged(listOf(DEVICE_SETTING_1)) 324 } 325 var setting: DeviceSettingModel? = null 326 327 underTest 328 .getDeviceSetting(cachedDevice, DeviceSettingId.DEVICE_SETTING_ID_HEADER) 329 .onEach { setting = it } 330 .launchIn(backgroundScope) 331 runCurrent() 332 333 assertThat(setting).isNull() 334 } 335 } 336 337 @Test 338 fun updateDeviceSettingState_switchState_success() { 339 testScope.runTest { 340 setUpConfigService(true, DEVICE_SETTING_CONFIG) 341 `when`(settingProviderService1.registerDeviceSettingsListener(any(), any())).then { 342 input -> 343 input 344 .getArgument<IDeviceSettingsListener>(1) 345 .onDeviceSettingsChanged(listOf(DEVICE_SETTING_1)) 346 } 347 `when`(settingProviderService1.serviceStatus) 348 .thenReturn(DeviceSettingsProviderServiceStatus(true)) 349 `when`(settingProviderService2.serviceStatus) 350 .thenReturn(DeviceSettingsProviderServiceStatus(true)) 351 var setting: DeviceSettingModel? = null 352 353 underTest 354 .getDeviceSetting(cachedDevice, DeviceSettingId.DEVICE_SETTING_ID_HEADER) 355 .onEach { setting = it } 356 .launchIn(backgroundScope) 357 runCurrent() 358 val updateFunc = (setting as DeviceSettingModel.ActionSwitchPreference).updateState!! 359 updateFunc(DeviceSettingStateModel.ActionSwitchPreferenceState(false)) 360 runCurrent() 361 362 verify(settingProviderService1) 363 .updateDeviceSettings( 364 DEVICE_INFO, 365 DeviceSettingState.Builder() 366 .setSettingId(DeviceSettingId.DEVICE_SETTING_ID_HEADER) 367 .setPreferenceState( 368 ActionSwitchPreferenceState.Builder().setChecked(false).build() 369 ) 370 .build(), 371 ) 372 } 373 } 374 375 @Test 376 fun updateDeviceSettingState_multiToggleState_success() { 377 testScope.runTest { 378 setUpConfigService(true, DEVICE_SETTING_CONFIG) 379 `when`(settingProviderService2.registerDeviceSettingsListener(any(), any())).then { 380 input -> 381 input 382 .getArgument<IDeviceSettingsListener>(1) 383 .onDeviceSettingsChanged(listOf(DEVICE_SETTING_2)) 384 } 385 `when`(settingProviderService1.serviceStatus) 386 .thenReturn(DeviceSettingsProviderServiceStatus(true)) 387 `when`(settingProviderService2.serviceStatus) 388 .thenReturn(DeviceSettingsProviderServiceStatus(true)) 389 var setting: DeviceSettingModel? = null 390 391 underTest 392 .getDeviceSetting(cachedDevice, DeviceSettingId.DEVICE_SETTING_ID_ANC) 393 .onEach { setting = it } 394 .launchIn(backgroundScope) 395 runCurrent() 396 val updateFunc = (setting as DeviceSettingModel.MultiTogglePreference).updateState 397 updateFunc(DeviceSettingStateModel.MultiTogglePreferenceState(2)) 398 runCurrent() 399 400 verify(settingProviderService2) 401 .updateDeviceSettings( 402 DEVICE_INFO, 403 DeviceSettingState.Builder() 404 .setSettingId(DeviceSettingId.DEVICE_SETTING_ID_ANC) 405 .setPreferenceState( 406 MultiTogglePreferenceState.Builder().setState(2).build() 407 ) 408 .build(), 409 ) 410 } 411 } 412 413 private fun assertDeviceSetting(actual: DeviceSettingModel, serviceResponse: DeviceSetting) { 414 assertThat(actual.id).isEqualTo(serviceResponse.settingId) 415 when (actual) { 416 is DeviceSettingModel.ActionSwitchPreference -> { 417 assertThat(serviceResponse.preference) 418 .isInstanceOf(ActionSwitchPreference::class.java) 419 val pref = serviceResponse.preference as ActionSwitchPreference 420 assertThat(actual.title).isEqualTo(pref.title) 421 assertThat(actual.summary).isEqualTo(pref.summary) 422 assertThat(actual.icon) 423 .isEqualTo(pref.icon?.let { DeviceSettingIcon.BitmapIcon(it) }) 424 assertThat(actual.isAllowedChangingState).isEqualTo(pref.isAllowedChangingState) 425 if (pref.hasSwitch()) { 426 assertThat(actual.switchState!!.checked).isEqualTo(pref.checked) 427 } else { 428 assertThat(actual.switchState).isNull() 429 } 430 } 431 is DeviceSettingModel.MultiTogglePreference -> { 432 assertThat(serviceResponse.preference) 433 .isInstanceOf(MultiTogglePreference::class.java) 434 val pref = serviceResponse.preference as MultiTogglePreference 435 assertThat(actual.title).isEqualTo(pref.title) 436 assertThat(actual.isAllowedChangingState).isEqualTo(pref.isAllowedChangingState) 437 assertThat(actual.toggles.size).isEqualTo(pref.toggleInfos.size) 438 for (i in 0..<actual.toggles.size) { 439 assertToggle(actual.toggles[i], pref.toggleInfos[i]) 440 } 441 } 442 is DeviceSettingModel.HelpPreference -> { 443 assertThat(serviceResponse.preference) 444 .isInstanceOf(DeviceSettingHelpPreference::class.java) 445 val pref = serviceResponse.preference as DeviceSettingHelpPreference 446 assertThat(actual.intent).isSameInstanceAs(pref.intent) 447 } 448 else -> {} 449 } 450 } 451 452 private fun assertToggle(actual: ToggleModel, serviceResponse: ToggleInfo) { 453 assertThat(actual.label).isEqualTo(serviceResponse.label) 454 assertThat((actual.icon as DeviceSettingIcon.BitmapIcon).bitmap) 455 .isEqualTo(serviceResponse.icon) 456 } 457 458 private fun assertConfig( 459 actual: DeviceSettingConfigModel, 460 serviceResponse: DeviceSettingsConfig, 461 ) { 462 assertThat(actual.mainItems.size).isEqualTo(serviceResponse.mainContentItems.size) 463 for (i in 0..<actual.mainItems.size) { 464 assertConfigItem(actual.mainItems[i], serviceResponse.mainContentItems[i]) 465 } 466 assertThat(actual.moreSettingsItems.size).isEqualTo(serviceResponse.moreSettingsItems.size) 467 for (i in 0..<actual.moreSettingsItems.size) { 468 assertConfigItem(actual.moreSettingsItems[i], serviceResponse.moreSettingsItems[i]) 469 } 470 } 471 472 private fun assertConfigItem( 473 actual: DeviceSettingConfigItemModel, 474 serviceResponse: DeviceSettingItem, 475 ) { 476 assertThat(actual.settingId).isEqualTo(serviceResponse.settingId) 477 } 478 479 private fun setUpConfigService(success: Boolean, config: DeviceSettingsConfig?) { 480 `when`(configService.getDeviceSettingsConfig(any(), any())).then { input -> 481 input 482 .getArgument<IGetDeviceSettingsConfigCallback>(1) 483 .onResult( 484 DeviceSettingsConfigServiceStatus(success = success), 485 config 486 ) 487 } 488 } 489 490 private companion object { 491 const val BLUETOOTH_ADDRESS = "12:34:56:78" 492 const val CONFIG_SERVICE_PACKAGE_NAME = "com.android.fake.configservice" 493 const val CONFIG_SERVICE_CLASS_NAME = "com.android.fake.configservice.Service" 494 const val CONFIG_SERVICE_INTENT_ACTION = "com.android.fake.configservice.BIND" 495 const val SETTING_PROVIDER_SERVICE_PACKAGE_NAME_1 = 496 "com.android.fake.settingproviderservice1" 497 const val SETTING_PROVIDER_SERVICE_CLASS_NAME_1 = 498 "com.android.fake.settingproviderservice1.Service" 499 const val SETTING_PROVIDER_SERVICE_INTENT_ACTION_1 = 500 "com.android.fake.settingproviderservice1.BIND" 501 const val SETTING_PROVIDER_SERVICE_PACKAGE_NAME_2 = 502 "com.android.fake.settingproviderservice2" 503 const val SETTING_PROVIDER_SERVICE_CLASS_NAME_2 = 504 "com.android.fake.settingproviderservice2.Service" 505 const val SETTING_PROVIDER_SERVICE_INTENT_ACTION_2 = 506 "com.android.fake.settingproviderservice2.BIND" 507 const val BLUETOOTH_DEVICE_METADATA = 508 "<DEVICE_SETTINGS_CONFIG_PACKAGE_NAME>" + 509 CONFIG_SERVICE_PACKAGE_NAME + 510 "</DEVICE_SETTINGS_CONFIG_PACKAGE_NAME>" + 511 "<DEVICE_SETTINGS_CONFIG_CLASS>" + 512 CONFIG_SERVICE_CLASS_NAME + 513 "</DEVICE_SETTINGS_CONFIG_CLASS>" + 514 "<DEVICE_SETTINGS_CONFIG_ACTION>" + 515 CONFIG_SERVICE_INTENT_ACTION + 516 "</DEVICE_SETTINGS_CONFIG_ACTION>" 517 val DEVICE_INFO = DeviceInfo.Builder().setBluetoothAddress(BLUETOOTH_ADDRESS).build() 518 const val DEVICE_SETTING_ID_HELP = 12345 519 val DEVICE_SETTING_APP_PROVIDED_ITEM_1 = 520 DeviceSettingItem( 521 DeviceSettingId.DEVICE_SETTING_ID_HEADER, 522 SETTING_PROVIDER_SERVICE_PACKAGE_NAME_1, 523 SETTING_PROVIDER_SERVICE_CLASS_NAME_1, 524 SETTING_PROVIDER_SERVICE_INTENT_ACTION_1, 525 ) 526 val DEVICE_SETTING_APP_PROVIDED_ITEM_2 = 527 DeviceSettingItem( 528 DeviceSettingId.DEVICE_SETTING_ID_ANC, 529 SETTING_PROVIDER_SERVICE_PACKAGE_NAME_2, 530 SETTING_PROVIDER_SERVICE_CLASS_NAME_2, 531 SETTING_PROVIDER_SERVICE_INTENT_ACTION_2, 532 ) 533 val DEVICE_SETTING_APP_PROVIDED_ITEM_EXPANDABLE = 534 DeviceSettingItem( 535 DeviceSettingId.DEVICE_SETTING_ID_EXPANDABLE_1, 536 SETTING_PROVIDER_SERVICE_PACKAGE_NAME_1, 537 SETTING_PROVIDER_SERVICE_CLASS_NAME_1, 538 SETTING_PROVIDER_SERVICE_INTENT_ACTION_1, 539 ) 540 val DEVICE_SETTING_BUILT_IN_ITEM = 541 DeviceSettingItem( 542 DeviceSettingId.DEVICE_SETTING_ID_BLUETOOTH_AUDIO_DEVICE_TYPE_GROUP, 543 "", 544 "", 545 "", 546 "device_type", 547 ) 548 val DEVICE_SETTING_BUILT_IN_BT_PROFILES_ITEM = 549 DeviceSettingItem( 550 DeviceSettingId.DEVICE_SETTING_ID_BLUETOOTH_PROFILES, 551 "", 552 "", 553 "", 554 "bluetooth_profiles", 555 ) 556 val DEVICE_SETTING_HELP_ITEM = 557 DeviceSettingItem( 558 DEVICE_SETTING_ID_HELP, 559 SETTING_PROVIDER_SERVICE_PACKAGE_NAME_2, 560 SETTING_PROVIDER_SERVICE_CLASS_NAME_2, 561 SETTING_PROVIDER_SERVICE_INTENT_ACTION_2, 562 ) 563 val DEVICE_SETTING_1 = 564 DeviceSetting.Builder() 565 .setSettingId(DeviceSettingId.DEVICE_SETTING_ID_HEADER) 566 .setPreference( 567 ActionSwitchPreference.Builder() 568 .setTitle("title1") 569 .setHasSwitch(true) 570 .setAllowedChangingState(true) 571 .build() 572 ) 573 .build() 574 val DEVICE_SETTING_2 = 575 DeviceSetting.Builder() 576 .setSettingId(DeviceSettingId.DEVICE_SETTING_ID_ANC) 577 .setPreference( 578 MultiTogglePreference.Builder() 579 .setTitle("title1") 580 .setAllowChangingState(true) 581 .addToggleInfo( 582 ToggleInfo.Builder() 583 .setLabel("label1") 584 .setIcon(Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)) 585 .build() 586 ) 587 .addToggleInfo( 588 ToggleInfo.Builder() 589 .setLabel("label2") 590 .setIcon(Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)) 591 .build() 592 ) 593 .build() 594 ) 595 .build() 596 val DEVICE_SETTING_HELP = 597 DeviceSetting.Builder() 598 .setSettingId(DEVICE_SETTING_ID_HELP) 599 .setPreference(DeviceSettingHelpPreference.Builder().setIntent(Intent()).build()) 600 .build() 601 val DEVICE_SETTING_CONFIG = 602 DeviceSettingsConfig( 603 listOf( 604 DEVICE_SETTING_APP_PROVIDED_ITEM_1, 605 DEVICE_SETTING_BUILT_IN_ITEM, 606 DEVICE_SETTING_BUILT_IN_BT_PROFILES_ITEM, 607 ), 608 listOf(DEVICE_SETTING_APP_PROVIDED_ITEM_2), 609 DEVICE_SETTING_HELP_ITEM, 610 ) 611 val DEVICE_SETTING_CONFIG_EXPANDABLE = 612 DeviceSettingsConfig( 613 listOf( 614 DEVICE_SETTING_APP_PROVIDED_ITEM_EXPANDABLE, 615 ), 616 listOf(), 617 DEVICE_SETTING_HELP_ITEM, 618 ) 619 } 620 } 621