Index: chrome/android/java/src/org/chromium/chrome/browser/infobar/PermissionUpdateInfoBarDelegate.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/PermissionUpdateInfoBarDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/PermissionUpdateInfoBarDelegate.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6f7913c3b427d14c6e5cd7d65f5bd737deb82565 |
--- /dev/null |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/PermissionUpdateInfoBarDelegate.java |
@@ -0,0 +1,123 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.chromium.chrome.browser.infobar; |
+ |
+import android.app.Activity; |
+import android.content.Intent; |
+import android.net.Uri; |
+import android.provider.Settings; |
+ |
+import org.chromium.base.ActivityState; |
+import org.chromium.base.ApplicationStatus; |
+import org.chromium.base.ApplicationStatus.ActivityStateListener; |
+import org.chromium.base.CalledByNative; |
+import org.chromium.chrome.browser.preferences.PrefServiceBridge; |
+import org.chromium.content.browser.ContentViewCore; |
+import org.chromium.content_public.browser.WebContents; |
+import org.chromium.ui.base.WindowAndroid; |
+ |
+import java.util.ArrayList; |
+import java.util.List; |
+ |
+/** |
+ * Handles requesting the android runtime permissions for the permission update infobar. |
+ */ |
+class PermissionUpdateInfoBarDelegate implements WindowAndroid.PermissionCallback { |
+ |
+ private final WindowAndroid mWindowAndroid; |
+ private final String[] mAndroidPermisisons; |
+ private long mNativePtr; |
+ private ActivityStateListener mActivityStateListener; |
+ |
+ @CalledByNative |
+ private static PermissionUpdateInfoBarDelegate create( |
+ long nativePtr, WebContents webContents, int[] contentSettings) { |
+ return new PermissionUpdateInfoBarDelegate(nativePtr, webContents, contentSettings); |
+ } |
+ |
+ private PermissionUpdateInfoBarDelegate( |
+ long nativePtr, WebContents webContents, int[] contentSettings) { |
+ mNativePtr = nativePtr; |
+ |
+ List<String> permissions = new ArrayList<String>(); |
+ for (int i = 0; i < contentSettings.length; i++) { |
+ String androidPermission = |
+ PrefServiceBridge.getAndroidPermissionForContentSetting(contentSettings[i]); |
+ if (androidPermission != null) permissions.add(androidPermission); |
+ } |
+ mAndroidPermisisons = permissions.toArray(new String[permissions.size()]); |
+ mWindowAndroid = ContentViewCore.fromWebContents(webContents).getWindowAndroid(); |
+ } |
+ |
+ @CalledByNative |
+ private void onNativeDestroyed() { |
+ mNativePtr = 0; |
+ if (mActivityStateListener != null) { |
+ ApplicationStatus.unregisterActivityStateListener(mActivityStateListener); |
+ mActivityStateListener = null; |
+ } |
+ } |
+ |
+ @CalledByNative |
+ private void requestPermissions() { |
+ boolean canRequestAllPermissions = true; |
+ for (int i = 0; i < mAndroidPermisisons.length; i++) { |
+ canRequestAllPermissions &= |
+ (mWindowAndroid.hasPermission(mAndroidPermisisons[i]) |
+ || mWindowAndroid.canRequestPermission(mAndroidPermisisons[i])); |
+ } |
+ |
+ if (canRequestAllPermissions) { |
+ mWindowAndroid.requestPermissions(mAndroidPermisisons, this); |
+ } else { |
+ Activity activity = mWindowAndroid.getActivity().get(); |
+ if (activity == null) { |
+ nativeOnPermissionResult(mNativePtr, false); |
+ return; |
+ } |
+ |
+ mActivityStateListener = new ActivityStateListener() { |
+ @Override |
+ public void onActivityStateChange(Activity activity, int newState) { |
+ if (newState == ActivityState.DESTROYED) { |
+ ApplicationStatus.unregisterActivityStateListener(this); |
+ mActivityStateListener = null; |
+ |
+ nativeOnPermissionResult(mNativePtr, false); |
+ } else if (newState == ActivityState.RESUMED) { |
+ ApplicationStatus.unregisterActivityStateListener(this); |
+ mActivityStateListener = null; |
+ |
+ notifyPermissionResult(); |
+ } |
+ } |
+ }; |
+ ApplicationStatus.registerStateListenerForActivity(mActivityStateListener, activity); |
+ |
+ Intent settingsIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); |
+ settingsIntent.setData(Uri.parse( |
+ "package:" + mWindowAndroid.getApplicationContext().getPackageName())); |
+ settingsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); |
+ activity.startActivity(settingsIntent); |
+ } |
+ } |
+ |
+ @Override |
+ public void onRequestPermissionsResult(String[] permissions, int[] grantResults) { |
+ notifyPermissionResult(); |
gone
2015/07/17 20:47:45
Guess it's easier to read with single codepath ins
Ted C
2015/07/17 20:55:28
Yeah, it also covers the case where you had 3 requ
gone
2015/07/17 20:57:03
Acknowledged.
|
+ } |
+ |
+ private void notifyPermissionResult() { |
+ boolean hasAllPermissions = true; |
+ for (int i = 0; i < mAndroidPermisisons.length; i++) { |
+ hasAllPermissions &= |
+ mWindowAndroid.hasPermission(mAndroidPermisisons[i]); |
+ } |
+ if (mNativePtr != 0) nativeOnPermissionResult(mNativePtr, hasAllPermissions); |
+ } |
+ |
+ private native void nativeOnPermissionResult( |
+ long nativePermissionUpdateInfoBarDelegate, boolean allPermissionsGranted); |
+} |