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