diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index dd3bbc2..4ca46b6 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -6,7 +6,6 @@
-
-
diff --git a/app/src/main/java/com/example/smart_watch_android/BLE/BleManager.kt b/app/src/main/java/com/example/smart_watch_android/BLE/BleManager.kt
index 3df932b..7529169 100644
--- a/app/src/main/java/com/example/smart_watch_android/BLE/BleManager.kt
+++ b/app/src/main/java/com/example/smart_watch_android/BLE/BleManager.kt
@@ -14,9 +14,8 @@ import android.os.Build
import android.util.Log
import androidx.annotation.RequiresApi
import androidx.annotation.RequiresPermission
+import androidx.compose.runtime.mutableStateOf
import androidx.core.app.ActivityCompat
-import com.example.smart_watch_android.MainActivity
-import com.example.smart_watch_android.ViewModel
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
@@ -27,15 +26,15 @@ import java.time.format.DateTimeFormatter
import java.util.UUID
import kotlin.time.Duration.Companion.milliseconds
-class BleManager(private val context: Context, val viewModel: ViewModel) {
+class BleManager(private val context: Context) {
//var deviceAddress = "10:BD:A3:8F:01:0E"
- val devices = mutableListOf()
+ var devices = mutableListOf()
+ var isConnected = mutableStateOf(false)
val currentDate: LocalDate? = LocalDate.now()
private val deviceUUIDs = DeviceUUIDs
private var bluetoothGatt: BluetoothGatt? = null
-
private var bluetoothManager: BluetoothManager? = null
private var bluetoothAdapter: BluetoothAdapter? = null
var deviceAddress: String = ""
@@ -47,7 +46,7 @@ class BleManager(private val context: Context, val viewModel: ViewModel) {
Log.d("ESP32_BLE", "Connected! Start discoverServices()...")
gatt.discoverServices()
} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
- viewModel.setDeviceConection(false)
+ isConnected.value = false
gatt.close()
bluetoothGatt = null
@@ -55,14 +54,14 @@ class BleManager(private val context: Context, val viewModel: ViewModel) {
}
} else {
Log.d("ESP32_BLE", "error in onConnectionStateChange! Status-Code: $status")
- viewModel.setDeviceConection(false)
+ isConnected.value = false
}
}
override fun onServicesDiscovered(gatt: BluetoothGatt, status: Int) {
if (status == BluetoothGatt.GATT_SUCCESS) {
- viewModel.setDeviceConection(true)
Log.d("ESP32_BLE", "connected successfully.")
+ isConnected.value = true
}
}
}
@@ -77,6 +76,7 @@ class BleManager(private val context: Context, val viewModel: ViewModel) {
checkAndRequestBluetoothPermissions()
bluetoothManager = context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
bluetoothAdapter = bluetoothManager?.adapter
+ devices = getDeviceList() as MutableList
}
@RequiresPermission(Manifest.permission.BLUETOOTH_CONNECT)
@@ -84,6 +84,7 @@ class BleManager(private val context: Context, val viewModel: ViewModel) {
bluetoothAdapter?.bondedDevices?.forEach { device ->
devices.add(Devices(deviceName = device.name, deviceMac = device.address))
}
+ Log.d("devices","$devices")
return devices
}
@@ -116,7 +117,6 @@ class BleManager(private val context: Context, val viewModel: ViewModel) {
Log.d("ESP32_BLE", "error: Bluetooth is not supported!")
return
}
-
try {
val device = bluetoothAdapter!!.getRemoteDevice(deviceAddress)
diff --git a/app/src/main/java/com/example/smart_watch_android/MainActivity.kt b/app/src/main/java/com/example/smart_watch_android/MainActivity.kt
index 6eb2256..88d1534 100644
--- a/app/src/main/java/com/example/smart_watch_android/MainActivity.kt
+++ b/app/src/main/java/com/example/smart_watch_android/MainActivity.kt
@@ -13,19 +13,19 @@ import androidx.annotation.RequiresPermission
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
+import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import com.example.smart_watch_android.BLE.BleManager
import com.example.smart_watch_android.Screens.AppNavigation
class MainActivity : ComponentActivity() {
lateinit var bleManager: BleManager
- private val viewModel: ViewModel by viewModels()
@RequiresApi(Build.VERSION_CODES.S)
@RequiresPermission(Manifest.permission.BLUETOOTH_CONNECT)
- override fun onCreate(savedInstanceState: Bundle?) {
+ override fun onCreate(savedInstanceState: Bundle?,) {
super.onCreate(savedInstanceState)
- bleManager = BleManager(this, viewModel)
+ bleManager = BleManager(this)
bleManager.init()
enableEdgeToEdge()
setContent {
@@ -34,7 +34,7 @@ class MainActivity : ComponentActivity() {
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
- AppNavigation(bleManager = bleManager, viewModel = viewModel)
+ AppNavigation(bleManager = bleManager)
}
}
}
diff --git a/app/src/main/java/com/example/smart_watch_android/Screens/AppNavigation.kt b/app/src/main/java/com/example/smart_watch_android/Screens/AppNavigation.kt
index 0da8046..42d7701 100644
--- a/app/src/main/java/com/example/smart_watch_android/Screens/AppNavigation.kt
+++ b/app/src/main/java/com/example/smart_watch_android/Screens/AppNavigation.kt
@@ -4,22 +4,17 @@ import android.Manifest
import androidx.annotation.RequiresPermission
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.collectAsState
-import androidx.compose.runtime.getValue
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.example.smart_watch_android.BLE.BleManager
-import com.example.smart_watch_android.ViewModel
@RequiresPermission(Manifest.permission.BLUETOOTH_CONNECT)
@Composable
-fun AppNavigation(bleManager: BleManager, viewModel: ViewModel) {
+fun AppNavigation(bleManager: BleManager) {
val navController = rememberNavController()
- val isConnected by viewModel.isDeviceConnected.collectAsState()
-
- LaunchedEffect(viewModel.isConnected) {
- if (isConnected) {
+ LaunchedEffect(bleManager.isConnected) {
+ if (bleManager.isConnected.value) {
navController.navigate("control_panel") {
popUpTo("connect") { inclusive = true }
}
@@ -29,7 +24,7 @@ fun AppNavigation(bleManager: BleManager, viewModel: ViewModel) {
}
}
}
- val startDestination = if (isConnected) {
+ val startDestination = if (bleManager.isConnected.value) {
"control_panel"
} else {
"connect"
@@ -42,8 +37,7 @@ fun AppNavigation(bleManager: BleManager, viewModel: ViewModel) {
// Connect Screen
composable("connect") {
ConnectScreen(
- bleManager = bleManager,
- viewModel = viewModel
+ bleManager = bleManager
)
}
diff --git a/app/src/main/java/com/example/smart_watch_android/Screens/ConnectScreen.kt b/app/src/main/java/com/example/smart_watch_android/Screens/ConnectScreen.kt
index 485f5e1..9830b90 100644
--- a/app/src/main/java/com/example/smart_watch_android/Screens/ConnectScreen.kt
+++ b/app/src/main/java/com/example/smart_watch_android/Screens/ConnectScreen.kt
@@ -8,7 +8,6 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
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.padding
import androidx.compose.foundation.layout.size
@@ -31,14 +30,12 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.example.smart_watch_android.BLE.BleManager
-import com.example.smart_watch_android.ViewModel
@RequiresPermission(Manifest.permission.BLUETOOTH_CONNECT)
@Composable
-fun ConnectScreen(bleManager: BleManager, viewModel: ViewModel) {
+fun ConnectScreen(bleManager: BleManager) {
var expanded by remember { mutableStateOf(false) }
var selectedDevice by remember { mutableStateOf("device") }
- val devices = bleManager.getDeviceList()
Column(
modifier = Modifier
.fillMaxSize()
@@ -47,6 +44,10 @@ fun ConnectScreen(bleManager: BleManager, viewModel: ViewModel) {
horizontalAlignment = Alignment.CenterHorizontally
)
{
+ Box(
+ modifier = Modifier
+ .padding(16.dp)
+ ) {
Button(
onClick = { expanded = !expanded },
shape = RoundedCornerShape(4.dp),
@@ -56,9 +57,11 @@ fun ConnectScreen(bleManager: BleManager, viewModel: ViewModel) {
}
DropdownMenu(
expanded = expanded,
- onDismissRequest = { expanded = false }
+ onDismissRequest = { expanded = false },
+ modifier = Modifier
+ .width(400.dp)
) {
- devices.forEach { item ->
+ bleManager.devices.forEach { item ->
DropdownMenuItem(
text = { Text(item.deviceName) },
onClick = {
@@ -70,6 +73,9 @@ fun ConnectScreen(bleManager: BleManager, viewModel: ViewModel) {
)
}
}
+ }
+
+
Spacer(modifier = Modifier.height(64.dp))
diff --git a/app/src/main/java/com/example/smart_watch_android/viewModel.kt b/app/src/main/java/com/example/smart_watch_android/viewModel.kt
deleted file mode 100644
index 7b03626..0000000
--- a/app/src/main/java/com/example/smart_watch_android/viewModel.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.example.smart_watch_android
-
-import androidx.lifecycle.ViewModel
-import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.StateFlow
-import kotlinx.coroutines.flow.asStateFlow
-
-class ViewModel : ViewModel() {
- var isConnected = MutableStateFlow(false)
-
- val isDeviceConnected: StateFlow = isConnected.asStateFlow()
-
- fun setDeviceConection(status: Boolean) {
- isConnected.value = status
- }
-}
\ No newline at end of file