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

Side by Side Diff: chrome/android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogController.java

Issue 2899973002: Hide modal permission prompts on Android upon tab navigation/destruction (Closed)
Patch Set: fix test (permission request from js goes through mojo so need to poll) Created 3 years, 6 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
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.chrome.browser.permissions; 5 package org.chromium.chrome.browser.permissions;
6 6
7 import android.annotation.SuppressLint; 7 import android.annotation.SuppressLint;
8 import android.app.Activity; 8 import android.app.Activity;
9 import android.content.DialogInterface; 9 import android.content.DialogInterface;
10 import android.support.annotation.IntDef; 10 import android.support.annotation.IntDef;
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 82
83 /** 83 /**
84 * Queues a modal permission dialog for display. If there are currently no d ialogs on screen, it 84 * Queues a modal permission dialog for display. If there are currently no d ialogs on screen, it
85 * will be displayed immediately. Otherwise, it will be displayed as soon as the user responds 85 * will be displayed immediately. Otherwise, it will be displayed as soon as the user responds
86 * to the current dialog. 86 * to the current dialog.
87 * @param context The context to use to get the dialog layout. 87 * @param context The context to use to get the dialog layout.
88 * @param delegate The wrapper for the native-side permission delegate. 88 * @param delegate The wrapper for the native-side permission delegate.
89 */ 89 */
90 private void queueDialog(PermissionDialogDelegate delegate) { 90 private void queueDialog(PermissionDialogDelegate delegate) {
91 mRequestQueue.add(delegate); 91 mRequestQueue.add(delegate);
92 delegate.setDialogController(this);
92 scheduleDisplay(); 93 scheduleDisplay();
93 } 94 }
94 95
95 private void scheduleDisplay() { 96 private void scheduleDisplay() {
96 if (mDialog == null && !mRequestQueue.isEmpty()) showDialog(); 97 if (mDialog == null && !mRequestQueue.isEmpty()) showDialog();
97 } 98 }
98 99
99 @VisibleForTesting 100 @VisibleForTesting
100 public AlertDialog getCurrentDialogForTesting() { 101 public AlertDialog getCurrentDialogForTesting() {
101 return mDialog; 102 return mDialog;
102 } 103 }
103 104
105 @VisibleForTesting
106 public int getQueueLengthForTesting() {
107 return mRequestQueue.size();
108 }
109
104 @Override 110 @Override
105 public void onAndroidPermissionAccepted() { 111 public void onAndroidPermissionAccepted() {
106 mDialogDelegate.onAccept(mSwitchView.isChecked()); 112 mDialogDelegate.onAccept(mSwitchView.isChecked());
107 destroyDelegate(); 113 destroyDelegate();
108 scheduleDisplay(); 114 scheduleDisplay();
109 } 115 }
110 116
111 @Override 117 @Override
112 public void onAndroidPermissionCanceled() { 118 public void onAndroidPermissionCanceled() {
113 mDialogDelegate.onDismiss(); 119 mDialogDelegate.onDismiss();
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 public void onClick(DialogInterface dialog, int id) { 192 public void onClick(DialogInterface dialog, int id) {
187 mDecision = CANCELED; 193 mDecision = CANCELED;
188 } 194 }
189 }); 195 });
190 196
191 // Called when the dialog is dismissed. Interacting with either button i n the dialog will 197 // Called when the dialog is dismissed. Interacting with either button i n the dialog will
192 // call this handler after the primary/secondary handler. 198 // call this handler after the primary/secondary handler.
193 mDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { 199 mDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
194 @Override 200 @Override
195 public void onDismiss(DialogInterface dialog) { 201 public void onDismiss(DialogInterface dialog) {
196 // For some reason this is ocassionally null. See crbug.com/7085 62. 202 // Null if dismiss initiated by C++, or for some unknown reason (crbug.com/708562).
197 if (mDialogDelegate == null) { 203 if (mDialogDelegate == null) {
198 scheduleDisplay(); 204 scheduleDisplay();
205 return;
199 } 206 }
200 207
201 mDialog = null; 208 mDialog = null;
202 if (mDecision == ACCEPTED) { 209 if (mDecision == ACCEPTED) {
203 // Request Android permissions if necessary. This will call back into either 210 // Request Android permissions if necessary. This will call back into either
204 // onAndroidPermissionAccepted or onAndroidPermissionCancele d, which will 211 // onAndroidPermissionAccepted or onAndroidPermissionCancele d, which will
205 // schedule the next permission dialog. If it returns false, no system level 212 // schedule the next permission dialog. If it returns false, no system level
206 // permissions need to be requested, so just run the accept callback. 213 // permissions need to be requested, so just run the accept callback.
207 if (!AndroidPermissionRequester.requestAndroidPermissions( 214 if (!AndroidPermissionRequester.requestAndroidPermissions(
208 mDialogDelegate.getTab(), mDialogDelegate.getCon tentSettingsTypes(), 215 mDialogDelegate.getTab(), mDialogDelegate.getCon tentSettingsTypes(),
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 mDecision = NOT_DECIDED; 253 mDecision = NOT_DECIDED;
247 delegate.onLinkClicked(); 254 delegate.onLinkClicked();
248 if (mDialog != null) mDialog.dismiss(); 255 if (mDialog != null) mDialog.dismiss();
249 } 256 }
250 }, spanStart, fullString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) ; 257 }, spanStart, fullString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) ;
251 } 258 }
252 259
253 return fullString; 260 return fullString;
254 } 261 }
255 262
263 public void dismissFromNative(PermissionDialogDelegate delegate) {
264 if (mDialogDelegate == delegate) {
265 mDialogDelegate = null;
266 AlertDialog dialog = mDialog;
267 mDialog = null;
268 dialog.dismiss();
269 } else {
270 assert mRequestQueue.contains(delegate);
271 mRequestQueue.remove(delegate);
272 }
273 delegate.destroy();
274 }
275
256 private void destroyDelegate() { 276 private void destroyDelegate() {
257 mDialogDelegate.destroy(); 277 mDialogDelegate.destroy();
258 mDialogDelegate = null; 278 mDialogDelegate = null;
259 } 279 }
260 } 280 }
OLDNEW
« no previous file with comments | « chrome/android/BUILD.gn ('k') | chrome/android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogDelegate.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698