Commit 2d3c8ab9 authored by khushalsagar's avatar khushalsagar Committed by Commit bot

chrome/android: Push EventFilters into the Layout implementations.

EventFilters are currently built by the LayoutManager and all gestures
are routed through it to the active layout. This indirection is
unnecessary since only the StackLayout requires gesture handling. This
also ends up exposing public APIs on the Layouts making it difficult to
follow the path for events from different sources (CompositorView vs
the Toolbar).

This change pushes EventFilters deeper into the Layout implementations,
so the Layouts directly consume touch events and generate gestures if
necessary. Layout still has an API for swipe gestures coming from the
toolbar.

BUG=

Review-Url: https://codereview.chromium.org/2774443002
Cr-Original-Commit-Position: refs/heads/master@{#459980}
Committed: https://chromium.googlesource.com/chromium/src/+/ef25f0df9d626028752de7d945d89abe15d39dfb
Review-Url: https://codereview.chromium.org/2774443002
Cr-Commit-Position: refs/heads/master@{#460525}
parent f8e03c0c
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.compositor.layouts;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.GestureHandler;
/**
* A {@link GestureHandler} that takes a {@link LayoutProvider} and delegates all gesture events
* to {@link LayoutProvider#getActiveLayout()}.
*/
class GestureHandlerLayoutDelegate implements GestureHandler {
private final LayoutProvider mLayoutProvider;
/**
* Creates an instance of the {@link GestureHandlerLayoutDelegate}.
* @param provider A {@link LayoutProvider} instance.
*/
public GestureHandlerLayoutDelegate(LayoutProvider provider) {
mLayoutProvider = provider;
}
@Override
public void onDown(float x, float y, boolean fromMouse, int buttons) {
if (mLayoutProvider.getActiveLayout() == null) return;
mLayoutProvider.getActiveLayout().onDown(LayoutManager.time(), x, y);
}
@Override
public void onUpOrCancel() {
if (mLayoutProvider.getActiveLayout() == null) return;
mLayoutProvider.getActiveLayout().onUpOrCancel(LayoutManager.time());
}
@Override
public void drag(float x, float y, float dx, float dy, float tx, float ty) {
if (mLayoutProvider.getActiveLayout() == null) return;
mLayoutProvider.getActiveLayout().drag(LayoutManager.time(), x, y, dx, dy);
}
@Override
public void click(float x, float y, boolean fromMouse, int buttons) {
if (mLayoutProvider.getActiveLayout() == null) return;
mLayoutProvider.getActiveLayout().click(LayoutManager.time(), x, y);
}
@Override
public void fling(float x, float y, float velocityX, float velocityY) {
if (mLayoutProvider.getActiveLayout() == null) return;
mLayoutProvider.getActiveLayout().fling(LayoutManager.time(), x, y, velocityX, velocityY);
}
@Override
public void onLongPress(float x, float y) {
if (mLayoutProvider.getActiveLayout() == null) return;
mLayoutProvider.getActiveLayout().onLongPress(LayoutManager.time(), x, y);
}
@Override
public void onPinch(float x0, float y0, float x1, float y1, boolean firstEvent) {
if (mLayoutProvider.getActiveLayout() == null) return;
mLayoutProvider.getActiveLayout().onPinch(LayoutManager.time(), x0, y0, x1, y1, firstEvent);
}
}
\ No newline at end of file
......@@ -99,7 +99,6 @@ public abstract class Layout implements TabContentManager.ThumbnailChangeListene
// Helpers
private final LayoutUpdateHost mUpdateHost;
protected final LayoutRenderHost mRenderHost;
private EventFilter mEventFilter;
/** The tabs currently being rendered as part of this layout. The tabs are
* drawn using the same ordering as this array. */
......@@ -120,14 +119,11 @@ public abstract class Layout implements TabContentManager.ThumbnailChangeListene
* @param context The current Android's context.
* @param updateHost The parent {@link LayoutUpdateHost}.
* @param renderHost The parent {@link LayoutRenderHost}.
* @param eventFilter The {@link EventFilter} this {@link Layout} is listening to.
*/
public Layout(Context context, LayoutUpdateHost updateHost, LayoutRenderHost renderHost,
EventFilter eventFilter) {
public Layout(Context context, LayoutUpdateHost updateHost, LayoutRenderHost renderHost) {
mContext = context;
mUpdateHost = updateHost;
mRenderHost = renderHost;
mEventFilter = eventFilter;
// Invalid sizes
mWidthDp = -1;
......@@ -571,69 +567,6 @@ public abstract class Layout implements TabContentManager.ThumbnailChangeListene
return false;
}
/**
* Called on touch drag event.
* @param time The current time of the app in ms.
* @param x The y coordinate of the end of the drag event.
* @param y The y coordinate of the end of the drag event.
* @param deltaX The number of pixels dragged in the x direction.
* @param deltaY The number of pixels dragged in the y direction.
*/
public void drag(long time, float x, float y, float deltaX, float deltaY) { }
/**
* Called on touch fling event. This is called before the onUpOrCancel event.
*
* @param time The current time of the app in ms.
* @param x The y coordinate of the start of the fling event.
* @param y The y coordinate of the start of the fling event.
* @param velocityX The amount of velocity in the x direction.
* @param velocityY The amount of velocity in the y direction.
*/
public void fling(long time, float x, float y, float velocityX, float velocityY) { }
/**
* Called on onDown event.
*
* @param time The time stamp in millisecond of the event.
* @param x The x position of the event.
* @param y The y position of the event.
*/
public void onDown(long time, float x, float y) { }
/**
* Called on long press touch event.
* @param time The current time of the app in ms.
* @param x The x coordinate of the position of the press event.
* @param y The y coordinate of the position of the press event.
*/
public void onLongPress(long time, float x, float y) { }
/**
* Called on click. This is called before the onUpOrCancel event.
* @param time The current time of the app in ms.
* @param x The x coordinate of the position of the click.
* @param y The y coordinate of the position of the click.
*/
public void click(long time, float x, float y) { }
/**
* Called on up or cancel touch events. This is called after the click and fling event if any.
* @param time The current time of the app in ms.
*/
public void onUpOrCancel(long time) { }
/**
* Called when at least 2 touch events are detected.
* @param time The current time of the app in ms.
* @param x0 The x coordinate of the first touch event.
* @param y0 The y coordinate of the first touch event.
* @param x1 The x coordinate of the second touch event.
* @param y1 The y coordinate of the second touch event.
* @param firstEvent The pinch is the first of a sequence of pinch events.
*/
public void onPinch(long time, float x0, float y0, float x1, float y1, boolean firstEvent) { }
/**
* Called by the LayoutManager when an animation should be killed.
*/
......@@ -1037,15 +970,6 @@ public abstract class Layout implements TabContentManager.ThumbnailChangeListene
return false;
}
/**
* Setting this will only take effect the next time this layout is shown. If it is currently
* showing the original filter will still be used.
* @param filter
*/
public void setEventFilter(EventFilter filter) {
mEventFilter = filter;
}
/**
* @param e The {@link MotionEvent} to consider.
* @param offsets The current touch offsets that should be applied to the
......@@ -1064,9 +988,14 @@ public abstract class Layout implements TabContentManager.ThumbnailChangeListene
if (eventFilter.onInterceptTouchEvent(e, isKeyboardShowing)) return eventFilter;
}
if (mEventFilter != null) {
if (offsets != null) mEventFilter.setCurrentMotionEventOffsets(offsets.x, offsets.y);
if (mEventFilter.onInterceptTouchEvent(e, isKeyboardShowing)) return mEventFilter;
EventFilter layoutEventFilter = getEventFilter();
if (layoutEventFilter != null) {
if (offsets != null) {
layoutEventFilter.setCurrentMotionEventOffsets(offsets.x, offsets.y);
}
if (layoutEventFilter.onInterceptTouchEvent(e, isKeyboardShowing)) {
return layoutEventFilter;
}
}
return null;
}
......@@ -1127,11 +1056,9 @@ public abstract class Layout implements TabContentManager.ThumbnailChangeListene
}
/**
* @return Whether the tabstrip's event filter is enabled.
* @return The EventFilter to use for processing events for this Layout.
*/
public boolean isTabStripEventFilterEnabled() {
return true;
}
protected abstract EventFilter getEventFilter();
/**
* Get an instance of {@link SceneLayer}. Any class inheriting {@link Layout}
......
......@@ -13,10 +13,7 @@ import org.chromium.chrome.browser.compositor.TitleCache;
import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab;
import org.chromium.chrome.browser.compositor.layouts.components.VirtualView;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.BlackHoleEventFilter;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.EdgeSwipeHandler;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilter;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.GestureEventFilter;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.ScrollDirection;
import org.chromium.chrome.browser.compositor.layouts.phone.StackLayout;
import org.chromium.chrome.browser.compositor.overlays.SceneOverlay;
......@@ -58,11 +55,6 @@ public class LayoutManagerChrome
/** A {@link Layout} that should be used when the user is in the tab switcher. */
protected Layout mOverviewLayout;
// Event Filters
/** A {@link EventFilter} that consumes all touch events. */
protected EventFilter mBlackHoleEventFilter;
private final GestureEventFilter mGestureEventFilter;
// Event Filter Handlers
private final EdgeSwipeHandler mToolbarSwipeHandler;
......@@ -166,17 +158,11 @@ public class LayoutManagerChrome
// Build Event Filter Handlers
mToolbarSwipeHandler = createToolbarSwipeHandler(this);
// Build Event Filters
mBlackHoleEventFilter = new BlackHoleEventFilter(context);
mGestureEventFilter = new GestureEventFilter(context, mGestureHandler);
// Build Layouts
mOverviewListLayout =
new OverviewListLayout(context, this, renderHost, mBlackHoleEventFilter);
mToolbarSwipeLayout =
new ToolbarSwipeLayout(context, this, renderHost, mBlackHoleEventFilter);
mOverviewListLayout = new OverviewListLayout(context, this, renderHost);
mToolbarSwipeLayout = new ToolbarSwipeLayout(context, this, renderHost);
if (createOverviewLayout) {
mOverviewLayout = new StackLayout(context, this, renderHost, mGestureEventFilter);
mOverviewLayout = new StackLayout(context, this, renderHost);
}
}
......@@ -316,7 +302,9 @@ public class LayoutManagerChrome
*/
@VisibleForTesting
public void simulateClick(float x, float y) {
if (getActiveLayout() != null) getActiveLayout().click(time(), x, y);
if (getActiveLayout() instanceof StackLayout) {
((StackLayout) getActiveLayout()).simulateClick(x, y);
}
}
/**
......@@ -328,10 +316,8 @@ public class LayoutManagerChrome
*/
@VisibleForTesting
public void simulateDrag(float x, float y, float dX, float dY) {
if (getActiveLayout() != null) {
getActiveLayout().onDown(0, x, y);
getActiveLayout().drag(0, x, y, dX, dY);
getActiveLayout().onUpOrCancel(time());
if (getActiveLayout() instanceof StackLayout) {
((StackLayout) getActiveLayout()).simulateDrag(x, y, dX, dY);
}
}
......
......@@ -39,8 +39,7 @@ public class LayoutManagerChromePhone extends LayoutManagerChrome {
LayoutRenderHost renderHost = host.getLayoutRenderHost();
// Build Layouts
mSimpleAnimationLayout =
new SimpleAnimationLayout(context, this, renderHost, mBlackHoleEventFilter);
mSimpleAnimationLayout = new SimpleAnimationLayout(context, this, renderHost);
// Set up layout parameters
mStaticLayout.setLayoutHandlesTabLifecycles(false);
......
......@@ -6,14 +6,10 @@ package org.chromium.chrome.browser.compositor.layouts;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.RectF;
import android.view.MotionEvent;
import android.view.ViewGroup;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.AreaGestureEventFilter;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.GestureHandler;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.ScrollDirection;
import org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutHelperManager;
import org.chromium.chrome.browser.contextualsearch.ContextualSearchManagementDelegate;
......@@ -33,9 +29,6 @@ import java.util.List;
* the tablet.
*/
public class LayoutManagerChromeTablet extends LayoutManagerChrome {
// Event Filters
private final TabStripEventFilter mTabStripFilter;
// Internal State
private final String mDefaultTitle;
......@@ -50,12 +43,8 @@ public class LayoutManagerChromeTablet extends LayoutManagerChrome {
super(host, false);
Context context = host.getContext();
// Build Event Filters
mTabStripFilter =
new TabStripEventFilter(context, new TabStripEventHandler(), null, false, false);
mTabStripLayoutHelperManager = new StripLayoutHelperManager(
context, this, mHost.getLayoutRenderHost(), mTabStripFilter);
mTabStripLayoutHelperManager =
new StripLayoutHelperManager(context, this, mHost.getLayoutRenderHost());
// Set up state
mDefaultTitle = context.getString(R.string.tab_loading_default_title);
......@@ -207,57 +196,4 @@ public class LayoutManagerChromeTablet extends LayoutManagerChrome {
return super.isSwipeEnabled(direction);
}
}
private class TabStripEventHandler implements GestureHandler {
@Override
public void onDown(float x, float y, boolean fromMouse, int buttons) {
mTabStripLayoutHelperManager.onDown(time(), x, y, fromMouse, buttons);
}
@Override
public void onUpOrCancel() {
mTabStripLayoutHelperManager.onUpOrCancel(time());
}
@Override
public void drag(float x, float y, float dx, float dy, float tx, float ty) {
mTabStripLayoutHelperManager.drag(time(), x, y, dx, dy, tx, ty);
}
@Override
public void click(float x, float y, boolean fromMouse, int buttons) {
mTabStripLayoutHelperManager.click(time(), x, y, fromMouse, buttons);
}
@Override
public void fling(float x, float y, float velocityX, float velocityY) {
mTabStripLayoutHelperManager.fling(time(), x, y, velocityX, velocityY);
}
@Override
public void onLongPress(float x, float y) {
mTabStripLayoutHelperManager.onLongPress(time(), x, y);
}
@Override
public void onPinch(float x0, float y0, float x1, float y1, boolean firstEvent) {
// Not implemented.
}
}
private class TabStripEventFilter extends AreaGestureEventFilter {
public TabStripEventFilter(Context context, GestureHandler handler, RectF triggerRect,
boolean autoOffset, boolean useDefaultLongPress) {
super(context, handler, triggerRect, autoOffset, useDefaultLongPress);
}
@Override
public boolean onInterceptTouchEventInternal(MotionEvent e, boolean isKeyboardShowing) {
if (getActiveLayout().isTabStripEventFilterEnabled()) {
return super.onInterceptTouchEventInternal(e, isKeyboardShowing);
}
return false;
}
}
}
......@@ -22,7 +22,6 @@ import org.chromium.chrome.browser.compositor.layouts.components.VirtualView;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.EdgeSwipeHandler;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.EmptyEdgeSwipeHandler;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.GestureHandler;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.ScrollDirection;
import org.chromium.chrome.browser.compositor.overlays.SceneOverlay;
import org.chromium.chrome.browser.compositor.scene_layer.ToolbarSceneLayer;
......@@ -57,10 +56,6 @@ public class LayoutManagerDocument extends LayoutManager
// Event Filters
private final EdgeSwipeHandler mToolbarSwipeHandler;
// Event Filter Handlers
/** A {@link GestureHandler} that will delegate all events to {@link #getActiveLayout()}. */
protected final GestureHandler mGestureHandler;
// Internal State
private final SparseArray<LayoutTab> mTabCache = new SparseArray<LayoutTab>();
private final ContextualSearchPanel mContextualSearchPanel;
......@@ -86,7 +81,6 @@ public class LayoutManagerDocument extends LayoutManager
mToolbarOverlay = new ToolbarSceneLayer(mContext, this, renderHost);
// Build Event Filter Handlers
mGestureHandler = new GestureHandlerLayoutDelegate(this);
mToolbarSwipeHandler = new ToolbarSwipeHandler(this);
mOverlayPanelManager = new OverlayPanelManager();
......
......@@ -61,12 +61,11 @@ public class StaticLayout extends Layout {
* @param context The current Android's context.
* @param updateHost The {@link LayoutUpdateHost} view for this layout.
* @param renderHost The {@link LayoutRenderHost} view for this layout.
* @param eventFilter The {@link EventFilter} that is needed for this view.
* @param panelManager The {@link OverlayPanelManager} responsible for showing panels.
*/
public StaticLayout(Context context, LayoutUpdateHost updateHost, LayoutRenderHost renderHost,
EventFilter eventFilter, OverlayPanelManager panelManager) {
super(context, updateHost, renderHost, eventFilter);
super(context, updateHost, renderHost);
mHandler = new Handler();
mUnstallRunnable = new UnstallRunnable();
......@@ -213,6 +212,11 @@ public class StaticLayout extends Layout {
return mLayoutTabs != null && mLayoutTabs.length > 0;
}
@Override
protected EventFilter getEventFilter() {
return null;
}
@Override
protected SceneLayer getSceneLayer() {
return mSceneLayer;
......
......@@ -16,6 +16,7 @@ import org.chromium.chrome.browser.compositor.LayerTitleCache;
import org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.Animatable;
import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.BlackHoleEventFilter;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilter;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.ScrollDirection;
import org.chromium.chrome.browser.compositor.scene_layer.SceneLayer;
......@@ -69,6 +70,7 @@ public class ToolbarSwipeLayout extends Layout implements Animatable<ToolbarSwip
private final float mSpaceBetweenTabs;
private final float mCommitDistanceFromEdge;
private final BlackHoleEventFilter mBlackHoleEventFilter;
private final TabListSceneLayer mSceneLayer;
private final Interpolator mEdgeInterpolator = new DecelerateInterpolator();
......@@ -79,9 +81,10 @@ public class ToolbarSwipeLayout extends Layout implements Animatable<ToolbarSwip
* @param renderHost The {@link LayoutRenderHost} view for this layout.
* @param eventFilter The {@link EventFilter} that is needed for this view.
*/
public ToolbarSwipeLayout(Context context, LayoutUpdateHost updateHost,
LayoutRenderHost renderHost, EventFilter eventFilter) {
super(context, updateHost, renderHost, eventFilter);
public ToolbarSwipeLayout(
Context context, LayoutUpdateHost updateHost, LayoutRenderHost renderHost) {
super(context, updateHost, renderHost);
mBlackHoleEventFilter = new BlackHoleEventFilter(context);
Resources res = context.getResources();
final float pxToDp = 1.0f / res.getDisplayMetrics().density;
mCommitDistanceFromEdge = res.getDimension(R.dimen.toolbar_swipe_commit_distance) * pxToDp;
......@@ -354,6 +357,11 @@ public class ToolbarSwipeLayout extends Layout implements Animatable<ToolbarSwip
@Override
public void onPropertyAnimationFinished(Property prop) {}
@Override
protected EventFilter getEventFilter() {
return mBlackHoleEventFilter;
}
@Override
protected SceneLayer getSceneLayer() {
return mSceneLayer;
......
......@@ -15,6 +15,7 @@ import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost;
import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.BlackHoleEventFilter;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilter;
import org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack;
import org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation;
......@@ -66,6 +67,7 @@ public class SimpleAnimationLayout
private LayoutTab mAnimatedTab;
private final TabListSceneLayer mSceneLayer;
private final BlackHoleEventFilter mBlackHoleEventFilter;
/**
* Creates an instance of the {@link SimpleAnimationLayout}.
......@@ -74,9 +76,10 @@ public class SimpleAnimationLayout
* @param renderHost The {@link LayoutRenderHost} view for this layout.
* @param eventFilter The {@link EventFilter} that is needed for this view.
*/
public SimpleAnimationLayout(Context context, LayoutUpdateHost updateHost,
LayoutRenderHost renderHost, EventFilter eventFilter) {
super(context, updateHost, renderHost, eventFilter);
public SimpleAnimationLayout(
Context context, LayoutUpdateHost updateHost, LayoutRenderHost renderHost) {
super(context, updateHost, renderHost);
mBlackHoleEventFilter = new BlackHoleEventFilter(context);
mSceneLayer = new TabListSceneLayer();
}
......@@ -406,6 +409,11 @@ public class SimpleAnimationLayout
@Override
public void onPropertyAnimationFinished(Property prop) {}
@Override
protected EventFilter getEventFilter() {
return mBlackHoleEventFilter;
}
@Override
protected SceneLayer getSceneLayer() {
return mSceneLayer;
......
......@@ -11,6 +11,7 @@ import android.graphics.RectF;
import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.compositor.LayerTitleCache;
import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost;
import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
import org.chromium.chrome.browser.compositor.layouts.components.CompositorButton;
......@@ -18,6 +19,7 @@ import org.chromium.chrome.browser.compositor.layouts.components.CompositorButto
import org.chromium.chrome.browser.compositor.layouts.components.VirtualView;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.AreaGestureEventFilter;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilter;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.GestureHandler;
import org.chromium.chrome.browser.compositor.overlays.SceneOverlay;
import org.chromium.chrome.browser.compositor.scene_layer.SceneOverlayLayer;
import org.chromium.chrome.browser.compositor.scene_layer.TabStripSceneLayer;
......@@ -69,18 +71,75 @@ public class StripLayoutHelperManager implements SceneOverlay {
private TabStripSceneLayer mTabStripTreeProvider;
private TabStripEventHandler mTabStripEventHandler;
private class TabStripEventHandler implements GestureHandler {
@Override
public void onDown(float x, float y, boolean fromMouse, int buttons) {
if (mModelSelectorButton.onDown(x, y)) return;
getActiveStripLayoutHelper().onDown(time(), x, y, fromMouse, buttons);
}
@Override
public void onUpOrCancel() {
if (mModelSelectorButton.onUpOrCancel() && mTabModelSelector != null) {
getActiveStripLayoutHelper().finishAnimation();
if (!mModelSelectorButton.isVisible()) return;
mTabModelSelector.selectModel(!mTabModelSelector.isIncognitoSelected());
return;
}
getActiveStripLayoutHelper().onUpOrCancel(time());
}
@Override
public void drag(float x, float y, float dx, float dy, float tx, float ty) {
mModelSelectorButton.drag(x, y);
getActiveStripLayoutHelper().drag(time(), x, y, dx, dy, tx, ty);
}
@Override
public void click(float x, float y, boolean fromMouse, int buttons) {
long time = time();
if (mModelSelectorButton.click(x, y)) {
mModelSelectorButton.handleClick(time);
return;
}
getActiveStripLayoutHelper().click(time(), x, y, fromMouse, buttons);
}
@Override
public void fling(float x, float y, float velocityX, float velocityY) {
getActiveStripLayoutHelper().fling(time(), x, y, velocityX, velocityY);
}
@Override
public void onLongPress(float x, float y) {
getActiveStripLayoutHelper().onLongPress(time(), x, y);
}
@Override
public void onPinch(float x0, float y0, float x1, float y1, boolean firstEvent) {
// Not implemented.
}
private long time() {
return LayoutManager.time();
}
}
/**
* Creates an instance of the {@link StripLayoutHelperManager}.
* @param context The current Android {@link Context}.
* @param updateHost The parent {@link LayoutUpdateHost}.
* @param renderHost The {@link LayoutRenderHost}.
*/
public StripLayoutHelperManager(Context context, LayoutUpdateHost updateHost,
LayoutRenderHost renderHost, AreaGestureEventFilter eventFilter) {
public StripLayoutHelperManager(
Context context, LayoutUpdateHost updateHost, LayoutRenderHost renderHost) {
mUpdateHost = updateHost;
mTabStripTreeProvider = new TabStripSceneLayer(context);
mEventFilter = eventFilter;
mTabStripEventHandler = new TabStripEventHandler();
mEventFilter =
new AreaGestureEventFilter(context, mTabStripEventHandler, null, false, false);
mNormalHelper = new StripLayoutHelper(context, updateHost, renderHost, false);
mIncognitoHelper = new StripLayoutHelper(context, updateHost, renderHost, true);
......@@ -120,6 +179,23 @@ public class StripLayoutHelperManager implements SceneOverlay {
mNormalHelper.destroy();
}
private void handleModelSelectorButtonClick() {
if (mTabModelSelector == null) return;
getActiveStripLayoutHelper().finishAnimation();
if (!mModelSelectorButton.isVisible()) return;
mTabModelSelector.selectModel(!mTabModelSelector.isIncognitoSelected());
}
@VisibleForTesting
public void simulateClick(float x, float y, boolean fromMouse, int buttons) {
mTabStripEventHandler.click(x, y, fromMouse, buttons);
}
@VisibleForTesting
public void simulateLongPress(float x, float y) {
mTabStripEventHandler.onLongPress(x, y);
}
@Override
public SceneOverlayLayer getUpdatedSceneOverlayTree(RectF viewport, RectF visibleViewport,
LayerTitleCache layerTitleCache, ResourceManager resourceManager, float yOffset) {
......@@ -360,94 +436,6 @@ public class StripLayoutHelperManager implements SceneOverlay {
getStripLayoutHelper(incognito).tabLoadFinished(id);
}
/**
* Called on touch drag event.
* @param time The current time of the app in ms.
* @param x The y coordinate of the end of the drag event.
* @param y The y coordinate of the end of the drag event.
* @param deltaX The number of pixels dragged in the x direction.
* @param deltaY The number of pixels dragged in the y direction.
* @param totalX The total delta x since the drag started.
* @param totalY The total delta y since the drag started.
*/
public void drag(
long time, float x, float y, float deltaX, float deltaY, float totalX, float totalY) {
mModelSelectorButton.drag(x, y);
getActiveStripLayoutHelper().drag(time, x, y, deltaX, deltaY, totalX, totalY);
}
/**
* Called on touch fling event. This is called before the onUpOrCancel event.
* @param time The current time of the app in ms.
* @param x The y coordinate of the start of the fling event.
* @param y The y coordinate of the start of the fling event.
* @param velocityX The amount of velocity in the x direction.
* @param velocityY The amount of velocity in the y direction.
*/
public void fling(long time, float x, float y, float velocityX, float velocityY) {
getActiveStripLayoutHelper().fling(time, x, y, velocityX, velocityY);
}
/**
* Called on onDown event.
* @param time The time stamp in millisecond of the event.
* @param x The x position of the event.
* @param y The y position of the event.
* @param fromMouse Whether the event originates from a mouse.
* @param buttons State of all buttons that are pressed.
*/
public void onDown(long time, float x, float y, boolean fromMouse, int buttons) {
if (mModelSelectorButton.onDown(x, y)) return;
getActiveStripLayoutHelper().onDown(time, x, y, fromMouse, buttons);
}
/**
* Called on long press touch event.
* @param time The current time of the app in ms.
* @param x The x coordinate of the position of the press event.
* @param y The y coordinate of the position of the press event.
*/
public void onLongPress(long time, float x, float y) {
getActiveStripLayoutHelper().onLongPress(time, x, y);
}
private void handleModelSelectorButtonClick() {
if (mTabModelSelector == null) return;
getActiveStripLayoutHelper().finishAnimation();
if (!mModelSelectorButton.isVisible()) return;
mTabModelSelector.selectModel(!mTabModelSelector.isIncognitoSelected());
}
/**
* Called on click. This is called before the onUpOrCancel event.
* @param time The current time of the app in ms.
* @param x The x coordinate of the position of the click.
* @param y The y coordinate of the position of the click.
* @param fromMouse Whether the event originates from a mouse.
* @param buttons State of all buttons that were pressed when onDown was invoked.
*/
public void click(long time, float x, float y, boolean fromMouse, int buttons) {
if (mModelSelectorButton.click(x, y)) {
mModelSelectorButton.handleClick(time);
return;
}
getActiveStripLayoutHelper().click(time, x, y, fromMouse, buttons);
}
/**
* Called on up or cancel touch events. This is called after the click and fling event if any.
* @param time The current time of the app in ms.
*/
public void onUpOrCancel(long time) {
if (mModelSelectorButton.onUpOrCancel() && mTabModelSelector != null) {
getActiveStripLayoutHelper().finishAnimation();
if (!mModelSelectorButton.isVisible()) return;
mTabModelSelector.selectModel(!mTabModelSelector.isIncognitoSelected());
return;
}
getActiveStripLayoutHelper().onUpOrCancel(time);
}
/**
* @param incognito Whether or not you want the incognito StripLayoutHelper
* @return The requested StripLayoutHelper.
......
......@@ -16,6 +16,7 @@ import org.chromium.chrome.browser.compositor.layouts.Layout;
import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost;
import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.BlackHoleEventFilter;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilter;
import org.chromium.chrome.browser.compositor.scene_layer.SceneLayer;
import org.chromium.chrome.browser.tabmodel.TabModel;
......@@ -31,11 +32,13 @@ import org.chromium.chrome.browser.widget.accessibility.AccessibilityTabModelWra
public class OverviewListLayout extends Layout implements AccessibilityTabModelAdapterListener {
private AccessibilityTabModelWrapper mTabModelWrapper;
private final float mDpToPx;
private final BlackHoleEventFilter mBlackHoleEventFilter;
private final SceneLayer mSceneLayer;
public OverviewListLayout(Context context, LayoutUpdateHost updateHost,
LayoutRenderHost renderHost, EventFilter eventFilter) {
super(context, updateHost, renderHost, eventFilter);
public OverviewListLayout(
Context context, LayoutUpdateHost updateHost, LayoutRenderHost renderHost) {
super(context, updateHost, renderHost);
mBlackHoleEventFilter = new BlackHoleEventFilter(context);
mDpToPx = context.getResources().getDisplayMetrics().density;
mSceneLayer = new SceneLayer();
}
......@@ -185,6 +188,11 @@ public class OverviewListLayout extends Layout implements AccessibilityTabModelA
onTabSelecting(0, tabId);
}
@Override
protected EventFilter getEventFilter() {
return mBlackHoleEventFilter;
}
@Override
protected SceneLayer getSceneLayer() {
return mSceneLayer;
......
......@@ -157,7 +157,6 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimation.java",
"java/src/org/chromium/chrome/browser/compositor/layouts/EdgeSwipeHandlerLayoutDelegate.java",
"java/src/org/chromium/chrome/browser/compositor/layouts/EmptyOverviewModeObserver.java",
"java/src/org/chromium/chrome/browser/compositor/layouts/GestureHandlerLayoutDelegate.java",
"java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java",
"java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java",
"java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java",
......
......@@ -80,7 +80,7 @@ public class TabStripUtils {
base.getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
manager.click(0, x, y, false, 0);
manager.simulateClick(x, y, false, 0);
}
});
}
......@@ -98,7 +98,7 @@ public class TabStripUtils {
base.getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
manager.click(0, x, y, false, 0);
manager.simulateClick(x, y, false, 0);
}
});
}
......@@ -116,7 +116,7 @@ public class TabStripUtils {
base.getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
manager.onLongPress(0, x, y);
manager.simulateLongPress(x, y);
}
});
}
......
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