Commit 635072d7 authored by Matt Jones's avatar Matt Jones Committed by Commit Bot

Convert the BottomSheetController to the new scrim widget

This patch begins the process of moving individual users of the
ScrimView to the new scrim component. The RootUiCoordinator now
instantiates the component and passes it to the BottomSheet. The
BottomSheet still references the ScrimView class because of other
dependent features.

Bug: 1062099
Change-Id: I2834a0a95880a6d7d6ad250849ae24d04a3b14ce
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2106755
Commit-Queue: Matthew Jones <mdjones@chromium.org>
Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Reviewed-by: default avatarSinan Sahin <sinansahin@google.com>
Cr-Commit-Position: refs/heads/master@{#752080}
parent 8f98e0ab
......@@ -56,6 +56,7 @@ import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
import org.chromium.chrome.browser.image_fetcher.ImageFetcher;
import org.chromium.chrome.browser.image_fetcher.ImageFetcherConfig;
import org.chromium.chrome.browser.ui.RootUiCoordinator;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController;
import org.chromium.content_public.browser.WebContents;
import org.chromium.content_public.browser.test.util.Criteria;
......@@ -408,10 +409,11 @@ class AutofillAssistantUiTestUtil {
return activity.getCompositorViewHolder().getLayoutManager().getOverlayPanelManager();
};
RootUiCoordinator rootCoordinator = activity.getRootUiCoordinatorForTesting();
return new BottomSheetController(activity.getLifecycleDispatcher(),
activity.getActivityTabProvider(), activity::getScrim, sheetSupplier,
panelManagerProvider, activity.getFullscreenManager(), activity.getWindow(),
activity.getWindowAndroid().getKeyboardDelegate());
activity.getActivityTabProvider(), rootCoordinator::getScrimCoordinatorForTesting,
sheetSupplier, panelManagerProvider, activity.getFullscreenManager(),
activity.getWindow(), activity.getWindowAndroid().getKeyboardDelegate());
}
/**
......
......@@ -12,6 +12,7 @@ import android.view.ViewGroup;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.Callback;
import org.chromium.base.TraceEvent;
import org.chromium.base.metrics.RecordUserAction;
......@@ -53,6 +54,7 @@ import org.chromium.chrome.browser.vr.VrModuleProvider;
import org.chromium.chrome.browser.widget.ScrimView;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController;
import org.chromium.components.browser_ui.widget.MenuOrKeyboardActionController;
import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator;
import org.chromium.ui.base.DeviceFormFactor;
import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogManagerObserver;
import org.chromium.ui.modelutil.PropertyModel;
......@@ -106,6 +108,7 @@ public class RootUiCoordinator
private SnackbarManager mBottomSheetSnackbarManager;
private ScrimView mScrimView;
private ScrimCoordinator mScrimCoordinator;
private DirectActionInitializer mDirectActionInitializer;
private List<ButtonDataProvider> mButtonDataProviders;
private IdentityDiscController mIdentityDiscController;
......@@ -210,6 +213,13 @@ public class RootUiCoordinator
ViewGroup coordinator = mActivity.findViewById(R.id.coordinator);
mScrimView = new ScrimView(mActivity,
mActivity.getStatusBarColorController().getStatusBarScrimDelegate(), coordinator);
mScrimCoordinator = new ScrimCoordinator(mActivity,
(fraction) -> mActivity.getStatusBarColorController()
.getStatusBarScrimDelegate()
.setStatusBarScrimFraction(fraction),
coordinator,
ApiCompatibilityUtils.getColor(coordinator.getResources(),
R.color.omnibox_focused_fading_background_color));
mTabThemeColorProvider = new TabThemeColorProvider(mActivity);
mTabThemeColorProvider.setActivityTabProvider(mActivity.getActivityTabProvider());
......@@ -529,10 +539,11 @@ public class RootUiCoordinator
Supplier<OverlayPanelManager> panelManagerSupplier = ()
-> mActivity.getCompositorViewHolder().getLayoutManager().getOverlayPanelManager();
mBottomSheetController = new BottomSheetController(mActivity.getLifecycleDispatcher(),
mActivityTabProvider, this::getScrim, sheetViewSupplier, panelManagerSupplier,
mActivity.getFullscreenManager(), mActivity.getWindow(),
mActivity.getWindowAndroid().getKeyboardDelegate());
mBottomSheetController =
new BottomSheetController(mActivity.getLifecycleDispatcher(), mActivityTabProvider,
() -> mScrimCoordinator, sheetViewSupplier, panelManagerSupplier,
mActivity.getFullscreenManager(), mActivity.getWindow(),
mActivity.getWindowAndroid().getKeyboardDelegate());
mBottomSheetManager = new BottomSheetManager(mBottomSheetController, mActivityTabProvider,
mActivity::getFullscreenManager, mActivity::getModalDialogManager,
......@@ -578,4 +589,9 @@ public class RootUiCoordinator
public AppMenuCoordinator getAppMenuCoordinatorForTesting() {
return mAppMenuCoordinator;
}
@VisibleForTesting
public ScrimCoordinator getScrimCoordinatorForTesting() {
return mScrimCoordinator;
}
}
......@@ -24,10 +24,12 @@ import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabObserver;
import org.chromium.chrome.browser.ui.TabObscuringHandler;
import org.chromium.chrome.browser.vr.VrModuleProvider;
import org.chromium.chrome.browser.widget.ScrimView;
import org.chromium.chrome.browser.widget.ScrimView.ScrimObserver;
import org.chromium.chrome.browser.widget.ScrimView.ScrimParams;
import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator;
import org.chromium.components.browser_ui.widget.scrim.ScrimProperties;
import org.chromium.ui.KeyboardVisibilityDelegate;
import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.vr.VrModeObserver;
import java.lang.annotation.Retention;
......@@ -108,9 +110,6 @@ public class BottomSheetController implements Destroyable {
/** The offset of the toolbar shadow from the top that remains empty. */
private int mShadowTopOffset;
/** The parameters that control how the scrim behaves while the sheet is open. */
private ScrimParams mScrimParams;
/** A handle to the {@link BottomSheet} that this class controls. */
private BottomSheet mBottomSheet;
......@@ -155,7 +154,7 @@ public class BottomSheetController implements Destroyable {
* @param fullscreenManager A fullscreen manager for access to browser controls offsets.
*/
public BottomSheetController(final ActivityLifecycleDispatcher lifecycleDispatcher,
final ActivityTabProvider activityTabProvider, final Supplier<ScrimView> scrim,
final ActivityTabProvider activityTabProvider, final Supplier<ScrimCoordinator> scrim,
Supplier<View> bottomSheetViewSupplier, Supplier<OverlayPanelManager> overlayManager,
ChromeFullscreenManager fullscreenManager, Window window,
KeyboardVisibilityDelegate keyboardDelegate) {
......@@ -237,8 +236,8 @@ public class BottomSheetController implements Destroyable {
* @param bottomSheetViewSupplier A means of creating the bottom sheet.
*/
private void initializeSheet(final ActivityLifecycleDispatcher lifecycleDispatcher,
final Supplier<ScrimView> scrim, Supplier<View> bottomSheetViewSupplier, Window window,
KeyboardVisibilityDelegate keyboardDelegate) {
final Supplier<ScrimCoordinator> scrim, Supplier<View> bottomSheetViewSupplier,
Window window, KeyboardVisibilityDelegate keyboardDelegate) {
mBottomSheet = (BottomSheet) bottomSheetViewSupplier.get();
mBottomSheet.init(window, keyboardDelegate);
mToolbarShadowHeight = mBottomSheet.getResources().getDimensionPixelOffset(
......@@ -300,20 +299,31 @@ public class BottomSheetController implements Destroyable {
}
});
ScrimObserver scrimObserver = new ScrimObserver() {
@Override
public void onScrimClick() {
if (!mBottomSheet.isSheetOpen()) return;
mBottomSheet.setSheetState(
mBottomSheet.getMinSwipableSheetState(), true, StateChangeReason.TAP_SCRIM);
}
@Override
public void onScrimVisibilityChanged(boolean visible) {}
};
mScrimParams = new ScrimParams(mBottomSheet, false, true, 0, scrimObserver);
PropertyModel scrimProperties =
new PropertyModel.Builder(ScrimProperties.REQUIRED_KEYS)
.with(ScrimProperties.TOP_MARGIN, 0)
.with(ScrimProperties.AFFECTS_STATUS_BAR, true)
.with(ScrimProperties.ANCHOR_VIEW, mBottomSheet)
.with(ScrimProperties.SHOW_IN_FRONT_OF_ANCHOR_VIEW, false)
.with(ScrimProperties.CLICK_DELEGATE,
() -> {
if (!mBottomSheet.isSheetOpen()) return;
mBottomSheet.setSheetState(
mBottomSheet.getMinSwipableSheetState(), true,
StateChangeReason.TAP_SCRIM);
})
.build();
mBottomSheet.addObserver(new EmptyBottomSheetObserver() {
/**
* Whether the scrim was shown for the last content.
* TODO(mdjones): We should try to make sure the content in the sheet is not nulled
* prior to the close event occurring; sheets that don't have a peek
* state make this difficult since the sheet needs to be hidden before it
* is closed.
*/
private boolean mScrimShown;
@Override
public void onSheetOpened(@StateChangeReason int reason) {
if (mBottomSheet.getCurrentSheetContent() != null
......@@ -321,16 +331,16 @@ public class BottomSheetController implements Destroyable {
return;
}
scrim.get().showScrim(mScrimParams);
scrim.get().setViewAlpha(0);
scrim.get().showScrim(scrimProperties);
mScrimShown = true;
}
@Override
public void onSheetClosed(@StateChangeReason int reason) {
// Hide the scrim if the current content doesn't have a custom scrim lifecycle.
if (mBottomSheet.getCurrentSheetContent() == null
|| !mBottomSheet.getCurrentSheetContent().hasCustomScrimLifecycle()) {
if (mScrimShown) {
scrim.get().hideScrim(true);
mScrimShown = false;
}
// Try to swap contents unless the sheet's content has a custom lifecycle.
......
......@@ -30,9 +30,7 @@ import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.omnibox.UrlBar;
import org.chromium.chrome.browser.widget.ScrimView.ScrimObserver;
import org.chromium.chrome.browser.widget.ScrimView.ScrimParams;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetContent;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController;
import org.chromium.chrome.browser.widget.bottomsheet.TestBottomSheetContent;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
import org.chromium.chrome.test.util.OmniboxTestUtils;
......@@ -99,37 +97,6 @@ public class ScrimTest {
assertScrimVisibility(false);
}
@Test
@SmallTest
@Feature({"Scrim"})
public void testBottomSheetScrim() {
mScrim.disableAnimationForTesting(true);
assertScrimVisibility(false);
assertFalse("Nothing should be obscuring the tab.", isViewObscuringAllTabs());
assertEquals("The scrim alpha should be 0.", 0f, mScrim.getAlpha(), MathUtils.EPSILON);
ThreadUtils.runOnUiThreadBlocking(() -> {
mSheetController.requestShowContent(
new TestBottomSheetContent(mActivityTestRule.getActivity(),
BottomSheetContent.ContentPriority.HIGH, false),
false);
mSheetController.setSheetStateForTesting(BottomSheetController.SheetState.HALF, false);
});
assertScrimVisibility(true);
assertTrue("A view should be obscuring the tab.", isViewObscuringAllTabs());
assertEquals("The scrim alpha should be 0.", 0f, mScrim.getAlpha(), MathUtils.EPSILON);
ThreadUtils.runOnUiThreadBlocking(
()
-> mSheetController.setSheetStateForTesting(
BottomSheetController.SheetState.PEEK, false));
assertScrimVisibility(false);
assertFalse("Nothing should be obscuring the tab.", isViewObscuringAllTabs());
assertEquals("The scrim alpha should be 0.", 0f, mScrim.getAlpha(), MathUtils.EPSILON);
}
@Test
@SmallTest
@Feature({"Scrim"})
......
......@@ -6,6 +6,7 @@ package org.chromium.chrome.browser.widget.bottomsheet;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import android.support.test.InstrumentationRegistry;
......@@ -33,10 +34,10 @@ import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabLaunchType;
import org.chromium.chrome.browser.tab.TabSelectionType;
import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver;
import org.chromium.chrome.browser.widget.ScrimView;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
import org.chromium.chrome.test.util.ChromeTabUtils;
import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.ui.test.util.UiRestriction;
......@@ -62,7 +63,7 @@ public class BottomSheetControllerTest {
private TestBottomSheetContent mPeekableContent;
private TestBottomSheetContent mNonPeekableContent;
private TestBottomSheetContent mBackInterceptingContent;
private ScrimView mScrimView;
private ScrimCoordinator mScrimCoordinator;
@Before
public void setUp() throws Exception {
......@@ -73,7 +74,10 @@ public class BottomSheetControllerTest {
ViewGroup coordinator = activity.findViewById(org.chromium.chrome.R.id.coordinator);
BottomSheet.setSmallScreenForTesting(false);
mScrimView = activity.getScrim();
mScrimCoordinator = mActivityTestRule.getActivity()
.getRootUiCoordinatorForTesting()
.getScrimCoordinatorForTesting();
mScrimCoordinator.disableAnimationForTesting(true);
mSheetController = activity.getBottomSheetController();
......@@ -347,6 +351,24 @@ public class BottomSheetControllerTest {
assertEquals(customLifecycleContent, mSheetController.getCurrentSheetContent());
}
@Test
@MediumTest
public void testScrim() throws ExecutionException, TimeoutException {
requestContentInSheet(mLowPriorityContent, true);
assertNull("There should currently be no scrim.", mScrimCoordinator.getViewForTesting());
expandSheet();
assertEquals("The scrim should be visible.", View.VISIBLE,
((View) mScrimCoordinator.getViewForTesting()).getVisibility());
ThreadUtils.runOnUiThreadBlocking(() -> mSheetController.collapseSheet(false));
assertNull("There should be no scrim when the sheet is closed.",
mScrimCoordinator.getViewForTesting());
}
@Test
@MediumTest
public void testCustomScrimLifecycle() throws TimeoutException {
......@@ -357,8 +379,8 @@ public class BottomSheetControllerTest {
expandSheet();
assertEquals("The scrim should not be visible with a custom scrim lifecycle.", View.GONE,
mScrimView.getVisibility());
assertEquals("The scrim should not be visible with a custom scrim lifecycle.", null,
mScrimCoordinator.getViewForTesting());
}
@Test
......@@ -395,7 +417,8 @@ public class BottomSheetControllerTest {
expandSheet();
TestThreadUtils.runOnUiThreadBlocking(() -> mScrimView.performClick());
TestThreadUtils.runOnUiThreadBlocking(
() -> ((View) mScrimCoordinator.getViewForTesting()).callOnClick());
observer.mClosedCallbackHelper.waitForCallback(0);
}
......
......@@ -128,7 +128,7 @@ public class ScrimCoordinator {
}
@VisibleForTesting
ScrimView getViewForTesting() {
public ScrimView getViewForTesting() {
return mView;
}
......
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