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

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: Appease findbugs 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
« no previous file with comments | « no previous file | chrome/android/java/src/org/chromium/chrome/browser/infobar/ConfirmInfoBarDelegate.java » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 c33b9045e8c3094921993400bb825c04758d51f1..ea4bde7a88d5ab5cecada30930aedc7a5974ea14 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,6 +35,14 @@ public class ConfirmInfoBar extends InfoBar {
/** Notified when one of the buttons is clicked. */
private final InfoBarListeners.Confirm mConfirmListener;
+ private WindowAndroid mWindowAndroid;
+
+ /**
+ * The list of {@link ContentSettingsType}s being requested by this infobar. Can be null or
+ * empty if none apply.
+ */
+ private int[] mContentSettings;
+
public ConfirmInfoBar(InfoBarListeners.Confirm confirmListener, int iconDrawableId,
Bitmap iconBitmap, String message, String linkText, String primaryButtonText,
String secondaryButtonText) {
@@ -34,13 +53,106 @@ public class ConfirmInfoBar extends InfoBar {
mConfirmListener = confirmListener;
}
+ /**
+ * Specifies the {@link ContentSettingsType}s that are controlled by this InfoBar.
+ *
+ * @param windowAndroid The WindowAndroid that will be used to check for the necessary
+ * permissions.
+ * @param contentSettings The list of {@link ContentSettingsType}s whose access is guarded
+ * by this InfoBar.
+ */
+ protected void setContentSettings(
+ WindowAndroid windowAndroid, int[] contentSettings) {
+ mWindowAndroid = windowAndroid;
+ mContentSettings = contentSettings;
+
+ assert windowAndroid != null
+ : "A WindowAndroid must be specified to request access to content settings";
+ }
+
@Override
public void createContent(InfoBarLayout layout) {
layout.setButtons(mPrimaryButtonText, mSecondaryButtonText, mTertiaryButtonText);
}
+ private static boolean hasPermission(Context context, String permission) {
+ return context.checkPermission(permission, Process.myPid(), Process.myUid())
+ != 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;
+ default:
+ // No associated Android permission, so just skip it.
+ break;
+ }
+ }
+ return permissionsToRequest;
+ }
+
@Override
- public void onButtonClicked(boolean isPrimaryButton) {
+ public void onButtonClicked(final boolean isPrimaryButton) {
+ if (mWindowAndroid == null || mContentSettings == null
+ || !isPrimaryButton || getContext() == null) {
+ onButtonClickedInternal(isPrimaryButton);
+ return;
+ }
+
+ List<String> permissionsToRequest = getPermissionsToRequest();
+ if (permissionsToRequest.isEmpty()) {
+ onButtonClickedInternal(isPrimaryButton);
+ return;
+ }
+
+ PermissionCallback callback = new PermissionCallback() {
+ @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();
+ }
+ };
+
+ mWindowAndroid.requestPermissions(
+ permissionsToRequest.toArray(new String[permissionsToRequest.size()]),
+ callback);
+ }
+
+ private void onButtonClickedInternal(boolean isPrimaryButton) {
if (mConfirmListener != null) {
mConfirmListener.onConfirmInfoBarButtonClicked(this, isPrimaryButton);
}
« no previous file with comments | « no previous file | chrome/android/java/src/org/chromium/chrome/browser/infobar/ConfirmInfoBarDelegate.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698