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

Side by Side Diff: chrome/android/java/src/org/chromium/chrome/browser/infobar/PermissionUpdateInfoBarDelegate.java

Issue 1240923002: Add an infobar to resolve android runtime permission mismatches. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 5 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 package org.chromium.chrome.browser.infobar;
6
7 import android.app.Activity;
8 import android.content.Intent;
9 import android.content.pm.PackageManager;
10 import android.net.Uri;
11 import android.provider.Settings;
12
13 import org.chromium.base.ActivityState;
14 import org.chromium.base.ApplicationStatus;
15 import org.chromium.base.ApplicationStatus.ActivityStateListener;
16 import org.chromium.base.CalledByNative;
17 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
18 import org.chromium.content.browser.ContentViewCore;
19 import org.chromium.content_public.browser.WebContents;
20 import org.chromium.ui.base.WindowAndroid;
21
22 import java.util.ArrayList;
23 import java.util.List;
24
25 /**
26 * Handles requesting the android runtime permissions for the permission update infobar.
27 */
28 class PermissionUpdateInfoBarDelegate implements WindowAndroid.PermissionCallbac k {
29
30 private final WindowAndroid mWindowAndroid;
31 private final String[] mAndroidPermisisons;
32 private long mNativePtr;
33 private ActivityStateListener mActivityStateListener;
34
35 @CalledByNative
36 private static PermissionUpdateInfoBarDelegate create(
37 long nativePtr, WebContents webContents, int[] contentSettings) {
38 return new PermissionUpdateInfoBarDelegate(nativePtr, webContents, conte ntSettings);
39 }
40
41 private PermissionUpdateInfoBarDelegate(
42 long nativePtr, WebContents webContents, int[] contentSettings) {
43 mNativePtr = nativePtr;
44
45 List<String> permissions = new ArrayList<String>();
46 for (int i = 0; i < contentSettings.length; i++) {
47 String androidPermission =
48 PrefServiceBridge.getAndroidPermissionForContentSetting(cont entSettings[i]);
49 if (androidPermission != null) permissions.add(androidPermission);
50 }
51 mAndroidPermisisons = permissions.toArray(new String[permissions.size()] );
52 mWindowAndroid = ContentViewCore.fromWebContents(webContents).getWindowA ndroid();
53 }
54
55 @CalledByNative
56 private void onNativeDestroyed() {
57 mNativePtr = 0;
58 if (mActivityStateListener != null) {
59 ApplicationStatus.unregisterActivityStateListener(mActivityStateList ener);
60 mActivityStateListener = null;
61 }
62 }
63
64 @CalledByNative
65 private void requestPermissions() {
66 boolean canRequestAllPermissions = true;
67 for (int i = 0; i < mAndroidPermisisons.length; i++) {
68 canRequestAllPermissions &=
69 mWindowAndroid.canRequestPermission(mAndroidPermisisons[i]);
70 }
71
72 if (canRequestAllPermissions) {
73 mWindowAndroid.requestPermissions(mAndroidPermisisons, this);
74 } else {
75 Activity activity = mWindowAndroid.getActivity().get();
76 if (activity == null) {
77 nativeOnPermissionResult(mNativePtr, false);
78 return;
79 }
80
81 mActivityStateListener = new ActivityStateListener() {
82 @Override
83 public void onActivityStateChange(Activity activity, int newStat e) {
84 if (newState == ActivityState.DESTROYED) {
85 ApplicationStatus.unregisterActivityStateListener(this);
86 mActivityStateListener = null;
87
88 nativeOnPermissionResult(mNativePtr, false);
89 } else if (newState == ActivityState.RESUMED) {
90 ApplicationStatus.unregisterActivityStateListener(this);
91 mActivityStateListener = null;
92
93 boolean hasAllPermissions = true;
94 for (int i = 0; i < mAndroidPermisisons.length; i++) {
95 hasAllPermissions &=
96 mWindowAndroid.hasPermission(mAndroidPermisi sons[i]);
97 }
98 nativeOnPermissionResult(mNativePtr, hasAllPermissions);
99 }
100 }
101 };
102 ApplicationStatus.registerStateListenerForActivity(mActivityStateLis tener, activity);
103
104 Intent settingsIntent = new Intent(Settings.ACTION_APPLICATION_DETAI LS_SETTINGS);
105 settingsIntent.setData(Uri.parse(
106 "package:" + mWindowAndroid.getApplicationContext().getPacka geName()));
107 settingsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
108 activity.startActivity(settingsIntent);
109 }
110 }
111
112 @Override
113 public void onRequestPermissionsResult(String[] permissions, int[] grantResu lts) {
114 boolean allPermissionsGranted = true;
115 for (int i = 0; i < grantResults.length; i++) {
116 allPermissionsGranted &= grantResults[i] == PackageManager.PERMISSIO N_GRANTED;
117 }
118
119 if (mNativePtr != 0) nativeOnPermissionResult(mNativePtr, allPermissions Granted);
120 }
121
122 private native void nativeOnPermissionResult(
123 long nativePermissionUpdateInfoBarDelegate, boolean allPermissionsGr anted);
124 }
OLDNEW
« no previous file with comments | « no previous file | chrome/app/chromium_strings.grd » ('j') | chrome/browser/geolocation/geolocation_permission_context_android.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698