OLD | NEW |
---|---|
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 Loading... | |
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 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 // For some reason this is ocassionally null. See crbug.com/7085 62. |
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 Loading... | |
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 destroyFromNative(PermissionDialogDelegate delegate) { | |
dominickn
2017/05/24 03:33:38
Nit: I would call this dismissFromNative. "Destroy
Timothy Loh
2017/05/24 04:59:33
Done.
| |
264 if (mDialogDelegate == delegate) { | |
dominickn
2017/05/24 03:33:38
Maybe compare the native pointer to be safe.
Timothy Loh
2017/05/24 04:59:33
Not sure what you want, do you mean that the C++ P
| |
265 mDialogDelegate = null; | |
266 AlertDialog dialog = mDialog; | |
dominickn
2017/05/24 03:33:38
Nit: is it problematic to do:
mDialog.dismiss();
Timothy Loh
2017/05/24 04:59:33
Probably not but I think we end up in a weird stat
| |
267 mDialog = null; | |
268 dialog.dismiss(); | |
269 } else { | |
270 assert mRequestQueue.contains(delegate); | |
dominickn
2017/05/24 03:33:38
I don't think remove() fails if delegate isn't in
Timothy Loh
2017/05/24 04:59:33
I added it as a sanity check because remove() does
| |
271 mRequestQueue.remove(delegate); | |
272 } | |
273 } | |
274 | |
256 private void destroyDelegate() { | 275 private void destroyDelegate() { |
257 mDialogDelegate.destroy(); | 276 mDialogDelegate.destroy(); |
258 mDialogDelegate = null; | 277 mDialogDelegate = null; |
259 } | 278 } |
260 } | 279 } |
OLD | NEW |