diff --git a/android/app/src/main/java/me/kavishdevar/librepods/presentation/screens/AirPodsSettingsScreen.kt b/android/app/src/main/java/me/kavishdevar/librepods/presentation/screens/AirPodsSettingsScreen.kt index 65a4e6f..08b9b2c 100644 --- a/android/app/src/main/java/me/kavishdevar/librepods/presentation/screens/AirPodsSettingsScreen.kt +++ b/android/app/src/main/java/me/kavishdevar/librepods/presentation/screens/AirPodsSettingsScreen.kt @@ -32,6 +32,7 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.shape.RoundedCornerShape @@ -430,6 +431,30 @@ fun AirPodsSettingsScreen(viewModel: AirPodsViewModel, navController: NavControl ) } + item(key = "spacer_disconnect") { Spacer(modifier = Modifier.height(28.dp)) } + item(key = "disconnect_button") { + StyledButton( + onClick = viewModel::disconnect, + backdrop = rememberLayerBackdrop(), + isInteractive = false, + modifier = Modifier + .fillMaxWidth() + .heightIn(min = 56.dp) + ) { + Text( + text = stringResource(R.string.disconnect), + style = TextStyle( + fontSize = 16.sp, + fontWeight = FontWeight.Normal, + color = if (isSystemInDarkTheme()) Color(0xFF0091FF) else Color(0xFF0088FF), + fontFamily = FontFamily(Font(R.font.sf_pro)) + ), + textAlign = TextAlign.Start, + modifier = Modifier.fillMaxWidth() + ) + } + } + // item(key = "spacer_debug") { Spacer(modifier = Modifier.height(16.dp)) } // item(key = "debug") { NavigationButton("debug", "Debug", navController) } item(key = "spacer_bottom") { Spacer(Modifier.height(bottomPadding)) } diff --git a/android/app/src/main/java/me/kavishdevar/librepods/presentation/viewmodel/AirPodsViewModel.kt b/android/app/src/main/java/me/kavishdevar/librepods/presentation/viewmodel/AirPodsViewModel.kt index f849ca8..52e8fe3 100644 --- a/android/app/src/main/java/me/kavishdevar/librepods/presentation/viewmodel/AirPodsViewModel.kt +++ b/android/app/src/main/java/me/kavishdevar/librepods/presentation/viewmodel/AirPodsViewModel.kt @@ -23,6 +23,8 @@ import android.content.Context import android.content.Intent import android.content.IntentFilter import android.content.SharedPreferences +import android.content.pm.PackageManager +import android.widget.Toast import androidx.core.content.edit import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -529,7 +531,7 @@ class AirPodsViewModel( actualModel = fakeInstance.actualModelNumber, serialNumbers = listOf("DEMO", "DEMO", "DEMO"), version3 = "Demo Firmware", -// isPremium = true + isPremium = true ) } } @@ -540,5 +542,9 @@ class AirPodsViewModel( fun disconnect() { service.disconnectAirPods() + if (appContext.checkSelfPermission("android.permission.BLUETOOTH_PRIVILEGED") != PackageManager.PERMISSION_GRANTED) { + Toast.makeText(appContext, "App has disconnected, disconnect from Android Settings.", + Toast.LENGTH_LONG).show() + } } } diff --git a/android/app/src/main/java/me/kavishdevar/librepods/services/AirPodsService.kt b/android/app/src/main/java/me/kavishdevar/librepods/services/AirPodsService.kt index b59ebeb..34b2b2e 100644 --- a/android/app/src/main/java/me/kavishdevar/librepods/services/AirPodsService.kt +++ b/android/app/src/main/java/me/kavishdevar/librepods/services/AirPodsService.kt @@ -3020,21 +3020,26 @@ class AirPodsService : Service(), SharedPreferences.OnSharedPreferenceChangeList override fun onServiceDisconnected(profile: Int) {} }, BluetoothProfile.A2DP) - } else { - Log.d(TAG, "not connecting A2DP, no BLUETOOTH_PRIVILEGED permission") - } - if (checkSelfPermission("android.permission.MODIFY_PHONE_STATE") == PackageManager.PERMISSION_GRANTED) { + bluetoothAdapter?.getProfileProxy(context, object : BluetoothProfile.ServiceListener { override fun onServiceConnected(profile: Int, proxy: BluetoothProfile) { if (profile == BluetoothProfile.HEADSET) { try { - val policyMethod = proxy.javaClass.getMethod( - "setConnectionPolicy", - BluetoothDevice::class.java, - Int::class.java - ) - Log.d(TAG, "calling HEADSET.setConnectionPolicy for ${device?.address} to 100") - policyMethod.invoke(proxy, device, 100) + if (checkSelfPermission("android.permission.MODIFY_PHONE_STATE") == PackageManager.PERMISSION_GRANTED) { + + val policyMethod = proxy.javaClass.getMethod( + "setConnectionPolicy", + BluetoothDevice::class.java, + Int::class.java + ) + Log.d( + TAG, + "calling HEADSET.setConnectionPolicy for ${device?.address} to 100" + ) + policyMethod.invoke(proxy, device, 100) + } else { + Log.d(TAG, "not setting connection policy for HEADSET, no MODIFIY_PHONE_STATE permission") + } val connectMethod = proxy.javaClass.getMethod("connect", BluetoothDevice::class.java) connectMethod.invoke(proxy, device)