From cd3128c24b736e919408d6cc3c98ad6c55bcd4fd Mon Sep 17 00:00:00 2001 From: Nedifinita Date: Sat, 26 Jul 2025 17:08:08 +0800 Subject: [PATCH] feat: add option for automatically connecting to Bluetooth devices --- .../org/noxylva/lbjconsole/MainActivity.kt | 25 ++++++++++++++--- .../lbjconsole/ui/screens/SettingsScreen.kt | 27 ++++++++++++++++++- 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/noxylva/lbjconsole/MainActivity.kt b/app/src/main/java/org/noxylva/lbjconsole/MainActivity.kt index 82a972b..d8719e1 100644 --- a/app/src/main/java/org/noxylva/lbjconsole/MainActivity.kt +++ b/app/src/main/java/org/noxylva/lbjconsole/MainActivity.kt @@ -117,6 +117,7 @@ class MainActivity : ComponentActivity() { private var specifiedDeviceAddress by mutableStateOf(null) private var searchOrderList by mutableStateOf(listOf()) private var showDisconnectButton by mutableStateOf(false) + private var autoConnectEnabled by mutableStateOf(true) private val settingsPrefs by lazy { getSharedPreferences("app_settings", Context.MODE_PRIVATE) } @@ -313,6 +314,12 @@ class MainActivity : ComponentActivity() { saveSettings() Log.d(TAG, "Set specified device address: $address") }, + autoConnectEnabled = autoConnectEnabled, + onAutoConnectEnabledChange = { enabled -> + autoConnectEnabled = enabled + saveSettings() + Log.d(TAG, "Auto connect enabled: $enabled") + }, latestRecord = latestRecord, @@ -615,6 +622,11 @@ class MainActivity : ComponentActivity() { private fun startAutoScanAndConnect() { + if (!autoConnectEnabled) { + Log.d(TAG, "Auto connect disabled, skipping auto scan") + return + } + Log.d(TAG, "Starting auto scan and connect") if (!hasBluetoothPermissions()) { @@ -774,9 +786,11 @@ class MainActivity : ComponentActivity() { searchOrderStr.split(",").filter { it.isNotBlank() } } + autoConnectEnabled = settingsPrefs.getBoolean("auto_connect_enabled", true) + bleClient.setSpecifiedDeviceAddress(specifiedDeviceAddress) - Log.d(TAG, "Loaded settings deviceName=${settingsDeviceName} tab=${currentTab} specifiedDevice=${specifiedDeviceAddress} searchOrder=${searchOrderList.size}") + Log.d(TAG, "Loaded settings deviceName=${settingsDeviceName} tab=${currentTab} specifiedDevice=${specifiedDeviceAddress} searchOrder=${searchOrderList.size} autoConnect=${autoConnectEnabled}") } @@ -794,6 +808,7 @@ class MainActivity : ComponentActivity() { .putBoolean("map_railway_visible", mapRailwayLayerVisible) .putString("specified_device_address", specifiedDeviceAddress) .putString("search_order_list", searchOrderList.joinToString(",")) + .putBoolean("auto_connect_enabled", autoConnectEnabled) mapCenterPosition?.let { (lat, lon) -> editor.putFloat("map_center_lat", lat.toFloat()) @@ -810,7 +825,7 @@ class MainActivity : ComponentActivity() { bleClient.setHighFrequencyReconnect(true) - if (hasBluetoothPermissions() && !bleClient.isConnected()) { + if (hasBluetoothPermissions() && !bleClient.isConnected() && autoConnectEnabled) { Log.d(TAG, "App resumed and not connected, starting auto scan") startAutoScanAndConnect() } else if (bleClient.isConnected()) { @@ -847,6 +862,8 @@ fun MainContent( specifiedDeviceAddress: String?, searchOrderList: List, onSpecifiedDeviceSelected: (String?) -> Unit, + autoConnectEnabled: Boolean, + onAutoConnectEnabledChange: (Boolean) -> Unit, latestRecord: TrainRecord?, @@ -1118,7 +1135,9 @@ fun MainContent( onScrollPositionChange = onSettingsScrollPositionChange, specifiedDeviceAddress = specifiedDeviceAddress, searchOrderList = searchOrderList, - onSpecifiedDeviceSelected = onSpecifiedDeviceSelected + onSpecifiedDeviceSelected = onSpecifiedDeviceSelected, + autoConnectEnabled = autoConnectEnabled, + onAutoConnectEnabledChange = onAutoConnectEnabledChange ) 3 -> MapScreen( records = if (allRecords.isNotEmpty()) { diff --git a/app/src/main/java/org/noxylva/lbjconsole/ui/screens/SettingsScreen.kt b/app/src/main/java/org/noxylva/lbjconsole/ui/screens/SettingsScreen.kt index 7d592ad..506cedc 100644 --- a/app/src/main/java/org/noxylva/lbjconsole/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/org/noxylva/lbjconsole/ui/screens/SettingsScreen.kt @@ -38,7 +38,9 @@ fun SettingsScreen( onScrollPositionChange: (Int) -> Unit = {}, specifiedDeviceAddress: String? = null, searchOrderList: List = emptyList(), - onSpecifiedDeviceSelected: (String?) -> Unit = {} + onSpecifiedDeviceSelected: (String?) -> Unit = {}, + autoConnectEnabled: Boolean = true, + onAutoConnectEnabledChange: (Boolean) -> Unit = {} ) { val uriHandler = LocalUriHandler.current val scrollState = rememberScrollState() @@ -262,6 +264,29 @@ fun SettingsScreen( } ) } + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Column { + Text( + "自动连接", + style = MaterialTheme.typography.bodyMedium, + fontWeight = FontWeight.Medium + ) + Text( + "自动连接蓝牙设备", + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + Switch( + checked = autoConnectEnabled, + onCheckedChange = onAutoConnectEnabledChange + ) + } } }