diff --git a/example/lib/main.dart b/example/lib/main.dart index 4eb4229..06d2504 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -2,6 +2,8 @@ import 'dart:io'; import 'dart:math'; import 'dart:typed_data'; +import 'package:flutter_udid/flutter_udid.dart'; + import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; import 'package:nearby_connections/nearby_connections.dart'; @@ -33,14 +35,88 @@ class Body extends StatefulWidget { } class _MyBodyState extends State { - final String userName = Random().nextInt(10000).toString(); + @override + void initState() { + super.initState(); + WidgetsBinding.instance!.addPostFrameCallback((_) { + // _userName = await FlutterUdid.consistentUdid; + startAdver(); + startDisco(); + }); + } + + final String userName = + "00000 11111 22222 33333 44444 55555 66666 77777 88888 99999 aaaaa bbbbb ccccc ddddd eeeee"; // Random().nextInt(10000).toString(); final Strategy strategy = Strategy.P2P_STAR; Map endpointMap = Map(); - + static String _userName = ""; File? tempFile; //reference to the file currently being transferred Map map = Map(); //store filename mapped to corresponding payloadId + void startAdver() async { + try { + bool a = await Nearby().startAdvertising( + "adv" + userName, + strategy, + onConnectionInitiated: discoverOnConnectionInit, + onConnectionResult: (id, status) { + print("userName = $userName"); + print("id = $id"); + showSnackbar(status); + }, + onDisconnected: (id) { + showSnackbar( + "Disconnected: ${endpointMap[id]!.endpointName}, id $id"); + setState(() { + endpointMap.remove(id); + }); + }, + ); + showSnackbar("ADVERTISING: " + a.toString()); + } catch (exception) { + showSnackbar(exception); + } + } + + void startDisco() async { + try { + bool a = await Nearby().startDiscovery( + "dis" + userName, + strategy, + onEndpointFound: (id, name, serviceId) { + print("userName = $userName"); + print("id = $id"); + + Nearby().requestConnection( + userName, + id, + onConnectionInitiated: (id, info) { + discoverOnConnectionInit(id, info); + }, + onConnectionResult: (id, status) { + showSnackbar(status); + }, + onDisconnected: (id) { + setState(() { + endpointMap.remove(id); + }); + showSnackbar( + "Disconnected from: ${endpointMap[id]!.endpointName}, id $id"); + }, + ); + }, + onEndpointLost: (id) { + showSnackbar( + "Lost discovered Endpoint: ${endpointMap[id]!.endpointName}, id $id"); + }, + ); + showSnackbar("DISCOVERING: " + a.toString()); + } catch (e) { + showSnackbar(e); + } + } + @override Widget build(BuildContext context) { return Center( @@ -48,117 +124,34 @@ class _MyBodyState extends State { padding: const EdgeInsets.all(8.0), child: ListView( children: [ - Text( - "Permissions", - ), - Wrap( - children: [ - ElevatedButton( - child: Text("checkLocationPermission"), - onPressed: () async { - if (await Nearby().checkLocationPermission()) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text("Location permissions granted :)"))); - } else { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: - Text("Location permissions not granted :("))); - } - }, - ), - ElevatedButton( - child: Text("askLocationPermission"), - onPressed: () async { - if (await Nearby().askLocationPermission()) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text("Location Permission granted :)"))); - } else { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: - Text("Location permissions not granted :("))); - } - }, - ), - ElevatedButton( - child: Text("checkExternalStoragePermission"), - onPressed: () async { - if (await Nearby().checkExternalStoragePermission()) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: - Text("External Storage permissions granted :)"))); - } else { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text( - "External Storage permissions not granted :("))); - } - }, - ), - ElevatedButton( - child: Text("askExternalStoragePermission"), - onPressed: () { - Nearby().askExternalStoragePermission(); - }, - ), - ], - ), - Divider(), - Text("Location Enabled"), - Wrap( - children: [ - ElevatedButton( - child: Text("checkLocationEnabled"), - onPressed: () async { - if (await Nearby().checkLocationEnabled()) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text("Location is ON :)"))); - } else { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text("Location is OFF :("))); - } - }, - ), - ElevatedButton( - child: Text("enableLocationServices"), - onPressed: () async { - if (await Nearby().enableLocationServices()) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text("Location Service Enabled :)"))); - } else { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: - Text("Enabling Location Service Failed :("))); - } - }, - ), - ], - ), - Divider(), Text("User Name: " + userName), Wrap( children: [ ElevatedButton( child: Text("Start Advertising"), onPressed: () async { - try { - bool a = await Nearby().startAdvertising( - userName, - strategy, - onConnectionInitiated: onConnectionInit, - onConnectionResult: (id, status) { - showSnackbar(status); - }, - onDisconnected: (id) { - showSnackbar( - "Disconnected: ${endpointMap[id]!.endpointName}, id $id"); - setState(() { - endpointMap.remove(id); - }); - }, - ); - showSnackbar("ADVERTISING: " + a.toString()); - } catch (exception) { - showSnackbar(exception); - } + // try { + // bool a = await Nearby().startAdvertising( + // "adv" + userName, + // strategy, + // onConnectionInitiated: discoverOnConnectionInit, + // onConnectionResult: (id, status) { + // print("userName = $userName"); + // print("id = $id"); + // showSnackbar(status); + // }, + // onDisconnected: (id) { + // showSnackbar( + // "Disconnected: ${endpointMap[id]!.endpointName}, id $id"); + // setState(() { + // endpointMap.remove(id); + // }); + // }, + // ); + // showSnackbar("ADVERTISING: " + a.toString()); + // } catch (exception) { + // showSnackbar(exception); + // } }, ), ElevatedButton( @@ -176,45 +169,27 @@ class _MyBodyState extends State { onPressed: () async { try { bool a = await Nearby().startDiscovery( - userName, + "dis" + userName, strategy, onEndpointFound: (id, name, serviceId) { - // show sheet automatically to request connection - showModalBottomSheet( - context: context, - builder: (builder) { - return Center( - child: Column( - children: [ - Text("id: " + id), - Text("Name: " + name), - Text("ServiceId: " + serviceId), - ElevatedButton( - child: Text("Request Connection"), - onPressed: () { - Navigator.pop(context); - Nearby().requestConnection( - userName, - id, - onConnectionInitiated: (id, info) { - onConnectionInit(id, info); - }, - onConnectionResult: (id, status) { - showSnackbar(status); - }, - onDisconnected: (id) { - setState(() { - endpointMap.remove(id); - }); - showSnackbar( - "Disconnected from: ${endpointMap[id]!.endpointName}, id $id"); - }, - ); - }, - ), - ], - ), - ); + print("userName = $userName"); + print("id = $id"); + + Nearby().requestConnection( + userName, + id, + onConnectionInitiated: (id, info) { + discoverOnConnectionInit(id, info); + }, + onConnectionResult: (id, status) { + showSnackbar(status); + }, + onDisconnected: (id) { + setState(() { + endpointMap.remove(id); + }); + showSnackbar( + "Disconnected from: ${endpointMap[id]!.endpointName}, id $id"); }, ); }, @@ -255,7 +230,8 @@ class _MyBodyState extends State { child: Text("Send Random Bytes Payload"), onPressed: () async { endpointMap.forEach((key, value) { - String a = Random().nextInt(100).toString(); + String a = + "00000 11111 22222 33333 44444 55555 66666 77777 88888 99999 aaaaa bbbbb ccccc ddddd eeeee"; //Random().nextInt(100).toString(); showSnackbar("Sending $a to ${value.endpointName}, id: $key"); Nearby() @@ -297,95 +273,64 @@ class _MyBodyState extends State { /// Called upon Connection request (on both devices) /// Both need to accept connection to start sending/receiving - void onConnectionInit(String id, ConnectionInfo info) { - showModalBottomSheet( - context: context, - builder: (builder) { - return Center( - child: Column( - children: [ - Text("id: " + id), - Text("Token: " + info.authenticationToken), - Text("Name" + info.endpointName), - Text("Incoming: " + info.isIncomingConnection.toString()), - ElevatedButton( - child: Text("Accept Connection"), - onPressed: () { - Navigator.pop(context); - setState(() { - endpointMap[id] = info; - }); - Nearby().acceptConnection( - id, - onPayLoadRecieved: (endid, payload) async { - if (payload.type == PayloadType.BYTES) { - String str = String.fromCharCodes(payload.bytes!); - showSnackbar(endid + ": " + str); + void discoverOnConnectionInit(String id, ConnectionInfo info) { + setState(() { + endpointMap[id] = info; + }); + Nearby().acceptConnection( + id, + onPayLoadRecieved: (endid, payload) async { + print(payload); + if (payload.type == PayloadType.BYTES) { + String str = String.fromCharCodes(payload.bytes!); + showSnackbar(endid + ": " + str); - if (str.contains(':')) { - // used for file payload as file payload is mapped as - // payloadId:filename - int payloadId = int.parse(str.split(':')[0]); - String fileName = (str.split(':')[1]); + if (str.contains(':')) { + // used for file payload as file payload is mapped as + // payloadId:filename + int payloadId = int.parse(str.split(':')[0]); + String fileName = (str.split(':')[1]); - if (map.containsKey(payloadId)) { - if (await tempFile!.exists()) { - tempFile!.rename( - tempFile!.parent.path + "/" + fileName); - } else { - showSnackbar("File doesn't exist"); - } - } else { - //add to map if not already - map[payloadId] = fileName; - } - } - } else if (payload.type == PayloadType.FILE) { - showSnackbar(endid + ": File transfer started"); - tempFile = File(payload.filePath!); - } - }, - onPayloadTransferUpdate: (endid, payloadTransferUpdate) { - if (payloadTransferUpdate.status == - PayloadStatus.IN_PROGRESS) { - print(payloadTransferUpdate.bytesTransferred); - } else if (payloadTransferUpdate.status == - PayloadStatus.FAILURE) { - print("failed"); - showSnackbar(endid + ": FAILED to transfer file"); - } else if (payloadTransferUpdate.status == - PayloadStatus.SUCCESS) { - showSnackbar( - "$endid success, total bytes = ${payloadTransferUpdate.totalBytes}"); + if (map.containsKey(payloadId)) { + if (await tempFile!.exists()) { + tempFile!.rename(tempFile!.parent.path + "/" + fileName); + } else { + showSnackbar("File doesn't exist"); + } + } else { + //add to map if not already + map[payloadId] = fileName; + } + } + } else if (payload.type == PayloadType.FILE) { + showSnackbar(endid + ": File transfer started"); + tempFile = File(payload.filePath!); + } + }, + onPayloadTransferUpdate: (endid, payloadTransferUpdate) { + if (payloadTransferUpdate.status == PayloadStatus.IN_PROGRESS) { + print(payloadTransferUpdate.bytesTransferred); + } else if (payloadTransferUpdate.status == PayloadStatus.FAILURE) { + print("failed"); + showSnackbar(endid + ": FAILED to transfer file"); + } else if (payloadTransferUpdate.status == PayloadStatus.SUCCESS) { + showSnackbar( + "$endid success, total bytes = ${payloadTransferUpdate.totalBytes}"); - if (map.containsKey(payloadTransferUpdate.id)) { - //rename the file now - String name = map[payloadTransferUpdate.id]!; - tempFile!.rename(tempFile!.parent.path + "/" + name); - } else { - //bytes not received till yet - map[payloadTransferUpdate.id] = ""; - } - } - }, - ); - }, - ), - ElevatedButton( - child: Text("Reject Connection"), - onPressed: () async { - Navigator.pop(context); - try { - await Nearby().rejectConnection(id); - } catch (e) { - showSnackbar(e); - } - }, - ), - ], - ), - ); + if (map.containsKey(payloadTransferUpdate.id)) { + //rename the file now + String name = map[payloadTransferUpdate.id]!; + tempFile!.rename(tempFile!.parent.path + "/" + name); + } else { + //bytes not received till yet + map[payloadTransferUpdate.id] = ""; + } + } }, ); } + + /// + /// + /// } diff --git a/example/pubspec.lock b/example/pubspec.lock index b67211f..780302e 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -43,6 +43,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.15.0" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" fake_async: dependency: transitive description: @@ -67,6 +74,13 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_udid: + dependency: "direct main" + description: + name: flutter_udid + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" flutter_web_plugins: dependency: transitive description: flutter @@ -219,4 +233,4 @@ packages: version: "2.1.0" sdks: dart: ">=2.12.0 <3.0.0" - flutter: ">=1.20.0" + flutter: ">=2.0.0" diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 72191c7..9bab31d 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -12,6 +12,8 @@ dependencies: flutter: sdk: flutter image_picker: ^0.7.4 + flutter_udid: ^2.0.0 + nearby_connections: # When depending on this package from a real application you should use: # nearby_connections: ^x.y.z