Commit 1f66d795 authored by Lijin Shen's avatar Lijin Shen Committed by Chromium LUCI CQ

[Messages] Suspend/Resume queue when modal dialogs show/hide

Listening to the modal dialog managers in order to suspend/hide when
dialogs are shown/hidden.

Bug: 1163300
Change-Id: I2d2ddac572f22cd4d270b1693a9ece5ec18ade0f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2633196
Commit-Queue: Lijin Shen <lazzzis@google.com>
Reviewed-by: default avatarPavel Yatsuk <pavely@chromium.org>
Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Cr-Commit-Position: refs/heads/master@{#845201}
parent a1b781f1
......@@ -22,6 +22,9 @@ import org.chromium.chrome.browser.tabmodel.TabModelObserver;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.components.messages.ManagedMessageDispatcher;
import org.chromium.components.messages.MessageQueueDelegate;
import org.chromium.ui.modaldialog.ModalDialogManager;
import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogManagerObserver;
import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.util.TokenHolder;
/**
......@@ -38,6 +41,7 @@ public class ChromeMessageQueueMediator implements MessageQueueDelegate {
private BrowserControlsObserver mBrowserControlsObserver;
private LayoutStateProvider mLayoutStateProvider;
private TabModelSelector mTabModelSelector;
private ModalDialogManager mModalDialogManager;
private FullscreenManager.Observer mFullScreenObserver = new Observer() {
private int mToken = TokenHolder.INVALID_TOKEN;
......@@ -74,6 +78,26 @@ public class ChromeMessageQueueMediator implements MessageQueueDelegate {
}
};
private ModalDialogManagerObserver mModalDialogManagerObserver =
new ModalDialogManagerObserver() {
private int mToken = TokenHolder.INVALID_TOKEN;
@Override
public void onDialogAdded(PropertyModel model) {
if (mToken == TokenHolder.INVALID_TOKEN) {
mToken = suspendQueue();
}
}
@Override
public void onLastDialogDismissed() {
if (mToken != TokenHolder.INVALID_TOKEN) {
resumeQueue(mToken);
mToken = TokenHolder.INVALID_TOKEN;
}
}
};
private TabModelObserver mTabModelObserver = new TabModelObserver() {
@Override
public void didSelectTab(Tab tab, int type, int lastId) {
......@@ -98,6 +122,7 @@ public class ChromeMessageQueueMediator implements MessageQueueDelegate {
* @param fullscreenManager The full screen manager able to notify the fullscreen mode change.
* @param layoutStateProviderOneShotSupplier Supplier of the {@link LayoutStateProvider}.
* @param tabModelSelectorSupplier Supplier of the {@link TabModelSelector}.
* @param modalDialogManagerSupplier Supplier of the {@link ModalDialogManager}.
* @param messageDispatcher The {@link ManagedMessageDispatcher} able to suspend/resume queue.
*/
public ChromeMessageQueueMediator(BrowserControlsManager browserControlsManager,
......@@ -105,6 +130,7 @@ public class ChromeMessageQueueMediator implements MessageQueueDelegate {
FullscreenManager fullscreenManager,
OneshotSupplier<LayoutStateProvider> layoutStateProviderOneShotSupplier,
ObservableSupplier<TabModelSelector> tabModelSelectorSupplier,
ObservableSupplier<ModalDialogManager> modalDialogManagerSupplier,
ManagedMessageDispatcher messageDispatcher) {
mBrowserControlsManager = browserControlsManager;
mContainerCoordinator = messageContainerCoordinator;
......@@ -115,6 +141,7 @@ public class ChromeMessageQueueMediator implements MessageQueueDelegate {
mBrowserControlsManager.addObserver(mBrowserControlsObserver);
layoutStateProviderOneShotSupplier.onAvailable(this::setLayoutStateProvider);
tabModelSelectorSupplier.addObserver(this::setTabModelSelector);
modalDialogManagerSupplier.addObserver(this::setModalDialogManager);
}
public void destroy() {
......@@ -127,12 +154,16 @@ public class ChromeMessageQueueMediator implements MessageQueueDelegate {
mTabModelSelector.getTabModelFilterProvider().removeTabModelFilterObserver(
mTabModelObserver);
}
if (mModalDialogManager != null) {
mModalDialogManager.removeObserver(mModalDialogManagerObserver);
}
mTabModelSelector = null;
mLayoutStateProvider = null;
mQueueController = null;
mContainerCoordinator = null;
mBrowserControlsManager = null;
mFullscreenManager = null;
mModalDialogManager = null;
}
@Override
......@@ -175,15 +206,30 @@ public class ChromeMessageQueueMediator implements MessageQueueDelegate {
* @param layoutStateProvider The provider able to add observer to observe overview mode.
*/
private void setLayoutStateProvider(LayoutStateProvider layoutStateProvider) {
if (mLayoutStateProvider != null) {
mLayoutStateProvider.removeObserver(mLayoutStateObserver);
}
mLayoutStateProvider = layoutStateProvider;
mLayoutStateProvider.addObserver(mLayoutStateObserver);
}
private void setTabModelSelector(TabModelSelector tabModelSelector) {
if (mTabModelSelector != null) {
mTabModelSelector.getTabModelFilterProvider().removeTabModelFilterObserver(
mTabModelObserver);
}
mTabModelSelector = tabModelSelector;
mTabModelSelector.getTabModelFilterProvider().addTabModelFilterObserver(mTabModelObserver);
}
private void setModalDialogManager(ModalDialogManager modalDialogManager) {
if (mModalDialogManager != null) {
mModalDialogManager.removeObserver(mModalDialogManagerObserver);
}
mModalDialogManager = modalDialogManager;
mModalDialogManager.addObserver(mModalDialogManagerObserver);
}
class BrowserControlsObserver implements BrowserControlsStateProvider.Observer {
private Runnable mRunOnControlsFullyVisible;
......
......@@ -438,10 +438,11 @@ public class RootUiCoordinator
mMessageContainerCoordinator::getMessageMaxTranslation,
ChromeAccessibilityUtil.get(),
mActivity.getWindowAndroid()::startAnimationOverContent);
mMessageQueueMediator = new ChromeMessageQueueMediator(
mActivity.getBrowserControlsManager(), mMessageContainerCoordinator,
mActivity.getFullscreenManager(), mLayoutStateProviderOneShotSupplier,
mTabModelSelectorSupplier, mMessageDispatcher);
mMessageQueueMediator =
new ChromeMessageQueueMediator(mActivity.getBrowserControlsManager(),
mMessageContainerCoordinator, mActivity.getFullscreenManager(),
mLayoutStateProviderOneShotSupplier, mTabModelSelectorSupplier,
mActivity.getModalDialogManagerSupplier(), mMessageDispatcher);
mMessageDispatcher.setDelegate(mMessageQueueMediator);
MessagesFactory.attachMessageDispatcher(
mActivity.getWindowAndroid(), mMessageDispatcher);
......
......@@ -30,6 +30,9 @@ import org.chromium.chrome.browser.tabmodel.TabModelFilterProvider;
import org.chromium.chrome.browser.tabmodel.TabModelObserver;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.components.messages.ManagedMessageDispatcher;
import org.chromium.ui.modaldialog.ModalDialogManager;
import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogManagerObserver;
import org.chromium.ui.modelutil.PropertyModel;
/**
* Unit tests for {@link ChromeMessageQueueMediator}.
......@@ -60,6 +63,9 @@ public class ChromeMessageQueueMediatorTest {
@Mock
private TabModelFilterProvider mTabModelFilterProvider;
@Mock
private ModalDialogManager mModalDialogManager;
private ChromeMessageQueueMediator mMediator;
@Before
......@@ -75,11 +81,15 @@ public class ChromeMessageQueueMediatorTest {
new OneshotSupplierImpl<>();
ObservableSupplierImpl<TabModelSelector> tabModelSelectorSupplier =
new ObservableSupplierImpl<>();
ObservableSupplierImpl<ModalDialogManager> modalDialogManagerSupplier =
new ObservableSupplierImpl<>();
mMediator = new ChromeMessageQueueMediator(mBrowserControlsManager,
mMessageContainerCoordinator, mFullscreenManager,
layoutStateProviderOneShotSupplier, tabModelSelectorSupplier, mMessageDispatcher);
layoutStateProviderOneShotSupplier, tabModelSelectorSupplier,
modalDialogManagerSupplier, mMessageDispatcher);
layoutStateProviderOneShotSupplier.set(mLayoutStateProvider);
tabModelSelectorSupplier.set(mTabModelSelector);
modalDialogManagerSupplier.set(mModalDialogManager);
}
/**
......@@ -92,6 +102,7 @@ public class ChromeMessageQueueMediatorTest {
doNothing().when(mFullscreenManager).addObserver(observer.capture());
initMediator();
observer.getValue().onEnterFullscreen(null, null);
verify(mMessageDispatcher).suspend();
observer.getValue().onExitFullscreen(null);
verify(mMessageDispatcher).resume(EXPECTED_TOKEN);
}
......@@ -106,6 +117,7 @@ public class ChromeMessageQueueMediatorTest {
doNothing().when(mLayoutStateProvider).addObserver(observer.capture());
initMediator();
observer.getValue().onStartedShowing(LayoutType.TAB_SWITCHER, false);
verify(mMessageDispatcher).suspend();
observer.getValue().onFinishedShowing(LayoutType.BROWSING);
verify(mMessageDispatcher).resume(EXPECTED_TOKEN);
}
......@@ -123,4 +135,19 @@ public class ChromeMessageQueueMediatorTest {
observer.getValue().didSelectTab(null, TabSelectionType.FROM_NEW, 1);
verify(mMessageDispatcher).dismissAllMessages();
}
/**
* Test the queue can be suspended and resumed correctly when showing/hiding modal dialogs.
*/
@Test
public void testModalDialogChange() {
final ArgumentCaptor<ModalDialogManagerObserver> observer =
ArgumentCaptor.forClass(ModalDialogManagerObserver.class);
doNothing().when(mModalDialogManager).addObserver(observer.capture());
initMediator();
observer.getValue().onDialogAdded(new PropertyModel());
verify(mMessageDispatcher).suspend();
observer.getValue().onLastDialogDismissed();
verify(mMessageDispatcher).resume(EXPECTED_TOKEN);
}
}
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