@@ -91,6 +91,7 @@ import me.kavishdevar.librepods.constants.AirPodsNotifications
9191import me.kavishdevar.librepods.services.AirPodsService
9292import me.kavishdevar.librepods.ui.theme.LibrePodsTheme
9393import me.kavishdevar.librepods.utils.AACPManager
94+ import me.kavishdevar.librepods.utils.RadareOffsetFinder
9495import kotlin.io.encoding.ExperimentalEncodingApi
9596
9697@OptIn(ExperimentalMaterial3Api ::class , ExperimentalHazeMaterialsApi ::class )
@@ -196,8 +197,19 @@ fun AirPodsSettingsScreen(dev: BluetoothDevice?, service: AirPodsService,
196197 }
197198 }
198199 }
200+
201+ LaunchedEffect (service) {
202+ service.let {
203+ it.sendBroadcast(Intent (AirPodsNotifications .BATTERY_DATA ).apply {
204+ putParcelableArrayListExtra(" data" , ArrayList (it.getBattery()))
205+ })
206+ it.sendBroadcast(Intent (AirPodsNotifications .ANC_DATA ).apply {
207+ putExtra(" data" , it.getANC())
208+ })
209+ }
210+ }
211+
199212 val darkMode = isSystemInDarkTheme()
200- val backdrop = rememberLayerBackdrop()
201213 StyledScaffold (
202214 title = deviceName.text,
203215 actionButtons = listOf (
@@ -218,26 +230,14 @@ fun AirPodsSettingsScreen(dev: BluetoothDevice?, service: AirPodsService,
218230 .fillMaxSize()
219231 .hazeSource(hazeState)
220232 .padding(horizontal = 16 .dp)
221- .layerBackdrop(backdrop)
222233 ) {
223- item { Spacer (modifier = Modifier .height(spacerHeight)) }
224- item {
225- LaunchedEffect (service) {
226- service.let {
227- it.sendBroadcast(Intent (AirPodsNotifications .BATTERY_DATA ).apply {
228- putParcelableArrayListExtra(" data" , ArrayList (it.getBattery()))
229- })
230- it.sendBroadcast(Intent (AirPodsNotifications .ANC_DATA ).apply {
231- putExtra(" data" , it.getANC())
232- })
233- }
234- }
235-
234+ item(key = " spacer_top" ) { Spacer (modifier = Modifier .height(spacerHeight)) }
235+ item(key = " battery" ) {
236236 BatteryView (service = service)
237237 }
238- item { Spacer (modifier = Modifier .height(32 .dp)) }
238+ item(key = " spacer_battery " ) { Spacer (modifier = Modifier .height(32 .dp)) }
239239
240- item {
240+ item(key = " name " ) {
241241 NavigationButton (
242242 to = " rename" ,
243243 name = stringResource(R .string.name),
@@ -246,49 +246,55 @@ fun AirPodsSettingsScreen(dev: BluetoothDevice?, service: AirPodsService,
246246 independent = true
247247 )
248248 }
249+ val actAsAppleDeviceHookEnabled = RadareOffsetFinder .isSdpOffsetAvailable()
250+ if (actAsAppleDeviceHookEnabled) {
251+ item(key = " spacer_hearing_aid" ) { Spacer (modifier = Modifier .height(32 .dp)) }
252+ item(key = " hearing_aid" ) {
253+ NavigationButton (
254+ to = " hearing_aid" ,
255+ name = stringResource(R .string.hearing_aid),
256+ navController = navController
257+ )
258+ }
259+ }
249260
250- item { Spacer (modifier = Modifier .height(32 .dp)) }
251- item { NavigationButton (to = " hearing_aid" , name = stringResource(R .string.hearing_aid), navController = navController) }
252-
253- item { Spacer (modifier = Modifier .height(16 .dp)) }
254- item { NoiseControlSettings (service = service) }
261+ item(key = " spacer_noise" ) { Spacer (modifier = Modifier .height(16 .dp)) }
262+ item(key = " noise_control" ) { NoiseControlSettings (service = service) }
255263
256- item { Spacer (modifier = Modifier .height(16 .dp)) }
257- item { PressAndHoldSettings (navController = navController) }
264+ item(key = " spacer_press_hold " ) { Spacer (modifier = Modifier .height(16 .dp)) }
265+ item(key = " press_hold " ) { PressAndHoldSettings (navController = navController) }
258266
259- item { Spacer (modifier = Modifier .height(16 .dp)) }
260- item { CallControlSettings (hazeState = hazeState) }
267+ item(key = " spacer_call " ) { Spacer (modifier = Modifier .height(16 .dp)) }
268+ item(key = " call_control " ) { CallControlSettings (hazeState = hazeState) }
261269
262- item { Spacer (modifier = Modifier .height(16 .dp)) }
263- item { NavigationButton (to = " camera_control" , name = stringResource(R .string.camera_remote), description = stringResource(R .string.camera_control_description), title = stringResource(R .string.camera_control), navController = navController) }
270+ item(key = " spacer_camera " ) { Spacer (modifier = Modifier .height(16 .dp)) }
271+ item(key = " camera_control " ) { NavigationButton (to = " camera_control" , name = stringResource(R .string.camera_remote), description = stringResource(R .string.camera_control_description), title = stringResource(R .string.camera_control), navController = navController) }
264272
265- item { Spacer (modifier = Modifier .height(16 .dp)) }
266- item { AudioSettings (navController = navController) }
273+ item(key = " spacer_audio " ) { Spacer (modifier = Modifier .height(16 .dp)) }
274+ item(key = " audio " ) { AudioSettings (navController = navController) }
267275
268- item { Spacer (modifier = Modifier .height(16 .dp)) }
269- item { ConnectionSettings () }
276+ item(key = " spacer_connection " ) { Spacer (modifier = Modifier .height(16 .dp)) }
277+ item(key = " connection " ) { ConnectionSettings () }
270278
271- item { Spacer (modifier = Modifier .height(16 .dp)) }
272- item { MicrophoneSettings (hazeState) }
279+ item(key = " spacer_microphone " ) { Spacer (modifier = Modifier .height(16 .dp)) }
280+ item(key = " microphone " ) { MicrophoneSettings (hazeState) }
273281
274- item { Spacer (modifier = Modifier .height(16 .dp)) }
275- item {
282+ item(key = " spacer_sleep " ) { Spacer (modifier = Modifier .height(16 .dp)) }
283+ item(key = " sleep_detection " ) {
276284 StyledToggle (
277285 label = stringResource(R .string.sleep_detection),
278286 controlCommandIdentifier = AACPManager .Companion .ControlCommandIdentifiers .SLEEP_DETECTION_CONFIG
279287 )
280288 }
281289
282- item { Spacer (modifier = Modifier .height(16 .dp)) }
283- item {
284- NavigationButton (to = " head_tracking" , name = stringResource(R .string.head_gestures), navController = navController, currentState = if (sharedPreferences.getBoolean(" head_gestures" , false )) stringResource(R .string.on) else stringResource(R .string.off))
285- }
290+ item(key = " spacer_head_tracking" ) { Spacer (modifier = Modifier .height(16 .dp)) }
291+ item(key = " head_tracking" ) { NavigationButton (to = " head_tracking" , name = stringResource(R .string.head_gestures), navController = navController, currentState = if (sharedPreferences.getBoolean(" head_gestures" , false )) stringResource(R .string.on) else stringResource(R .string.off)) }
286292
287- item { Spacer (modifier = Modifier .height(16 .dp)) }
288- item { NavigationButton (to = " accessibility" , name = stringResource(R .string.accessibility), navController = navController) }
293+ item(key = " spacer_accessibility " ) { Spacer (modifier = Modifier .height(16 .dp)) }
294+ item(key = " accessibility " ) { NavigationButton (to = " accessibility" , name = stringResource(R .string.accessibility), navController = navController) }
289295
290- item { Spacer (modifier = Modifier .height(16 .dp)) }
291- item {
296+ item(key = " spacer_off_listening " ) { Spacer (modifier = Modifier .height(16 .dp)) }
297+ item(key = " off_listening " ) {
292298 StyledToggle (
293299 label = stringResource(R .string.off_listening_mode),
294300 controlCommandIdentifier = AACPManager .Companion .ControlCommandIdentifiers .ALLOW_OFF_OPTION ,
@@ -298,9 +304,9 @@ fun AirPodsSettingsScreen(dev: BluetoothDevice?, service: AirPodsService,
298304
299305 // an about card- everything but the version number is unknown - will add later if i find out
300306
301- item { Spacer (modifier = Modifier .height(16 .dp)) }
302- item { NavigationButton (" debug" , " Debug" , navController) }
303- item { Spacer (Modifier .height(24 .dp)) }
307+ item(key = " spacer_debug " ) { Spacer (modifier = Modifier .height(16 .dp)) }
308+ item(key = " debug " ) { NavigationButton (" debug" , " Debug" , navController) }
309+ item(key = " spacer_bottom " ) { Spacer (Modifier .height(24 .dp)) }
304310 }
305311 }
306312 else {
0 commit comments