@@ -6,12 +6,17 @@ import android.hardware.usb.UsbManager
66import com.hoho.android.usbserial.driver.ProbeTable
77import com.hoho.android.usbserial.driver.UsbSerialDriver
88import com.hoho.android.usbserial.driver.UsbSerialProber
9+ import kotlinx.coroutines.CoroutineScope
10+ import kotlinx.coroutines.Dispatchers
11+ import kotlinx.coroutines.SupervisorJob
12+ import kotlinx.coroutines.cancel
913import kotlinx.coroutines.flow.Flow
1014import kotlinx.coroutines.flow.MutableStateFlow
1115import kotlinx.coroutines.flow.StateFlow
1216import kotlinx.coroutines.flow.asStateFlow
1317import kotlinx.coroutines.flow.first
1418import kotlinx.coroutines.launch
19+ import kotlinx.coroutines.withContext
1520import timber.log.Timber
1621
1722/* *
@@ -42,7 +47,7 @@ class SerialConnectionFactory(context: Context)
4247
4348 private val usbManager = context.getSystemService(Context .USB_SERVICE ) as UsbManager
4449 private val permissionManager = USBPermissionManager (context)
45-
50+ private val connectionScope = CoroutineScope ( Dispatchers . Main + SupervisorJob ())
4651 private val _connectionState = MutableStateFlow <ConnectionState >(ConnectionState .Disconnected )
4752 val connectionState: StateFlow <ConnectionState > = _connectionState .asStateFlow()
4853
@@ -67,45 +72,48 @@ class SerialConnectionFactory(context: Context)
6772 parity : Int = DEFAULT_PARITY
6873 )
6974 {
70- // Prevent multiple simultaneous connection attempts
71- if (_connectionState .value != ConnectionState .Disconnected )
75+ // Check current state
76+ val currentState = _connectionState .value
77+ if (currentState !is ConnectionState .Disconnected && currentState !is ConnectionState .Error )
7278 {
73- Timber .w(" Connection already in progress, ignoring new request" )
79+ Timber .w(" Connection already in progress (state: $currentState ) , ignoring new request" )
7480 return
7581 }
7682
77- // Start connection process
78- kotlinx.coroutines.GlobalScope .launch {
83+ connectionScope.launch {
7984 try
8085 {
81- Timber .d(" Requesting USB permission for ${device.deviceName} " )
86+ Timber .d(" 🔵 Requesting USB permission for ${device.deviceName} " )
8287 _connectionState .value = ConnectionState .RequestingPermission
8388
84- // Request permission and wait for result
85- val permissionResult = permissionManager.requestPermissionFor(device).first()
89+ // Switch to IO for permission request
90+ val permissionResult = withContext(Dispatchers .IO ) {
91+ permissionManager.requestPermissionFor(device).first()
92+ }
8693
87- Timber .d(" Permission result received : $permissionResult " )
94+ Timber .d(" 🔵 Permission result: $permissionResult " )
8895
8996 when (permissionResult)
9097 {
9198 is USBPermissionManager .PermissionResult .Granted -> {
92- Timber .d(" Permission granted , connecting to device ..." )
99+ Timber .d(" 🟢 Permission GRANTED , connecting..." )
93100 _connectionState .value = ConnectionState .Connecting
94101
95- // Create the serial connection
96- val connection = createSerialConnection(device, baudRate, dataBits, stopBits, parity)
102+ val connection = withContext(Dispatchers .IO ) {
103+ createSerialConnection(device, baudRate, dataBits, stopBits, parity)
104+ }
97105
98- Timber .d(" Serial connection established successfully " )
106+ Timber .d(" 🟢 Serial connection established" )
99107 _connectionState .value = ConnectionState .Connected (connection)
100108 }
101109
102110 is USBPermissionManager .PermissionResult .Denied -> {
103- Timber .w(" USB permission denied by user " )
111+ Timber .w(" 🔴 USB permission DENIED " )
104112 _connectionState .value = ConnectionState .Error (" USB permission denied by user" )
105113 }
106114
107115 is USBPermissionManager .PermissionResult .Error -> {
108- Timber .e(" Permission request failed : ${permissionResult.message} " )
116+ Timber .e(" 🔴 Permission error : ${permissionResult.message} " )
109117 _connectionState .value = ConnectionState .Error (
110118 " Permission request failed: ${permissionResult.message} "
111119 )
@@ -114,7 +122,7 @@ class SerialConnectionFactory(context: Context)
114122 }
115123 catch (e: Exception )
116124 {
117- Timber .e(e, " Failed to create connection " )
125+ Timber .e(e, " 🔴 Connection failed " )
118126 _connectionState .value = ConnectionState .Error (
119127 " Failed to create connection: ${e.message} " ,
120128 e
@@ -218,6 +226,8 @@ class SerialConnectionFactory(context: Context)
218226 {
219227 currentState.connection.close()
220228 }
229+
230+ connectionScope.cancel()
221231 _connectionState .value = ConnectionState .Disconnected
222232 }
223233
0 commit comments