diff --git a/src/android/Geolocation.java b/src/android/Geolocation.java index d8cae0e6..7b54c2d8 100644 --- a/src/android/Geolocation.java +++ b/src/android/Geolocation.java @@ -14,12 +14,12 @@ Licensed to the Apache Software Foundation (ASF) under one specific language governing permissions and limitations under the License. */ - - package org.apache.cordova.geolocation; +import android.content.Context; import android.content.pm.PackageManager; import android.Manifest; +import android.location.LocationManager; import android.os.Build; import org.apache.cordova.CallbackContext; @@ -30,24 +30,29 @@ Licensed to the Apache Software Foundation (ASF) under one import org.json.JSONArray; import org.json.JSONException; - public class Geolocation extends CordovaPlugin { String TAG = "GeolocationPlugin"; CallbackContext context; - - String [] highAccuracyPermissions = { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION }; - String [] lowAccuracyPermissions = { Manifest.permission.ACCESS_COARSE_LOCATION }; - String [] permissionsToRequest; + String[] highAccuracyPermissions = {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}; + String[] lowAccuracyPermissions = {Manifest.permission.ACCESS_COARSE_LOCATION}; + String[] permissionsToRequest; String[] permissionsToCheck; + LocationManager manager; public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { LOG.d(TAG, "We are entering execute"); context = callbackContext; - if(action.equals("getPermission")) - { + if (action.equals("getPermission")) { + if (!isLocationProviderAvailable()) { + LOG.d(TAG, "Location Provider Unavailable!"); + PluginResult result = new PluginResult(PluginResult.Status.ILLEGAL_ACCESS_EXCEPTION); + context.sendPluginResult(result); + return true; + } + boolean highAccuracy = args.getBoolean(0); permissionsToCheck = highAccuracy ? highAccuracyPermissions : lowAccuracyPermissions; @@ -55,13 +60,11 @@ public boolean execute(String action, JSONArray args, CallbackContext callbackCo // See https://bugs.chromium.org/p/chromium/issues/detail?id=1269362 permissionsToRequest = Build.VERSION.SDK_INT <= 31 ? highAccuracyPermissions : permissionsToCheck; - if(hasPermisssion(permissionsToCheck)) - { + if (hasPermission(permissionsToCheck)) { PluginResult r = new PluginResult(PluginResult.Status.OK, Build.VERSION.SDK_INT); context.sendPluginResult(r); return true; - } - else { + } else { PermissionHelper.requestPermissions(this, 0, permissionsToRequest); } return true; @@ -69,34 +72,26 @@ public boolean execute(String action, JSONArray args, CallbackContext callbackCo return false; } - - public void onRequestPermissionResult(int requestCode, String[] permissions, - int[] grantResults) throws JSONException - { + public void onRequestPermissionResult(int requestCode, String[] permissions, int[] grantResults) { PluginResult result; //This is important if we're using Cordova without using Cordova, but we have the geolocation plugin installed - if(context != null) { - for (int i=0; i<grantResults.length; i++) { - int r = grantResults[i]; - String p = permissions[i]; - if (r == PackageManager.PERMISSION_DENIED && arrayContains(permissionsToCheck, p)) { - LOG.d(TAG, "Permission Denied!"); - result = new PluginResult(PluginResult.Status.ILLEGAL_ACCESS_EXCEPTION); + if (context != null) { + for (int r : grantResults) { + if (r == PackageManager.PERMISSION_GRANTED) { + result = new PluginResult(PluginResult.Status.OK); context.sendPluginResult(result); return; } - } - result = new PluginResult(PluginResult.Status.OK); + LOG.d(TAG, "Permission Denied!"); + result = new PluginResult(PluginResult.Status.ILLEGAL_ACCESS_EXCEPTION); context.sendPluginResult(result); } } - public boolean hasPermisssion(String[] permissions) { - for(String p : permissions) - { - if(!PermissionHelper.hasPermission(this, p)) - { + public boolean hasPermission(String[] permissions) { + for (String p : permissions) { + if (!PermissionHelper.hasPermission(this, p)) { return false; } } @@ -107,26 +102,12 @@ public boolean hasPermisssion(String[] permissions) { * We override this so that we can access the permissions variable, which no longer exists in * the parent class, since we can't initialize it reliably in the constructor! */ - - public void requestPermissions(int requestCode) - { + public void requestPermissions(int requestCode) { PermissionHelper.requestPermissions(this, requestCode, permissionsToRequest); } - //https://stackoverflow.com/a/12635769/777265 - private <T> boolean arrayContains(final T[] array, final T v) { - if (v == null) { - for (final T e : array) - if (e == null) - return true; - } - else { - for (final T e : array) - if (e == v || v.equals(e)) - return true; - } - - return false; + private boolean isLocationProviderAvailable() { + manager = (LocationManager) this.cordova.getActivity().getApplicationContext().getSystemService(Context.LOCATION_SERVICE); + return manager.isProviderEnabled(LocationManager.GPS_PROVIDER) || manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); } - }