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

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/infobar/ConfirmInfoBar.java

Issue 1164973003: Add initial support for runtime permissions in android M. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 6 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/infobar/ConfirmInfoBar.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/ConfirmInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/ConfirmInfoBar.java
index 4564ebd3b17c7109b5fdbf6fa8cb61618ce01d43..611b9ffcc423d50ac0f20acdae359b87888fc55e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/ConfirmInfoBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/ConfirmInfoBar.java
@@ -4,7 +4,18 @@
package org.chromium.chrome.browser.infobar;
+import android.Manifest;
+import android.content.Context;
+import android.content.pm.PackageManager;
import android.graphics.Bitmap;
+import android.os.Process;
+
+import org.chromium.chrome.browser.ContentSettingsType;
+import org.chromium.ui.base.WindowAndroid;
+import org.chromium.ui.base.WindowAndroid.PermissionCallback;
+
+import java.util.ArrayList;
+import java.util.List;
/**
* An infobar that presents the user with several buttons.
@@ -24,14 +35,26 @@ public class ConfirmInfoBar extends InfoBar {
/** Notified when one of the buttons is clicked. */
private final InfoBarListeners.Confirm mConfirmListener;
+ private final WindowAndroid mWindowAndroid;
+ private final int[] mContentSettings;
+
public ConfirmInfoBar(long nativeInfoBar, InfoBarListeners.Confirm confirmListener,
- int iconDrawableId, Bitmap iconBitmap, String message, String linkText,
- String primaryButtonText, String secondaryButtonText) {
+ WindowAndroid windowAndroid, int iconDrawableId, Bitmap iconBitmap, String message,
+ String linkText, String primaryButtonText, String secondaryButtonText,
+ int[] contentSettings) {
super(confirmListener, iconDrawableId, iconBitmap, message);
mPrimaryButtonText = primaryButtonText;
mSecondaryButtonText = secondaryButtonText;
mTertiaryButtonText = linkText;
mConfirmListener = confirmListener;
+ mWindowAndroid = windowAndroid;
+ mContentSettings = contentSettings;
+
+ if (contentSettings != null && mWindowAndroid == null) {
+ assert false
+ : "A WindowAndroid must be specified to request access to content settings";
+ }
+
setNativeInfoBar(nativeInfoBar);
}
@@ -40,8 +63,79 @@ public class ConfirmInfoBar extends InfoBar {
layout.setButtons(mPrimaryButtonText, mSecondaryButtonText, mTertiaryButtonText);
}
+ private static boolean hasPermission(Context context, String permission) {
+ return context.checkPermission(permission, Process.myPid(), Process.myUid())
gone 2015/06/04 18:42:04 Does it make sense to use checkCallingPermission o
Ted C 2015/06/05 00:57:57 This recommends checkSelfPermission, which is not
+ != PackageManager.PERMISSION_DENIED;
+ }
+
+ private List<String> getPermissionsToRequest() {
+ Context context = getContext();
+ List<String> permissionsToRequest = new ArrayList<String>();
+ for (int i = 0; i < mContentSettings.length; i++) {
+ switch (mContentSettings[i]) {
+ case ContentSettingsType.CONTENT_SETTINGS_TYPE_GEOLOCATION:
+ if (!hasPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)) {
+ permissionsToRequest.add(Manifest.permission.ACCESS_FINE_LOCATION);
+ }
+ break;
+ case ContentSettingsType.CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA:
+ if (!hasPermission(context, Manifest.permission.CAMERA)) {
+ permissionsToRequest.add(Manifest.permission.CAMERA);
+ }
+ break;
+ case ContentSettingsType.CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC:
+ if (!hasPermission(context, Manifest.permission.RECORD_AUDIO)) {
+ permissionsToRequest.add(Manifest.permission.RECORD_AUDIO);
+ }
+ break;
+ }
+ }
+ return permissionsToRequest;
+ }
+
@Override
- public void onButtonClicked(boolean isPrimaryButton) {
+ public void onButtonClicked(final boolean isPrimaryButton) {
+ if (mWindowAndroid == null || mContentSettings == null
+ || mContentSettings.length == 0 || !isPrimaryButton || getContext() == null) {
+ onButtonClickedInternal(isPrimaryButton);
+ return;
+ }
+
+ List<String> permissionsToRequest = getPermissionsToRequest();
+ if (permissionsToRequest.isEmpty()) {
+ onButtonClickedInternal(isPrimaryButton);
+ return;
+ }
+
+ mWindowAndroid.requestPermissions(
+ permissionsToRequest.toArray(new String[permissionsToRequest.size()]),
+ new PermissionCallback() {
gone 2015/06/04 18:42:04 nit: may be cleaner to define the permission callb
Ted C 2015/06/05 00:57:56 Done.
+ @Override
+ public void onRequestPermissionsResult(
+ String[] permissions, int[] grantResults) {
+ boolean grantedAllPermissions = true;
+ for (int i = 0; i < grantResults.length; i++) {
+ if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
+ grantedAllPermissions = false;
+ break;
+ }
+ }
+
+ if (!grantedAllPermissions) {
+ onCloseButtonClicked();
+ } else {
+ onButtonClickedInternal(true);
+ }
+ }
+
+ @Override
+ public void onRequestPermissionAborted() {
+ onCloseButtonClicked();
+ }
+ });
+ }
+
+ private void onButtonClickedInternal(boolean isPrimaryButton) {
if (mConfirmListener != null) {
mConfirmListener.onConfirmInfoBarButtonClicked(this, isPrimaryButton);
}

Powered by Google App Engine
This is Rietveld 408576698