Commit 6f475998 authored by Matt Jones's avatar Matt Jones Committed by Commit Bot

Move FullscreenManager interactions to glue code for BottomSheet

This patch also removes some obsolete logic from the days of Chrome
Home like whether the android version of the toolbar is showing.

Bug: 986310, 1002277
Change-Id: Ib939d02cdf783cc0fde30dbf7089171ae52c92a7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1909930Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Reviewed-by: default avatarDavid Trainor <dtrainor@chromium.org>
Commit-Queue: Matthew Jones <mdjones@chromium.org>
Cr-Commit-Position: refs/heads/master@{#715457}
parent 7c258567
......@@ -215,8 +215,7 @@ class AutofillAssistantUiTestUtil {
ViewGroup coordinator = activity.findViewById(R.id.coordinator);
LayoutInflater.from(activity).inflate(R.layout.bottom_sheet, coordinator);
BottomSheet bottomSheet = coordinator.findViewById(R.id.bottom_sheet);
bottomSheet.init(coordinator, activity.getActivityTabProvider(),
activity.getFullscreenManager(), activity.getWindow(),
bottomSheet.init(coordinator, activity.getActivityTabProvider(), activity.getWindow(),
activity.getWindowAndroid().getKeyboardDelegate());
return bottomSheet;
......@@ -227,7 +226,8 @@ class AutofillAssistantUiTestUtil {
()
-> activity.getCompositorViewHolder()
.getLayoutManager()
.getOverlayPanelManager());
.getOverlayPanelManager(),
activity.getFullscreenManager());
}
/**
......
......@@ -101,6 +101,7 @@ import org.chromium.chrome.browser.init.ProcessInitializationHandler;
import org.chromium.chrome.browser.init.StartupTabPreloader;
import org.chromium.chrome.browser.keyboard_accessory.ManualFillingComponent;
import org.chromium.chrome.browser.keyboard_accessory.ManualFillingComponentFactory;
import org.chromium.chrome.browser.lifecycle.Destroyable;
import org.chromium.chrome.browser.locale.LocaleManager;
import org.chromium.chrome.browser.media.PictureInPictureController;
import org.chromium.chrome.browser.metrics.ActivityTabStartupMetricsTracker;
......@@ -1428,7 +1429,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
ViewGroup coordinator = findViewById(R.id.coordinator);
getLayoutInflater().inflate(R.layout.bottom_sheet, coordinator);
BottomSheet sheet = coordinator.findViewById(R.id.bottom_sheet);
sheet.init(coordinator, getActivityTabProvider(), getFullscreenManager(), getWindow(),
sheet.init(coordinator, getActivityTabProvider(), getWindow(),
getWindowAndroid().getKeyboardDelegate());
mBottomSheetSnackbarManager = new SnackbarManager(
......@@ -1439,12 +1440,39 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
Supplier<OverlayPanelManager> panelManagerSupplier =
() -> getCompositorViewHolder().getLayoutManager().getOverlayPanelManager();
mBottomSheetController = new BottomSheetController(getLifecycleDispatcher(),
mActivityTabProvider, mScrimView, sheetSupplier, panelManagerSupplier);
mBottomSheetController =
new BottomSheetController(getLifecycleDispatcher(), mActivityTabProvider,
mScrimView, sheetSupplier, panelManagerSupplier, getFullscreenManager());
((BottomContainer) findViewById(R.id.bottom_container))
.setBottomSheetController(mBottomSheetController);
ChromeFullscreenManager.FullscreenListener fullscreenListener =
new ChromeFullscreenManager.FullscreenListener() {
@Override
public void onContentOffsetChanged(int offset) {}
@Override
public void onControlsOffsetChanged(
int topOffset, int bottomOffset, boolean needsAnimate) {}
@Override
public void onToggleOverlayVideoMode(boolean enabled) {
if (mBottomSheetController.isSheetOpen()) {
mBottomSheetController.peekSheet(false);
}
}
@Override
public void onBottomControlsHeightChanged(int bottomControlsHeight) {}
};
getFullscreenManager().addListener(fullscreenListener);
getLifecycleDispatcher().register((Destroyable) () -> {
if (mFullscreenManager == null) return;
mFullscreenManager.removeListener(fullscreenListener);
});
mBottomSheetController.addObserver(new EmptyBottomSheetObserver() {
/** A token for suppressing app modal dialogs. */
private int mAppModalToken = TokenHolder.INVALID_TOKEN;
......
......@@ -29,12 +29,9 @@ import org.chromium.base.Supplier;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ActivityTabProvider;
import org.chromium.chrome.browser.TabLoadStatus;
import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager.FullscreenListener;
import org.chromium.chrome.browser.gesturenav.HistoryNavigationDelegate;
import org.chromium.chrome.browser.native_page.NativePageHost;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabBrowserControlsState;
import org.chromium.chrome.browser.util.AccessibilityUtil;
import org.chromium.chrome.browser.util.MathUtils;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetContent.HeightMode;
......@@ -43,7 +40,6 @@ import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController.Stat
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_public.browser.SelectionPopupController;
import org.chromium.content_public.browser.WebContents;
import org.chromium.content_public.common.BrowserControlsState;
import org.chromium.ui.KeyboardVisibilityDelegate;
/**
......@@ -138,9 +134,6 @@ public class BottomSheet
/** Used for getting the current tab. */
protected Supplier<Tab> mTabSupplier;
/** The fullscreen manager for information about toolbar offsets. */
private ChromeFullscreenManager mFullscreenManager;
/** A handle to the content being shown by the sheet. */
@Nullable
protected BottomSheetContent mSheetContent;
......@@ -175,8 +168,8 @@ public class BottomSheet
/** Whether {@link #destroy()} has been called. **/
private boolean mIsDestroyed;
/** The token used to enable browser controls persistence. */
private int mPersistentControlsToken;
/** The ratio in the range [0, 1] that the browser controls are hidden. */
private float mBrowserControlsHiddenRatio;
@Override
public boolean shouldGestureMoveSheet(MotionEvent initialEvent, MotionEvent currentEvent) {
......@@ -264,22 +257,11 @@ public class BottomSheet
// anything with them.
if (!mIsTouchEnabled) return true;
if (isToolbarAndroidViewHidden()) return false;
mGestureDetector.onTouchEvent(e);
return true;
}
/**
* @return Whether or not the toolbar Android View is hidden due to being scrolled off-screen.
*/
@VisibleForTesting
boolean isToolbarAndroidViewHidden() {
return mFullscreenManager == null || mFullscreenManager.getBottomControlOffset() > 0
|| mToolbarHolder.getVisibility() != VISIBLE;
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
......@@ -295,16 +277,12 @@ public class BottomSheet
* calculations in this class.
* @param root The container of the bottom sheet.
* @param tabProvider A means of accessing the active tab.
* @param fullscreenManager A fullscreen manager for persisting browser controls and
* determining their offset.
* @param window Android window for getting insets.
* @param keyboardDelegate Delegate for hiding the keyboard.
*/
public void init(View root, ActivityTabProvider tabProvider,
ChromeFullscreenManager fullscreenManager, Window window,
public void init(View root, ActivityTabProvider tabProvider, Window window,
KeyboardVisibilityDelegate keyboardDelegate) {
mTabSupplier = tabProvider;
mFullscreenManager = fullscreenManager;
mToolbarHolder =
(TouchRestrictingFrameLayout) findViewById(R.id.bottom_sheet_toolbar_container);
......@@ -405,47 +383,25 @@ public class BottomSheet
return;
}
if (!mGestureDetector.isScrolling()) {
if (!mGestureDetector.isScrolling() && isRunningSettleAnimation()) return;
// This onLayoutChange() will be called after the user enters fullscreen video
// mode. Ensure the sheet state is reset to peek so that the sheet does not
// open over the fullscreen video. See crbug.com/740499.
if (mFullscreenManager != null
&& mFullscreenManager.getPersistentFullscreenMode() && isSheetOpen()) {
setSheetState(getMinSwipableSheetState(), false);
} else {
if (isRunningSettleAnimation()) return;
setSheetState(mCurrentState, false);
}
}
setSheetState(mCurrentState, false);
}
});
mFullscreenManager.addListener(new FullscreenListener() {
@Override
public void onToggleOverlayVideoMode(boolean enabled) {
if (isSheetOpen()) setSheetState(SheetState.PEEK, false);
}
@Override
public void onControlsOffsetChanged(
int topOffset, int bottomOffset, boolean needsAnimate) {
if (getSheetState() == SheetState.HIDDEN) return;
if (getCurrentOffsetPx() > getSheetHeightForState(SheetState.PEEK)) return;
// Updating the offset will automatically account for the browser controls.
setSheetOffsetFromBottom(getCurrentOffsetPx(), StateChangeReason.SWIPE);
}
mSheetContainer = (ViewGroup) this.getParent();
mSheetContainer.removeView(this);
}
@Override
public void onContentOffsetChanged(int offset) {}
/** @param ratio The current browser controls hidden ratio. */
void setBrowserControlsHiddenRatio(float ratio) {
mBrowserControlsHiddenRatio = ratio;
@Override
public void onBottomControlsHeightChanged(int bottomControlsHeight) {}
});
if (getSheetState() == SheetState.HIDDEN) return;
if (getCurrentOffsetPx() > getSheetHeightForState(SheetState.PEEK)) return;
mSheetContainer = (ViewGroup) this.getParent();
mSheetContainer.removeView(this);
// Updating the offset will automatically account for the browser controls.
setSheetOffsetFromBottom(getCurrentOffsetPx(), StateChangeReason.SWIPE);
}
@Override
......@@ -607,15 +563,6 @@ public class BottomSheet
mIsSheetOpen = true;
// Make sure the toolbar is visible before expanding the sheet.
if (isToolbarAndroidViewHidden()) {
TabBrowserControlsState.update(getActiveTab(), BrowserControlsState.SHOWN, false);
}
// Browser controls should stay visible until the sheet is closed.
mPersistentControlsToken =
mFullscreenManager.getBrowserVisibilityDelegate().showControlsPersistent();
dismissSelectedText();
for (BottomSheetObserver o : mObservers) o.onSheetOpened(reason);
}
......@@ -629,10 +576,6 @@ public class BottomSheet
if (!mIsSheetOpen) return;
mIsSheetOpen = false;
// Update the browser controls since they are permanently shown while the sheet is open.
mFullscreenManager.getBrowserVisibilityDelegate().releasePersistentShowingToken(
mPersistentControlsToken);
for (BottomSheetObserver o : mObservers) o.onSheetClosed(reason);
// If the sheet contents are cleared out before #onSheetClosed is called, do not try to
// retrieve the accessibility string.
......@@ -700,8 +643,7 @@ public class BottomSheet
return 0;
}
float peekHeight = getPeekRatio() * mContainerHeight;
return peekHeight * mFullscreenManager.getBrowserControlHiddenRatio();
return getPeekRatio() * mContainerHeight * mBrowserControlsHiddenRatio;
}
/**
......@@ -1210,8 +1152,7 @@ public class BottomSheet
boolean isFindInPageVisible =
mFindInPageView != null && mFindInPageView.getVisibility() == View.VISIBLE;
return !isToolbarAndroidViewHidden() && !isFindInPageVisible
&& mTargetState != SheetState.HIDDEN;
return !isFindInPageVisible && mTargetState != SheetState.HIDDEN;
}
/**
......
......@@ -15,6 +15,8 @@ import org.chromium.chrome.browser.ActivityTabProvider.HintlessActivityTabObserv
import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel;
import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager;
import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
import org.chromium.chrome.browser.fullscreen.FullscreenOptions;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
import org.chromium.chrome.browser.lifecycle.Destroyable;
import org.chromium.chrome.browser.tab.EmptyTabObserver;
......@@ -89,6 +91,9 @@ public class BottomSheetController implements Destroyable {
/** A {@link VrModeObserver} that observers events of entering and exiting VR mode. */
private final VrModeObserver mVrModeObserver;
/** A listener for browser controls offset changes. */
private final ChromeFullscreenManager.FullscreenListener mFullscreenListener;
/** The height of the shadow that sits above the toolbar. */
private final int mToolbarShadowHeight;
......@@ -113,6 +118,12 @@ public class BottomSheetController implements Destroyable {
/** A means for getting the activity's current tab and observing change events. */
private ActivityTabProvider mTabProvider;
/** Observer for watching the current tab. */
private ActivityTabProvider.ActivityTabTabObserver mTabObserver;
/** A fullscreen manager for polling browser controls offsets. */
private ChromeFullscreenManager mFullscreenManager;
/** The last known activity tab, if available. */
private Tab mLastActivityTab;
......@@ -133,17 +144,43 @@ public class BottomSheetController implements Destroyable {
* @param bottomSheetSupplier A mechanism for creating a {@link BottomSheet}.
* @param overlayManager A supplier of the manager for overlay panels to attach listeners to.
* This is a supplier to get around wating for native to be initialized.
* @param fullscreenManager A fullscreen manager for access to browser controls offsets.
*/
public BottomSheetController(final ActivityLifecycleDispatcher lifecycleDispatcher,
final ActivityTabProvider activityTabProvider, final ScrimView scrim,
Supplier<BottomSheet> bottomSheetSupplier,
Supplier<OverlayPanelManager> overlayManager) {
Supplier<BottomSheet> bottomSheetSupplier, Supplier<OverlayPanelManager> overlayManager,
ChromeFullscreenManager fullscreenManager) {
mTabProvider = activityTabProvider;
mOverlayPanelManager = overlayManager;
mFullscreenManager = fullscreenManager;
mPendingSheetObservers = new ArrayList<>();
mToolbarShadowHeight =
scrim.getResources().getDimensionPixelOffset(BottomSheet.getTopShadowResourceId());
mPendingSheetObservers.add(new EmptyBottomSheetObserver() {
/** The token used to enable browser controls persistence. */
private int mPersistentControlsToken;
@Override
public void onSheetOpened(int reason) {
if (mFullscreenManager.getBrowserVisibilityDelegate() == null) return;
// Browser controls should stay visible until the sheet is closed.
mPersistentControlsToken =
mFullscreenManager.getBrowserVisibilityDelegate().showControlsPersistent();
}
@Override
public void onSheetClosed(int reason) {
if (mFullscreenManager.getBrowserVisibilityDelegate() == null) return;
// Update the browser controls since they are permanently shown while the sheet is
// open.
mFullscreenManager.getBrowserVisibilityDelegate().releasePersistentShowingToken(
mPersistentControlsToken);
}
});
mVrModeObserver = new VrModeObserver() {
@Override
public void onEnterVr() {
......@@ -156,7 +193,30 @@ public class BottomSheetController implements Destroyable {
}
};
mSheetInitializer = () -> initializeSheet(lifecycleDispatcher, scrim, bottomSheetSupplier);
mFullscreenListener = new ChromeFullscreenManager.FullscreenListener() {
@Override
public void onContentOffsetChanged(int offset) {}
@Override
public void onControlsOffsetChanged(
int topOffset, int bottomOffset, boolean needsAnimate) {
if (mBottomSheet != null) {
mBottomSheet.setBrowserControlsHiddenRatio(
mFullscreenManager.getBrowserControlHiddenRatio());
}
}
@Override
public void onToggleOverlayVideoMode(boolean enabled) {}
@Override
public void onBottomControlsHeightChanged(int bottomControlsHeight) {}
};
mFullscreenManager.addListener(mFullscreenListener);
mSheetInitializer = () -> {
initializeSheet(lifecycleDispatcher, scrim, bottomSheetSupplier);
};
}
/**
......@@ -223,6 +283,18 @@ public class BottomSheetController implements Destroyable {
}
});
mTabObserver = new ActivityTabProvider.ActivityTabTabObserver(mTabProvider) {
@Override
public void onEnterFullscreenMode(Tab tab, FullscreenOptions options) {
suppressSheet(StateChangeReason.COMPOSITED_UI);
}
@Override
public void onExitFullscreenMode(Tab tab) {
unsuppressSheet();
}
};
ScrimObserver scrimObserver = new ScrimObserver() {
@Override
public void onScrimClick() {
......@@ -292,7 +364,9 @@ public class BottomSheetController implements Destroyable {
@Override
public void destroy() {
VrModuleProvider.unregisterVrModeObserver(mVrModeObserver);
mFullscreenManager.removeListener(mFullscreenListener);
if (mBottomSheet != null) mBottomSheet.destroy();
if (mTabObserver != null) mTabObserver.destroy();
}
/**
......
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