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); |
} |