diff --git a/CHANGELOG.md b/CHANGELOG.md index 527394b..6e05d44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 2.0.1-dev +* askLocationPermission return type changed to Future +* Updated Example accordingly +* Readme Updated + ## 2.0.0-dev * enableLocationService return type changed to Future * Updated Example accordingly diff --git a/README.md b/README.md index bb1b1e9..879a112 100644 --- a/README.md +++ b/README.md @@ -47,16 +47,17 @@ Since ACCESS_FINE_LOCATION and READ_EXTERNAL_STORAGE is considered to be dangero #### As a **convenience** this library provides methods to check and request location and external read/write permissions ```dart // returns true/false asynchronously -bool a = await Nearby().checkLocationPermissions() +bool a = await Nearby().checkLocationPermissions(); // asks for permission only if its not given -Nearby().askLocationPermission() +// returns true/false if the location permission is granted on/off resp. +bool b = Nearby().askLocationPermission(); // OPTIONAL: if you need to transfer files and rename it on device -bool b = Nearby().checkExternalStoragePermission() +bool b = Nearby().checkExternalStoragePermission(); // asks for READ + WRTIE EXTERNAL STORAGE permission only if its not given -Nearby().askExternalStoragePermission() +Nearby().askExternalStoragePermission() ; -Nearby().askLocationAndExternalStoragePermission() // for all permissions in one go.. +Nearby().askLocationAndExternalStoragePermission(); // for all permissions in one go.. ``` ## Work Flow diff --git a/android/src/main/java/com/pkmnapps/nearby_connections/LocationEnabler.java b/android/src/main/java/com/pkmnapps/nearby_connections/LocationHelper.java similarity index 72% rename from android/src/main/java/com/pkmnapps/nearby_connections/LocationEnabler.java rename to android/src/main/java/com/pkmnapps/nearby_connections/LocationHelper.java index 67cc8a4..a8b9f01 100644 --- a/android/src/main/java/com/pkmnapps/nearby_connections/LocationEnabler.java +++ b/android/src/main/java/com/pkmnapps/nearby_connections/LocationHelper.java @@ -1,11 +1,14 @@ package com.pkmnapps.nearby_connections; +import android.Manifest; import android.app.Activity; import android.content.Intent; import android.content.IntentSender; +import android.content.pm.PackageManager; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.app.ActivityCompat; import com.google.android.gms.common.api.ApiException; import com.google.android.gms.common.api.ResolvableApiException; @@ -20,33 +23,29 @@ import com.google.android.gms.tasks.Task; import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugin.common.PluginRegistry; -class LocationEnabler implements PluginRegistry.ActivityResultListener { +class LocationHelper implements PluginRegistry.ActivityResultListener, PluginRegistry.RequestPermissionsResultListener { @Nullable private Activity activity; private static final int LOCATION_ENABLE_REQUEST = 777; + private static final int REQUEST_LOCATION_PERMISSION = 7777; private LocationSettingsRequest mLocationSettingsRequest; private Result pendingResult; - private LocationEnabler(@Nullable Activity activity) { + private LocationHelper(@Nullable Activity activity) { this.activity = activity; } - LocationEnabler(PluginRegistry.Registrar registrar) { + LocationHelper(PluginRegistry.Registrar registrar) { this(registrar.activity()); } - LocationEnabler() { + LocationHelper() { this.activity = null; } - void setActivity(@Nullable Activity activity) { - this.activity = activity; - initiateLocationServiceRequest(); - } - @Override public boolean onActivityResult(int requestCode, int resultCode, Intent data) { if (pendingResult == null) { @@ -64,6 +63,30 @@ class LocationEnabler implements PluginRegistry.ActivityResultListener { return false; } + @Override + public boolean onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + if (requestCode == REQUEST_LOCATION_PERMISSION && permissions.length > 0) { + if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { + if (pendingResult != null) { + pendingResult.success(true); + pendingResult = null; + } + } else { + if (pendingResult != null) { + pendingResult.success(false); + pendingResult = null; + } + } + return true; + } + return false; + } + + void setActivity(@Nullable Activity activity) { + this.activity = activity; + initiateLocationServiceRequest(); + } + private void initiateLocationServiceRequest() { LocationRequest mLocationRequest = LocationRequest.create(); LocationSettingsRequest.Builder builder = new LocationSettingsRequest @@ -107,4 +130,10 @@ class LocationEnabler implements PluginRegistry.ActivityResultListener { }); } + void requestLocationPermission(Result result) { + this.pendingResult = result; + ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_LOCATION_PERMISSION); + } + } \ No newline at end of file diff --git a/android/src/main/java/com/pkmnapps/nearby_connections/NearbyConnectionsPlugin.java b/android/src/main/java/com/pkmnapps/nearby_connections/NearbyConnectionsPlugin.java index 44cc790..1509761 100644 --- a/android/src/main/java/com/pkmnapps/nearby_connections/NearbyConnectionsPlugin.java +++ b/android/src/main/java/com/pkmnapps/nearby_connections/NearbyConnectionsPlugin.java @@ -48,8 +48,8 @@ public class NearbyConnectionsPlugin implements MethodCallHandler, FlutterPlugin private Activity activity; private static final String SERVICE_ID = "com.pkmnapps.nearby_connections"; private static MethodChannel channel; - private static LocationEnabler locationEnabler; - private static ActivityPluginBinding activityBinding; + private static LocationHelper locationHelper; + private static ActivityPluginBinding activityPluginBinding; private static PluginRegistry.Registrar pluginRegistrar; private NearbyConnectionsPlugin(Activity activity) { @@ -63,8 +63,8 @@ public class NearbyConnectionsPlugin implements MethodCallHandler, FlutterPlugin public static void registerWith(Registrar registrar) { pluginRegistrar = registrar; - locationEnabler = new LocationEnabler(registrar); - locationEnabler.setActivity(registrar.activity()); + locationHelper = new LocationHelper(registrar); + locationHelper.setActivity(registrar.activity()); initiate(); channel = new MethodChannel(registrar.messenger(), "nearby_connections"); channel.setMethodCallHandler(new NearbyConnectionsPlugin(registrar.activity())); @@ -85,10 +85,7 @@ public class NearbyConnectionsPlugin implements MethodCallHandler, FlutterPlugin } break; case "askLocationPermission": - ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.ACCESS_COARSE_LOCATION}, 0); - Log.d("nearby_connections", "askLocationPermission"); - result.success(null); + locationHelper.requestLocationPermission(result); break; case "checkLocationEnabled": LocationManager lm = (LocationManager) activity.getSystemService(activity.LOCATION_SERVICE); @@ -105,7 +102,7 @@ public class NearbyConnectionsPlugin implements MethodCallHandler, FlutterPlugin result.success(gps_enabled || network_enabled); break; case "enableLocationServices": - locationEnabler.requestLocationEnable(result); + locationHelper.requestLocationEnable(result); break; case "checkExternalStoragePermission": if (ContextCompat.checkSelfPermission(activity, @@ -480,18 +477,18 @@ public class NearbyConnectionsPlugin implements MethodCallHandler, FlutterPlugin @Override public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { - locationEnabler = new LocationEnabler(); + locationHelper = new LocationHelper(); } @Override public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { - locationEnabler = null; + locationHelper = null; } private static void attachToActivity(ActivityPluginBinding binding) { - activityBinding = binding; + activityPluginBinding = binding; try { - locationEnabler.setActivity(binding.getActivity()); + locationHelper.setActivity(binding.getActivity()); initiate(); } catch (Exception e) { e.printStackTrace(); @@ -499,8 +496,9 @@ public class NearbyConnectionsPlugin implements MethodCallHandler, FlutterPlugin } private void detachActivity() { - activityBinding.removeActivityResultListener(locationEnabler); - activityBinding = null; + activityPluginBinding.removeRequestPermissionsResultListener(locationHelper); + activityPluginBinding.removeActivityResultListener(locationHelper); + activityPluginBinding = null; } @Override @@ -525,9 +523,11 @@ public class NearbyConnectionsPlugin implements MethodCallHandler, FlutterPlugin private static void initiate() { if (pluginRegistrar != null) { - pluginRegistrar.addActivityResultListener(locationEnabler); + pluginRegistrar.addActivityResultListener(locationHelper); + pluginRegistrar.addRequestPermissionsResultListener(locationHelper); } else { - activityBinding.addActivityResultListener(locationEnabler); + activityPluginBinding.addActivityResultListener(locationHelper); + activityPluginBinding.addRequestPermissionsResultListener(locationHelper); } } diff --git a/example/lib/main.dart b/example/lib/main.dart index d933ad3..e0af674 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -3,8 +3,8 @@ import 'dart:math'; import 'dart:typed_data'; import 'package:flutter/material.dart'; -import 'package:nearby_connections/nearby_connections.dart'; import 'package:image_picker/image_picker.dart'; +import 'package:nearby_connections/nearby_connections.dart'; void main() => runApp(MyApp()); @@ -68,8 +68,15 @@ class _MyBodyState extends State { ), RaisedButton( child: Text("askLocationPermission"), - onPressed: () { - Nearby().askLocationPermission(); + onPressed: () async { + if (await Nearby().askLocationPermission()) { + Scaffold.of(context).showSnackBar(SnackBar( + content: Text("Location Permission granted :)"))); + } else { + Scaffold.of(context).showSnackBar(SnackBar( + content: + Text("Location permissions not granted :("))); + } }, ), RaisedButton( @@ -114,11 +121,12 @@ class _MyBodyState extends State { child: Text("enableLocationServices"), onPressed: () async { if (await Nearby().enableLocationServices()) { - Scaffold.of(context).showSnackBar( - SnackBar(content: Text("Location Service Enabled :)"))); + Scaffold.of(context).showSnackBar(SnackBar( + content: Text("Location Service Enabled :)"))); } else { - Scaffold.of(context).showSnackBar( - SnackBar(content: Text("Enabling Location Service Failed :("))); + Scaffold.of(context).showSnackBar(SnackBar( + content: + Text("Enabling Location Service Failed :("))); } }, ), diff --git a/example/pubspec.lock b/example/pubspec.lock index c2cf637..435cb0a 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -108,7 +108,7 @@ packages: path: ".." relative: true source: path - version: "2.0.0-dev" + version: "2.0.1-dev" path: dependency: transitive description: diff --git a/lib/src/nearby.dart b/lib/src/nearby.dart index 03b9bce..55b084c 100644 --- a/lib/src/nearby.dart +++ b/lib/src/nearby.dart @@ -1,9 +1,10 @@ import 'dart:async'; import 'dart:typed_data'; + import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; -import 'package:nearby_connections/src/defs.dart'; import 'package:nearby_connections/src/classes.dart'; +import 'package:nearby_connections/src/defs.dart'; /// The NearbyConnection class /// @@ -130,7 +131,8 @@ class Nearby { } //for advertisers - OnConnectionInitiated _advertConnectionInitiated, _discoverConnectionInitiated; + OnConnectionInitiated _advertConnectionInitiated, + _discoverConnectionInitiated; OnConnectionResult _advertConnectionResult, _discoverConnectionResult; OnDisconnected _advertDisconnected, _discoverDisconnected; @@ -156,8 +158,8 @@ class Nearby { /// convenience method /// /// Asks location permission - void askLocationPermission() => - _channel.invokeMethod('askLocationPermission'); + Future askLocationPermission() async => + await _channel.invokeMethod('askLocationPermission'); /// convenience method /// diff --git a/pubspec.yaml b/pubspec.yaml index a24b288..a868eab 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: nearby_connections description: Plugin for the android NearbyConnections API. Bytes and Files Supported. -version: 2.0.0-dev +version: 2.0.1-dev homepage: https://github.com/mannprerak2/nearby_connections environment: