diff --git a/.fvmrc b/.fvmrc new file mode 100644 index 0000000..7626778 --- /dev/null +++ b/.fvmrc @@ -0,0 +1,4 @@ +{ + "flutter": "3.10.6", + "flavors": {} +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index b81de3b..f614d93 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.8 + +- Add `cancelLastConnectionProcess` for Android manager + ## 0.0.7 - Log all errors on the Android platform diff --git a/android/src/main/kotlin/com/xenikii/nearby_service/NearbyServiceManager.kt b/android/src/main/kotlin/com/xenikii/nearby_service/NearbyServiceManager.kt index 493107f..370d43d 100644 --- a/android/src/main/kotlin/com/xenikii/nearby_service/NearbyServiceManager.kt +++ b/android/src/main/kotlin/com/xenikii/nearby_service/NearbyServiceManager.kt @@ -203,6 +203,15 @@ class NearbyServiceManager(private var context: Context) { } + fun cancelConnect(result: Result? = null) { + val actionListener = getActionListener( + result, + "Last connection request was cancelled", + "Failed to cancel the last connection process" + ) + wifiManager.cancelConnect(wifiChannel, actionListener) + } + private fun addWifiActions() { intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION) diff --git a/android/src/main/kotlin/com/xenikii/nearby_service/NearbyServicePlugin.kt b/android/src/main/kotlin/com/xenikii/nearby_service/NearbyServicePlugin.kt index 9a9ac65..631d2de 100644 --- a/android/src/main/kotlin/com/xenikii/nearby_service/NearbyServicePlugin.kt +++ b/android/src/main/kotlin/com/xenikii/nearby_service/NearbyServicePlugin.kt @@ -136,6 +136,14 @@ class NearbyServicePlugin : FlutterPlugin, MethodCallHandler, ActivityAware { } } + "cancelConnect" -> { + try { + manager.cancelConnect(result) + } catch (e: Exception) { + onError(result, e) + } + } + else -> { result.notImplemented() } diff --git a/example_full/lib/domain/app_service.dart b/example_full/lib/domain/app_service.dart index e098e46..65b10f7 100644 --- a/example_full/lib/domain/app_service.dart +++ b/example_full/lib/domain/app_service.dart @@ -135,6 +135,10 @@ class AppService extends ChangeNotifier { Future stopDiscovery() async { try { + final hasRunning = await hasRunningJobs(); + if (hasRunning) { + await cancelConnect(); + } final result = await _nearbyService.stopDiscovery(); if (result) { updateState(AppState.readyToDiscover); @@ -170,6 +174,17 @@ class AppService extends ChangeNotifier { notifyListeners(); } + Future cancelConnect() async { + try { + await _nearbyService.android?.cancelLastConnectionProcess(); + } on NearbyServiceBusyException catch (_) { + _logBusyException(); + } catch (e, s) { + _log(e, s); + } + notifyListeners(); + } + Future stopListeningAll() async { await endCommunicationChannel(); await stopListeningConnectedDevice(); diff --git a/example_full/lib/presentation/components/device_preview.dart b/example_full/lib/presentation/components/device_preview.dart index a1657d6..d2c0a38 100644 --- a/example_full/lib/presentation/components/device_preview.dart +++ b/example_full/lib/presentation/components/device_preview.dart @@ -57,7 +57,7 @@ class DevicePreview extends StatelessWidget { ), ); - final disconnectButton = device.status.isConnected + final trailingButton = device.status.isConnected ? TextButton( onPressed: () => context.read().disconnect(device), style: TextButton.styleFrom( @@ -75,10 +75,10 @@ class DevicePreview extends StatelessWidget { name, const SizedBox(height: 5), id, - if (disconnectButton != null) + if (trailingButton != null) Padding( padding: const EdgeInsets.only(top: 10), - child: disconnectButton, + child: trailingButton, ), ], ); @@ -86,7 +86,9 @@ class DevicePreview extends StatelessWidget { return InkWell( borderRadius: BorderRadius.circular(12), onTap: () { - if (!device.status.isConnected) { + if (device.status.isConnecting) { + context.read().cancelConnect(); + } else if (!device.status.isConnected) { context.read().connect(device); } else { context.read().startListeningConnectedDevice(device); @@ -115,7 +117,11 @@ class DevicePreview extends StatelessWidget { ), Flexible( child: Text( - device.status.isConnected ? 'Tap to chat' : 'Tap to connect', + device.status.isConnected + ? 'Tap to chat' + : device.status.isConnecting + ? 'Tap to cancel connection' + : 'Tap to connect', style: const TextStyle(color: kGreenColor, fontSize: 12), textAlign: TextAlign.center, ), diff --git a/ios/Classes/NearbyManager.swift b/ios/Classes/NearbyManager.swift index 8a61c80..52f2096 100644 --- a/ios/Classes/NearbyManager.swift +++ b/ios/Classes/NearbyManager.swift @@ -173,7 +173,6 @@ extension NearbyManager: MCNearbyServiceAdvertiserDelegate { self.invitationHandlers[peerID.displayName] = invitationHandler } - } extension NearbyManager: MCNearbyServiceBrowserDelegate { diff --git a/lib/src/platforms/android/nearby_android_service.dart b/lib/src/platforms/android/nearby_android_service.dart index ab4fabd..7a48cc6 100644 --- a/lib/src/platforms/android/nearby_android_service.dart +++ b/lib/src/platforms/android/nearby_android_service.dart @@ -69,6 +69,16 @@ class NearbyAndroidService extends NearbyService { return NearbyServiceAndroidPlatform.instance.disconnect(); } + /// + /// On [NearbyServiceBusyException] you can check for running jobs + /// (if any of devices has [NearbyDeviceStatus.connecting]). + /// + /// If so, call [cancelLastConnectionProcess] to cancel last request + /// + Future cancelLastConnectionProcess() { + return NearbyServiceAndroidPlatform.instance.cancelConnect(); + } + /// /// Starts a socket service to transfer data. Uses device with /// [NearbyCommunicationChannelData.connectedDeviceId]. diff --git a/lib/src/platforms/android/nearby_service_android_interface.dart b/lib/src/platforms/android/nearby_service_android_interface.dart index 48cd98d..b900986 100644 --- a/lib/src/platforms/android/nearby_service_android_interface.dart +++ b/lib/src/platforms/android/nearby_service_android_interface.dart @@ -55,6 +55,10 @@ abstract class NearbyServiceAndroidPlatform extends PlatformInterface { throw UnimplementedError('disconnect() has not been implemented.'); } + Future cancelConnect() { + throw UnimplementedError('cancelConnect() has not been implemented.'); + } + Stream getConnectionInfoStream() { throw UnimplementedError( 'getConnectionInfoStream() has not been implemented.', diff --git a/lib/src/platforms/android/nearby_service_android_method_channel.dart b/lib/src/platforms/android/nearby_service_android_method_channel.dart index 2d9dc22..921da14 100644 --- a/lib/src/platforms/android/nearby_service_android_method_channel.dart +++ b/lib/src/platforms/android/nearby_service_android_method_channel.dart @@ -66,6 +66,12 @@ class MethodChannelAndroidNearbyService extends NearbyServiceAndroidPlatform { return _handleBooleanResult(result); } + @override + Future cancelConnect() async { + final result = await methodChannel.invokeMethod("cancelConnect"); + return _handleBooleanResult(result); + } + @override Stream getConnectionInfoStream() { const connectedDeviceChannel = EventChannel( diff --git a/pubspec.yaml b/pubspec.yaml index 9123822..cae9f79 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: nearby_service description: Nearby Service Flutter Plugin is used to create connections in a P2P network. Supports sending text messages and files. -version: 0.0.7 +version: 0.0.8 homepage: https://github.com/ksenia312/nearby_service repository: https://github.com/ksenia312/nearby_service