Commit 2039629a authored by Ehimare Okoyomon's avatar Ehimare Okoyomon Committed by Chromium LUCI CQ

[Android] Add Observers to PermissionDialogController

Change dialog result reporting system to have its own observers in order
to prevent having to add ModalDialogManagerObserver workarounds. For
example, when a secondary os-level prompt is created after the user
accepts a site-level prompt. This way, we only trigger an update
directly after the permission changes.

Bug: 1158288
Change-Id: I496ceb8f35495e61dd4f161256e56cf40c172ea9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2632756
Commit-Queue: Ehimare Okoyomon <eokoyomon@chromium.org>
Reviewed-by: default avatarChristian Dullweber <dullweber@chromium.org>
Reviewed-by: default avatarBalazs Engedy <engedy@chromium.org>
Cr-Commit-Position: refs/heads/master@{#844555}
parent ddd08c52
......@@ -12,8 +12,10 @@ import androidx.annotation.VisibleForTesting;
import org.chromium.base.BuildInfo;
import org.chromium.base.ContextUtils;
import org.chromium.base.ObserverList;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.components.content_settings.ContentSettingValues;
import org.chromium.components.content_settings.ContentSettingsType;
import org.chromium.ui.modaldialog.DialogDismissalCause;
import org.chromium.ui.modaldialog.ModalDialogManager;
import org.chromium.ui.modaldialog.ModalDialogProperties;
......@@ -48,15 +50,27 @@ public class PermissionDialogController
int REQUEST_ANDROID_PERMISSIONS = 5;
}
/**
* Interface for a class that wants to receive updates from this controller.
*/
public interface Observer {
/**
* Notifies the observer that the user has just completed a permissions prompt.
* @param permissions An array of ContentSettingsType, indicating the last dialog
* permissions.
* @param result A ContentSettingValues type, indicating the last dialog result.
*/
void onDialogResult(
@ContentSettingsType int[] permissions, @ContentSettingValues int result);
}
private final ObserverList<Observer> mObservers;
private PropertyModel mDialogModel;
private PropertyModel mOverlayDetectedDialogModel;
private PermissionDialogDelegate mDialogDelegate;
private ModalDialogManager mModalDialogManager;
// Array with ints of type {@link ContentSettingsType}.
private int[] mLastPermissions;
private @ContentSettingValues int mLastResult;
// As the PermissionRequestManager handles queueing for a tab and only shows prompts for active
// tabs, we typically only have one request. This class only handles multiple requests at once
// when either:
......@@ -82,6 +96,7 @@ public class PermissionDialogController
private PermissionDialogController() {
mRequestQueue = new LinkedList<>();
mState = State.NOT_SHOWING;
mObservers = new ObserverList<>();
}
/**
......@@ -95,19 +110,17 @@ public class PermissionDialogController
}
/**
* Returns whether this PropertyModel is for the permission dialog.
* @param model The PropertyModel to be checked.
* @param observer An observer to be notified of changes.
*/
public static boolean isPermissionDialogModel(PropertyModel model) {
return model.get(ModalDialogProperties.CONTROLLER) instanceof PermissionDialogController;
public void addObserver(Observer observer) {
mObservers.addObserver(observer);
}
public int[] getLastDialogPermissions() {
return mLastPermissions.clone();
}
public @ContentSettingValues int getLastDialogResult() {
return mLastResult;
/**
* @param observer The observer to remove.
*/
public void removeObserver(Observer observer) {
mObservers.removeObserver(observer);
}
/**
......@@ -150,7 +163,9 @@ public class PermissionDialogController
mState = State.NOT_SHOWING;
} else {
mDialogDelegate.onDismiss();
destroyDelegate(ContentSettingValues.BLOCK);
// The user accepted the site-level prompt but denied the app-level prompt.
// No content setting should be set.
destroyDelegate(ContentSettingValues.DEFAULT);
}
scheduleDisplay();
}
......@@ -307,8 +322,9 @@ public class PermissionDialogController
private void destroyDelegate(@ContentSettingValues int result) {
if (result != ContentSettingValues.DEFAULT) {
mLastPermissions = mDialogDelegate.getContentSettingsTypes();
mLastResult = result;
for (Observer obs : mObservers) {
obs.onDialogResult(mDialogDelegate.getContentSettingsTypes().clone(), result);
}
}
mDialogDelegate.destroy();
mDialogDelegate = null;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment