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