Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4377)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/permissions/AndroidPermissionRequester.java

Issue 2682863002: [Android] Explicitly request all needed runtime permissions. (Closed)
Patch Set: Rebase Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/java/src/org/chromium/chrome/browser/permissions/AndroidPermissionRequester.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/permissions/AndroidPermissionRequester.java b/chrome/android/java/src/org/chromium/chrome/browser/permissions/AndroidPermissionRequester.java
index 7059ba047ab7d285bbbe20fc229379ed6c64f99a..a153cb4a9c5754a0a040808175a3042acbdc44f9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/permissions/AndroidPermissionRequester.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/permissions/AndroidPermissionRequester.java
@@ -19,6 +19,12 @@ import org.chromium.chrome.browser.tab.Tab;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.base.WindowAndroid.PermissionCallback;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
/**
* Methods to handle requesting native permissions from Android when the user grants a website a
* permission.
@@ -33,27 +39,38 @@ public class AndroidPermissionRequester {
void onAndroidPermissionCanceled();
}
- private static SparseArray<String> generatePermissionsMapping(
+ private static SparseArray<String[]> generatePermissionsMapping(
WindowAndroid windowAndroid, int[] contentSettingsTypes) {
- SparseArray<String> permissionsToRequest = new SparseArray<String>();
+ SparseArray<String[]> permissionsToRequest = new SparseArray<>();
for (int i = 0; i < contentSettingsTypes.length; i++) {
- String permission = PrefServiceBridge.getAndroidPermissionForContentSetting(
+ String[] permissions = PrefServiceBridge.getAndroidPermissionsForContentSetting(
contentSettingsTypes[i]);
- if (permission != null && !windowAndroid.hasPermission(permission)) {
- permissionsToRequest.append(contentSettingsTypes[i], permission);
+ if (permissions == null) continue;
+ List<String> missingPermissions = new ArrayList<>();
+ for (int j = 0; j < permissions.length; j++) {
+ String permission = permissions[j];
+ if (!windowAndroid.hasPermission(permission)) missingPermissions.add(permission);
+ }
+ if (!missingPermissions.isEmpty()) {
+ permissionsToRequest.append(contentSettingsTypes[i],
+ missingPermissions.toArray(new String[missingPermissions.size()]));
}
}
return permissionsToRequest;
}
private static int getDeniedPermissionResourceId(
- SparseArray<String> contentSettingsTypesToPermissionsMap, String permission) {
+ SparseArray<String[]> contentSettingsTypesToPermissionsMap, String permission) {
int contentSettingsType = 0;
// SparseArray#indexOfValue uses == instead of .equals, so we need to manually iterate
// over the list.
for (int i = 0; i < contentSettingsTypesToPermissionsMap.size(); i++) {
- if (permission.equals(contentSettingsTypesToPermissionsMap.valueAt(i))) {
- contentSettingsType = contentSettingsTypesToPermissionsMap.keyAt(i);
+ String[] contentSettingPermissions = contentSettingsTypesToPermissionsMap.valueAt(i);
+ for (int j = 0; j < contentSettingPermissions.length; j++) {
+ if (permission.equals(contentSettingPermissions[j])) {
+ contentSettingsType = contentSettingsTypesToPermissionsMap.keyAt(i);
+ break;
+ }
}
}
@@ -82,7 +99,7 @@ public class AndroidPermissionRequester {
final WindowAndroid windowAndroid = tab.getWindowAndroid();
if (windowAndroid == null) return false;
- final SparseArray<String> contentSettingsTypesToPermissionsMap =
+ final SparseArray<String[]> contentSettingsTypesToPermissionsMap =
generatePermissionsMapping(windowAndroid, contentSettingsTypes);
if (contentSettingsTypesToPermissionsMap.size() == 0) return false;
@@ -142,11 +159,13 @@ public class AndroidPermissionRequester {
}
};
- String[] permissionsToRequest = new String[contentSettingsTypesToPermissionsMap.size()];
+ Set<String> permissionsToRequest = new HashSet<>();
for (int i = 0; i < contentSettingsTypesToPermissionsMap.size(); i++) {
- permissionsToRequest[i] = contentSettingsTypesToPermissionsMap.valueAt(i);
+ Collections.addAll(
+ permissionsToRequest, contentSettingsTypesToPermissionsMap.valueAt(i));
}
- windowAndroid.requestPermissions(permissionsToRequest, callback);
+ windowAndroid.requestPermissions(
+ permissionsToRequest.toArray(new String[permissionsToRequest.size()]), callback);
return true;
}
}

Powered by Google App Engine
This is Rietveld 408576698