feat: add bluetooth handle and listen for status

This commit is contained in:
Fritz Heiden 2024-12-15 11:24:18 +01:00
parent 421b1719be
commit cb93718491
3 changed files with 53 additions and 23 deletions

View File

@ -5,25 +5,55 @@ import android.bluetooth.BluetoothManager
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.app.Activity import android.app.Activity
import android.content.BroadcastReceiver
import android.content.IntentFilter
import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.ActivityResultLauncher
import androidx.core.app.ComponentActivity import androidx.core.app.ComponentActivity
import androidx.core.content.ContextCompat.getSystemService import androidx.core.content.ContextCompat.getSystemService
object BluetoothService { class BluetoothService(private val context: Context) {
private lateinit var bluetoothManager: BluetoothManager; private var bluetoothManager: BluetoothManager =
private var bluetoothAdapter: BluetoothAdapter? = null; getSystemService(context, BluetoothManager::class.java)!!;
private var bluetoothAdapter: BluetoothAdapter = bluetoothManager.adapter
private var bluetoothStateReceiver: BroadcastReceiver? = null
fun init(context: Context) { init {
bluetoothManager = getSystemService(context, BluetoothManager::class.java)!! registerBluetoothStateReceiver()
bluetoothAdapter = bluetoothManager.adapter
if (bluetoothAdapter == null) {
throw Exception("Bluetooth not supported on this device")
}
} }
fun isEnabled(): Boolean { fun isEnabled(): Boolean {
return bluetoothAdapter?.isEnabled?: false return bluetoothAdapter.isEnabled ?: false
} }
private fun registerBluetoothStateReceiver() {
bluetoothStateReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR)
when (state) {
BluetoothAdapter.STATE_ON -> {
// Handle Bluetooth turned on
println("SIGNAL: Bluetooth is enabled")
}
BluetoothAdapter.STATE_OFF -> {
// Handle Bluetooth turned off
println("SIGNAL: Bluetooth is disabled")
}
BluetoothAdapter.STATE_TURNING_ON -> {
// Handle Bluetooth turning on
println("SIGNAL: Bluetooth is turning on")
}
BluetoothAdapter.STATE_TURNING_OFF -> {
// Handle Bluetooth turning off
println("SIGNAL: Bluetooth is turning off")
}
}
}
}
context.registerReceiver(bluetoothStateReceiver, IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED))
}
fun cleanUp() {
context.unregisterReceiver(bluetoothStateReceiver)
}
} }

View File

@ -33,9 +33,11 @@ import com.example.tvcontroller.ui.AppViewModel
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
private lateinit var bluetoothService: BluetoothService
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
BluetoothService.init(this) bluetoothService = BluetoothService(this.applicationContext)
enableEdgeToEdge() enableEdgeToEdge()
setContent { setContent {
TVControllerTheme { TVControllerTheme {
@ -43,6 +45,11 @@ class MainActivity : ComponentActivity() {
} }
} }
} }
override fun onDestroy() {
super.onDestroy()
bluetoothService.cleanUp()
}
} }
@Composable @Composable
@ -50,7 +57,6 @@ fun TvControllerApp(
navController: NavHostController = rememberNavController(), navController: NavHostController = rememberNavController(),
appViewModel: AppViewModel = viewModel() appViewModel: AppViewModel = viewModel()
) { ) {
val appUiState by appViewModel.uiState.collectAsState();
val backStackEntry by navController.currentBackStackEntryAsState() val backStackEntry by navController.currentBackStackEntryAsState()
val currentScreen = Screen.valueOf(backStackEntry?.destination?.route ?: Screen.Camera.name) val currentScreen = Screen.valueOf(backStackEntry?.destination?.route ?: Screen.Camera.name)
val baselineCamera24 = painterResource(R.drawable.baseline_camera_24) val baselineCamera24 = painterResource(R.drawable.baseline_camera_24)

View File

@ -1,19 +1,13 @@
package com.example.tvcontroller.ui package com.example.tvcontroller.ui
import android.content.Context
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import com.example.tvcontroller.BluetoothService
import com.example.tvcontroller.Screen import com.example.tvcontroller.Screen
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update import kotlinx.coroutines.flow.update
class AppViewModel : ViewModel() { class AppViewModel(private val bluetoothService: BluetoothService) : ViewModel() {
private val _uiState = MutableStateFlow(AppUiState())
val uiState: StateFlow<AppUiState> = _uiState.asStateFlow()
fun updateScreen(screen: Screen) {
if (uiState.value.currentScreen == screen) return
val newUiState = uiState.value.copy(currentScreen = screen)
_uiState.update { newUiState }
}
} }