@@ -117,16 +117,17 @@ export default function App() {
117117
118118 const canScan = React . useMemo ( ( ) => (
119119 permissionGranted && bluetoothState === BluetoothState . PoweredOn &&
120- ! autoReconnect . isAttemptingAutoReconnect && ! deviceConnection . isConnecting &&
120+ ! autoReconnect . isAttemptingAutoReconnect && ! autoReconnect . isRetryingConnection &&
121+ ! deviceConnection . isConnecting &&
121122 ! deviceConnection . connectedDeviceId &&
122123 ( autoReconnect . triedAutoReconnectForCurrentId || ! autoReconnect . lastKnownDeviceId )
123- ) , [ permissionGranted , bluetoothState , autoReconnect . isAttemptingAutoReconnect , deviceConnection . isConnecting , deviceConnection . connectedDeviceId , autoReconnect . triedAutoReconnectForCurrentId , autoReconnect . lastKnownDeviceId ] ) ;
124+ ) , [ permissionGranted , bluetoothState , autoReconnect . isAttemptingAutoReconnect , autoReconnect . isRetryingConnection , deviceConnection . isConnecting , deviceConnection . connectedDeviceId , autoReconnect . triedAutoReconnectForCurrentId , autoReconnect . lastKnownDeviceId ] ) ;
124125
125126 const filteredDevices = React . useMemo ( ( ) => {
126127 if ( ! showOnlyOmi ) return scannedDevices ;
127128 return scannedDevices . filter ( d => {
128129 const name = d . name ?. toLowerCase ( ) || '' ;
129- return name . includes ( 'omi' ) || name . includes ( 'friend' ) ;
130+ return name . includes ( 'omi' ) || name . includes ( 'friend' ) || name . includes ( 'neo' ) ;
130131 } ) ;
131132 } , [ scannedDevices , showOnlyOmi ] ) ;
132133
@@ -190,6 +191,21 @@ export default function App() {
190191 < BluetoothStatusBanner bluetoothState = { bluetoothState } isPermissionsLoading = { isPermissionsLoading } permissionGranted = { permissionGranted } onRequestPermission = { requestBluetoothPermission } />
191192 < ScanControls scanning = { scanning } onScanPress = { startScan } onStopScanPress = { stopDeviceScanAction } canScan = { canScan } />
192193
194+ { autoReconnect . isRetryingConnection && (
195+ < View style = { s . retryBanner } >
196+ < ActivityIndicator size = "small" color = { colors . warning } />
197+ < Text style = { s . retryBannerText } >
198+ Reconnecting in { autoReconnect . retryBackoffSeconds } s... (attempt { autoReconnect . connectionRetryCount } )
199+ </ Text >
200+ < TouchableOpacity
201+ style = { [ s . button , { backgroundColor : colors . danger , paddingVertical : 6 , paddingHorizontal : 10 } ] }
202+ onPress = { autoReconnect . handleCancelAutoReconnect }
203+ >
204+ < Text style = { s . buttonText } > Cancel</ Text >
205+ </ TouchableOpacity >
206+ </ View >
207+ ) }
208+
193209 { ! settings . isAuthenticated && (
194210 < View style = { s . authWarning } >
195211 < Text style = { s . authWarningText } > Login is required for advanced backend features. Simple backend can be used without authentication.</ Text >
@@ -201,7 +217,7 @@ export default function App() {
201217 < View style = { s . sectionHeaderWithFilter } >
202218 < Text style = { s . sectionTitle } > Found Devices</ Text >
203219 < View style = { s . filterContainer } >
204- < Text style = { s . filterText } > Show only OMI/Friend</ Text >
220+ < Text style = { s . filterText } > Show only OMI/Friend/Neo </ Text >
205221 < Switch
206222 trackColor = { { false : colors . disabled , true : colors . primary } }
207223 thumbColor = { showOnlyOmi ? colors . warning : colors . card }
@@ -222,7 +238,7 @@ export default function App() {
222238 ) : (
223239 < View style = { s . noDevicesContainer } >
224240 < Text style = { s . noDevicesText } >
225- { showOnlyOmi ? `No OMI/Friend devices found. ${ scannedDevices . length } other device(s) hidden by filter.` : 'No devices found.' }
241+ { showOnlyOmi ? `No OMI/Friend/Neo devices found. ${ scannedDevices . length } other device(s) hidden by filter.` : 'No devices found.' }
226242 </ Text >
227243 </ View >
228244 ) }
@@ -408,6 +424,23 @@ const createStyles = (colors: ThemeColors) => StyleSheet.create({
408424 textAlign : 'center' ,
409425 fontStyle : 'italic' ,
410426 } ,
427+ retryBanner : {
428+ flexDirection : 'row' ,
429+ alignItems : 'center' ,
430+ padding : 12 ,
431+ marginBottom : 15 ,
432+ backgroundColor : colors . card ,
433+ borderRadius : 8 ,
434+ borderWidth : 1 ,
435+ borderColor : colors . warning ,
436+ } ,
437+ retryBannerText : {
438+ flex : 1 ,
439+ marginLeft : 10 ,
440+ fontSize : 14 ,
441+ color : colors . warning ,
442+ fontWeight : '500' ,
443+ } ,
411444 authWarning : {
412445 marginBottom : 20 ,
413446 padding : 15 ,
0 commit comments