Chromium Code Reviews| 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); |
| } |