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