From 013ad94af0a9f0d1f4d4a90528308ce19840c49d Mon Sep 17 00:00:00 2001 From: Joe Bowser Date: Wed, 30 Sep 2015 12:20:40 -0700 Subject: [PATCH] Refactor of the Cordova Plugin/Permissions API --- .../org/apache/cordova/CordovaInterface.java | 15 +++++++++++++- .../apache/cordova/CordovaInterfaceImpl.java | 20 +++++++++++++++++-- .../src/org/apache/cordova/CordovaPlugin.java | 18 +++++++++++++++-- .../cordova/engine/SystemWebChromeClient.java | 2 +- 4 files changed, 49 insertions(+), 6 deletions(-) diff --git a/framework/src/org/apache/cordova/CordovaInterface.java b/framework/src/org/apache/cordova/CordovaInterface.java index 4b43580c..3b8468f3 100755 --- a/framework/src/org/apache/cordova/CordovaInterface.java +++ b/framework/src/org/apache/cordova/CordovaInterface.java @@ -70,6 +70,19 @@ public interface CordovaInterface { */ public ExecutorService getThreadPool(); + /** + * Sends a permission request to the activity for one permission. + */ public void requestPermission(CordovaPlugin plugin, int requestCode, String permission); - public void requestPermissions(CordovaPlugin plugin, int requestCode); + + /** + * Sends a permission request to the activity for a group of permissions + */ + public void requestPermissions(CordovaPlugin plugin, int requestCode, String [] permissions); + + /** + * Check for a permission. Returns true if the permission is granted, false otherwise. + */ + public boolean hasPermission(String permission); + } diff --git a/framework/src/org/apache/cordova/CordovaInterfaceImpl.java b/framework/src/org/apache/cordova/CordovaInterfaceImpl.java index ac311894..3f5e69d0 100644 --- a/framework/src/org/apache/cordova/CordovaInterfaceImpl.java +++ b/framework/src/org/apache/cordova/CordovaInterfaceImpl.java @@ -19,8 +19,11 @@ package org.apache.cordova; +import android.Manifest; import android.app.Activity; import android.content.Intent; +import android.content.pm.PackageManager; +import android.os.Build; import android.os.Bundle; import android.util.Log; @@ -188,11 +191,24 @@ public class CordovaInterfaceImpl implements CordovaInterface { getActivity().requestPermissions(permissions, requestCode); } - public void requestPermissions(CordovaPlugin plugin, int requestCode) + public void requestPermissions(CordovaPlugin plugin, int requestCode, String [] permissions) { permissionResultCallback = plugin; - String[] permissions = plugin.getPermissionRequest(); getActivity().requestPermissions(permissions, requestCode); } + public boolean hasPermission(String permission) + { + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) + { + int result = activity.checkSelfPermission(permission); + return PackageManager.PERMISSION_GRANTED == result; + } + else + { + return true; + } + } + + } diff --git a/framework/src/org/apache/cordova/CordovaPlugin.java b/framework/src/org/apache/cordova/CordovaPlugin.java index 7dc18e3b..9f211ff9 100644 --- a/framework/src/org/apache/cordova/CordovaPlugin.java +++ b/framework/src/org/apache/cordova/CordovaPlugin.java @@ -29,6 +29,7 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.net.Uri; +import android.os.Build; import java.io.FileNotFoundException; import java.io.IOException; @@ -365,14 +366,27 @@ public class CordovaPlugin { /** * Called by the Plugin Manager when we need to actually request permissions * + * @param requestCode Passed to the activity to track the request + * * @return Returns the permission that was stored in the plugin */ - public String[] getPermissionRequest() { - return permissions; + public void requestPermissions(int requestCode) { + cordova.requestPermissions(this, requestCode, permissions); } + /* + * Called by the WebView implementation to check for geolocation permissions, can be used + * by other Java methods in the event that a plugin is using this as a dependency. + * + * @return Returns true if the plugin has all the permissions it needs to operate. + */ + public boolean hasPermisssion() { + if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M) + { + return true; + } for(String p : permissions) { if(PackageManager.PERMISSION_DENIED == cordova.getActivity().checkSelfPermission(p)) diff --git a/framework/src/org/apache/cordova/engine/SystemWebChromeClient.java b/framework/src/org/apache/cordova/engine/SystemWebChromeClient.java index 9faae299..6a17e72c 100755 --- a/framework/src/org/apache/cordova/engine/SystemWebChromeClient.java +++ b/framework/src/org/apache/cordova/engine/SystemWebChromeClient.java @@ -189,7 +189,7 @@ public class SystemWebChromeClient extends WebChromeClient { CordovaPlugin geolocation = parentEngine.pluginManager.getPlugin("Geolocation"); if(geolocation != null && !geolocation.hasPermisssion()) { - geolocation.cordova.requestPermissions(geolocation, 0); + geolocation.requestPermissions(0); } }