From dab25aa1c31217abffea24403dd70d12f2e7f880 Mon Sep 17 00:00:00 2001 From: Maxime Biais Date: Wed, 2 Sep 2015 18:02:51 +0200 Subject: [PATCH 1/3] first step for runtime location request --- WordPressUtils/build.gradle | 1 + .../android/util/helpers/LocationHelper.java | 111 ++++++++++-------- 2 files changed, 63 insertions(+), 49 deletions(-) diff --git a/WordPressUtils/build.gradle b/WordPressUtils/build.gradle index 4c77b82bc0e8..5ac4e6ec1d99 100644 --- a/WordPressUtils/build.gradle +++ b/WordPressUtils/build.gradle @@ -21,6 +21,7 @@ dependencies { } compile 'com.mcxiaoke.volley:library:1.0.18' compile 'com.android.support:support-v13:23.0.0' + compile 'com.android.support:design:23.0.0' } android { diff --git a/WordPressUtils/src/main/java/org/wordpress/android/util/helpers/LocationHelper.java b/WordPressUtils/src/main/java/org/wordpress/android/util/helpers/LocationHelper.java index b19c6e9e3f0c..cfb230cdc9dc 100644 --- a/WordPressUtils/src/main/java/org/wordpress/android/util/helpers/LocationHelper.java +++ b/WordPressUtils/src/main/java/org/wordpress/android/util/helpers/LocationHelper.java @@ -1,59 +1,70 @@ //This Handy-Dandy class acquired and tweaked from http://stackoverflow.com/a/3145655/309558 package org.wordpress.android.util.helpers; -import java.util.Timer; -import java.util.TimerTask; - +import android.Manifest.permission_group; +import android.app.Activity; +import android.app.AlertDialog; import android.content.Context; +import android.content.DialogInterface; +import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; +import android.support.v4.app.ActivityCompat; + +import java.util.Timer; +import java.util.TimerTask; public class LocationHelper { - Timer timer1; - LocationManager lm; - LocationResult locationResult; - boolean gps_enabled = false; - boolean network_enabled = false; - - public boolean getLocation(Context context, LocationResult result) { - locationResult = result; - if (lm == null) - lm = (LocationManager) context - .getSystemService(Context.LOCATION_SERVICE); + Timer mTimer; + LocationManager mLocationManager; + LocationResult mLocationResult; + boolean mGpsEnabled = false; + boolean mNetworkEnabled = false; + + public boolean getLocation(Activity activity, LocationResult result) { + + + mLocationResult = result; + if (mLocationManager == null) { + mLocationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE); + } // exceptions will be thrown if provider is not permitted. try { - gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER); + mGpsEnabled = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); } catch (Exception ex) { } try { - network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER); + mNetworkEnabled = mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); } catch (Exception ex) { } // don't start listeners if no provider is enabled - if (!gps_enabled && !network_enabled) + if (!mGpsEnabled && !mNetworkEnabled) { return false; + } - if (gps_enabled) - lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps); + if (mGpsEnabled) { + mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps); + } - if (network_enabled) - lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork); + if (mNetworkEnabled) { + mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork); + } - timer1 = new Timer(); - timer1.schedule(new GetLastLocation(), 30000); + mTimer = new Timer(); + mTimer.schedule(new GetLastLocation(), 30000); return true; } LocationListener locationListenerGps = new LocationListener() { public void onLocationChanged(Location location) { - timer1.cancel(); - locationResult.gotLocation(location); - lm.removeUpdates(this); - lm.removeUpdates(locationListenerNetwork); + mTimer.cancel(); + mLocationResult.gotLocation(location); + mLocationManager.removeUpdates(this); + mLocationManager.removeUpdates(locationListenerNetwork); } public void onProviderDisabled(String provider) { @@ -68,10 +79,10 @@ public void onStatusChanged(String provider, int status, Bundle extras) { LocationListener locationListenerNetwork = new LocationListener() { public void onLocationChanged(Location location) { - timer1.cancel(); - locationResult.gotLocation(location); - lm.removeUpdates(this); - lm.removeUpdates(locationListenerGps); + mTimer.cancel(); + mLocationResult.gotLocation(location); + mLocationManager.removeUpdates(this); + mLocationManager.removeUpdates(locationListenerGps); } public void onProviderDisabled(String provider) { @@ -87,34 +98,36 @@ public void onStatusChanged(String provider, int status, Bundle extras) { class GetLastLocation extends TimerTask { @Override public void run() { - lm.removeUpdates(locationListenerGps); - lm.removeUpdates(locationListenerNetwork); + mLocationManager.removeUpdates(locationListenerGps); + mLocationManager.removeUpdates(locationListenerNetwork); Location net_loc = null, gps_loc = null; - if (gps_enabled) - gps_loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); - if (network_enabled) - net_loc = lm - .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); + if (mGpsEnabled) { + gps_loc = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); + } + if (mNetworkEnabled) { + net_loc = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); + } // if there are both values use the latest one if (gps_loc != null && net_loc != null) { - if (gps_loc.getTime() > net_loc.getTime()) - locationResult.gotLocation(gps_loc); - else - locationResult.gotLocation(net_loc); + if (gps_loc.getTime() > net_loc.getTime()) { + mLocationResult.gotLocation(gps_loc); + } else { + mLocationResult.gotLocation(net_loc); + } return; } if (gps_loc != null) { - locationResult.gotLocation(gps_loc); + mLocationResult.gotLocation(gps_loc); return; } if (net_loc != null) { - locationResult.gotLocation(net_loc); + mLocationResult.gotLocation(net_loc); return; } - locationResult.gotLocation(null); + mLocationResult.gotLocation(null); } } @@ -123,10 +136,10 @@ public static abstract class LocationResult { } public void cancelTimer() { - if (timer1 != null) { - timer1.cancel(); - lm.removeUpdates(locationListenerGps); - lm.removeUpdates(locationListenerNetwork); + if (mTimer != null) { + mTimer.cancel(); + mLocationManager.removeUpdates(locationListenerGps); + mLocationManager.removeUpdates(locationListenerNetwork); } } } From 6ac29ba1380ba2ed9a0e290deb9dc0fcaa4afb5c Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Fri, 16 Oct 2015 18:57:43 -0600 Subject: [PATCH 2/3] Checking media permission when attempting to add media to post --- .../org/wordpress/android/util/helpers/LocationHelper.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/WordPressUtils/src/main/java/org/wordpress/android/util/helpers/LocationHelper.java b/WordPressUtils/src/main/java/org/wordpress/android/util/helpers/LocationHelper.java index cfb230cdc9dc..757323bf90aa 100644 --- a/WordPressUtils/src/main/java/org/wordpress/android/util/helpers/LocationHelper.java +++ b/WordPressUtils/src/main/java/org/wordpress/android/util/helpers/LocationHelper.java @@ -1,17 +1,12 @@ //This Handy-Dandy class acquired and tweaked from http://stackoverflow.com/a/3145655/309558 package org.wordpress.android.util.helpers; -import android.Manifest.permission_group; import android.app.Activity; -import android.app.AlertDialog; import android.content.Context; -import android.content.DialogInterface; -import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; -import android.support.v4.app.ActivityCompat; import java.util.Timer; import java.util.TimerTask; From 7eabf5adc22f7e95c37b16f6fc2220b8bf306626 Mon Sep 17 00:00:00 2001 From: Maxime Biais Date: Thu, 22 Oct 2015 12:54:35 +0200 Subject: [PATCH 3/3] Moved permission check and request to PermissionUtils --- .../android/util/PermissionUtils.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 WordPressUtils/src/main/java/org/wordpress/android/util/PermissionUtils.java diff --git a/WordPressUtils/src/main/java/org/wordpress/android/util/PermissionUtils.java b/WordPressUtils/src/main/java/org/wordpress/android/util/PermissionUtils.java new file mode 100644 index 000000000000..24c4fbdd7360 --- /dev/null +++ b/WordPressUtils/src/main/java/org/wordpress/android/util/PermissionUtils.java @@ -0,0 +1,52 @@ +package org.wordpress.android.util; + +import android.Manifest.permission; +import android.app.Activity; +import android.content.pm.PackageManager; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; + +import java.util.ArrayList; +import java.util.List; + +public class PermissionUtils { + /** + * Check for permissions, request them if they're not granted. + * + * @return true if permissions are already granted, else request them and return false. + */ + private static boolean checkAndRequestPermissions(Activity activity, int requestCode, String[] permissionList) { + List toRequest = new ArrayList<>(); + for (String permission : permissionList) { + if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) { + toRequest.add(permission); + } + } + if (toRequest.size() > 0) { + String[] requestedPermissions = toRequest.toArray(new String[toRequest.size()]); + ActivityCompat.requestPermissions(activity, requestedPermissions, requestCode); + return false; + } + return true; + } + + public static boolean checkAndRequestCameraAndStoragePermissions(Activity activity, int requestCode) { + return checkAndRequestPermissions(activity, requestCode, new String[]{ + permission.WRITE_EXTERNAL_STORAGE, + permission.CAMERA + }); + } + + public static boolean checkAndRequestStoragePermission(Activity activity, int requestCode) { + return checkAndRequestPermissions(activity, requestCode, new String[]{ + permission.WRITE_EXTERNAL_STORAGE + }); + } + + public static boolean checkLocationPermissions(Activity activity, int requestCode) { + return checkAndRequestPermissions(activity, requestCode, new String[]{ + permission.ACCESS_FINE_LOCATION, + permission.ACCESS_COARSE_LOCATION + }); + } +}