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 ...@@ -99,7 +99,6 @@ public abstract class Layout implements TabContentManager.ThumbnailChangeListene
// Helpers // Helpers
private final LayoutUpdateHost mUpdateHost; private final LayoutUpdateHost mUpdateHost;
protected final LayoutRenderHost mRenderHost; protected final LayoutRenderHost mRenderHost;
private EventFilter mEventFilter;
/** The tabs currently being rendered as part of this layout. The tabs are /** The tabs currently being rendered as part of this layout. The tabs are
* drawn using the same ordering as this array. */ * drawn using the same ordering as this array. */
...@@ -120,14 +119,11 @@ public abstract class Layout implements TabContentManager.ThumbnailChangeListene ...@@ -120,14 +119,11 @@ public abstract class Layout implements TabContentManager.ThumbnailChangeListene
* @param context The current Android's context. * @param context The current Android's context.
* @param updateHost The parent {@link LayoutUpdateHost}. * @param updateHost The parent {@link LayoutUpdateHost}.
* @param renderHost The parent {@link LayoutRenderHost}. * @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, public Layout(Context context, LayoutUpdateHost updateHost, LayoutRenderHost renderHost) {
EventFilter eventFilter) {
mContext = context; mContext = context;
mUpdateHost = updateHost; mUpdateHost = updateHost;
mRenderHost = renderHost; mRenderHost = renderHost;
mEventFilter = eventFilter;
// Invalid sizes // Invalid sizes
mWidthDp = -1; mWidthDp = -1;
...@@ -571,69 +567,6 @@ public abstract class Layout implements TabContentManager.ThumbnailChangeListene ...@@ -571,69 +567,6 @@ public abstract class Layout implements TabContentManager.ThumbnailChangeListene
return false; 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. * Called by the LayoutManager when an animation should be killed.
*/ */
...@@ -1037,15 +970,6 @@ public abstract class Layout implements TabContentManager.ThumbnailChangeListene ...@@ -1037,15 +970,6 @@ public abstract class Layout implements TabContentManager.ThumbnailChangeListene
return false; 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 e The {@link MotionEvent} to consider.
* @param offsets The current touch offsets that should be applied to the * @param offsets The current touch offsets that should be applied to the
...@@ -1064,9 +988,14 @@ public abstract class Layout implements TabContentManager.ThumbnailChangeListene ...@@ -1064,9 +988,14 @@ public abstract class Layout implements TabContentManager.ThumbnailChangeListene
if (eventFilter.onInterceptTouchEvent(e, isKeyboardShowing)) return eventFilter; if (eventFilter.onInterceptTouchEvent(e, isKeyboardShowing)) return eventFilter;
} }
if (mEventFilter != null) { EventFilter layoutEventFilter = getEventFilter();
if (offsets != null) mEventFilter.setCurrentMotionEventOffsets(offsets.x, offsets.y); if (layoutEventFilter != null) {
if (mEventFilter.onInterceptTouchEvent(e, isKeyboardShowing)) return mEventFilter; if (offsets != null) {
layoutEventFilter.setCurrentMotionEventOffsets(offsets.x, offsets.y);
}
if (layoutEventFilter.onInterceptTouchEvent(e, isKeyboardShowing)) {
return layoutEventFilter;
}
} }
return null; return null;
} }
...@@ -1127,11 +1056,9 @@ public abstract class Layout implements TabContentManager.ThumbnailChangeListene ...@@ -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() { protected abstract EventFilter getEventFilter();
return true;
}
/** /**
* Get an instance of {@link SceneLayer}. Any class inheriting {@link Layout} * Get an instance of {@link SceneLayer}. Any class inheriting {@link Layout}
......
...@@ -13,10 +13,7 @@ import org.chromium.chrome.browser.compositor.TitleCache; ...@@ -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.LayoutTab;
import org.chromium.chrome.browser.compositor.layouts.components.VirtualView; 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.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.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.eventfilter.ScrollDirection;
import org.chromium.chrome.browser.compositor.layouts.phone.StackLayout; import org.chromium.chrome.browser.compositor.layouts.phone.StackLayout;
import org.chromium.chrome.browser.compositor.overlays.SceneOverlay; import org.chromium.chrome.browser.compositor.overlays.SceneOverlay;
...@@ -58,11 +55,6 @@ public class LayoutManagerChrome ...@@ -58,11 +55,6 @@ public class LayoutManagerChrome
/** A {@link Layout} that should be used when the user is in the tab switcher. */ /** A {@link Layout} that should be used when the user is in the tab switcher. */
protected Layout mOverviewLayout; protected Layout mOverviewLayout;
// Event Filters
/** A {@link EventFilter} that consumes all touch events. */
protected EventFilter mBlackHoleEventFilter;
private final GestureEventFilter mGestureEventFilter;
// Event Filter Handlers // Event Filter Handlers
private final EdgeSwipeHandler mToolbarSwipeHandler; private final EdgeSwipeHandler mToolbarSwipeHandler;
...@@ -166,17 +158,11 @@ public class LayoutManagerChrome ...@@ -166,17 +158,11 @@ public class LayoutManagerChrome
// Build Event Filter Handlers // Build Event Filter Handlers
mToolbarSwipeHandler = createToolbarSwipeHandler(this); mToolbarSwipeHandler = createToolbarSwipeHandler(this);
// Build Event Filters
mBlackHoleEventFilter = new BlackHoleEventFilter(context);
mGestureEventFilter = new GestureEventFilter(context, mGestureHandler);
// Build Layouts // Build Layouts
mOverviewListLayout = mOverviewListLayout = new OverviewListLayout(context, this, renderHost);
new OverviewListLayout(context, this, renderHost, mBlackHoleEventFilter); mToolbarSwipeLayout = new ToolbarSwipeLayout(context, this, renderHost);
mToolbarSwipeLayout =
new ToolbarSwipeLayout(context, this, renderHost, mBlackHoleEventFilter);
if (createOverviewLayout) { if (createOverviewLayout) {
mOverviewLayout = new StackLayout(context, this, renderHost, mGestureEventFilter); mOverviewLayout = new StackLayout(context, this, renderHost);
} }
} }
...@@ -316,7 +302,9 @@ public class LayoutManagerChrome ...@@ -316,7 +302,9 @@ public class LayoutManagerChrome
*/ */
@VisibleForTesting @VisibleForTesting
public void simulateClick(float x, float y) { 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 ...@@ -328,10 +316,8 @@ public class LayoutManagerChrome
*/ */
@VisibleForTesting @VisibleForTesting
public void simulateDrag(float x, float y, float dX, float dY) { public void simulateDrag(float x, float y, float dX, float dY) {
if (getActiveLayout() != null) { if (getActiveLayout() instanceof StackLayout) {
getActiveLayout().onDown(0, x, y); ((StackLayout) getActiveLayout()).simulateDrag(x, y, dX, dY);
getActiveLayout().drag(0, x, y, dX, dY);
getActiveLayout().onUpOrCancel(time());
} }
} }
......
...@@ -39,8 +39,7 @@ public class LayoutManagerChromePhone extends LayoutManagerChrome { ...@@ -39,8 +39,7 @@ public class LayoutManagerChromePhone extends LayoutManagerChrome {
LayoutRenderHost renderHost = host.getLayoutRenderHost(); LayoutRenderHost renderHost = host.getLayoutRenderHost();
// Build Layouts // Build Layouts
mSimpleAnimationLayout = mSimpleAnimationLayout = new SimpleAnimationLayout(context, this, renderHost);
new SimpleAnimationLayout(context, this, renderHost, mBlackHoleEventFilter);
// Set up layout parameters // Set up layout parameters
mStaticLayout.setLayoutHandlesTabLifecycles(false); mStaticLayout.setLayoutHandlesTabLifecycles(false);
......
...@@ -6,14 +6,10 @@ package org.chromium.chrome.browser.compositor.layouts; ...@@ -6,14 +6,10 @@ package org.chromium.chrome.browser.compositor.layouts;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.RectF;
import android.view.MotionEvent;
import android.view.ViewGroup; import android.view.ViewGroup;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; 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.layouts.eventfilter.ScrollDirection;
import org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutHelperManager; import org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutHelperManager;
import org.chromium.chrome.browser.contextualsearch.ContextualSearchManagementDelegate; import org.chromium.chrome.browser.contextualsearch.ContextualSearchManagementDelegate;
...@@ -33,9 +29,6 @@ import java.util.List; ...@@ -33,9 +29,6 @@ import java.util.List;
* the tablet. * the tablet.
*/ */
public class LayoutManagerChromeTablet extends LayoutManagerChrome { public class LayoutManagerChromeTablet extends LayoutManagerChrome {
// Event Filters
private final TabStripEventFilter mTabStripFilter;
// Internal State // Internal State
private final String mDefaultTitle; private final String mDefaultTitle;
...@@ -50,12 +43,8 @@ public class LayoutManagerChromeTablet extends LayoutManagerChrome { ...@@ -50,12 +43,8 @@ public class LayoutManagerChromeTablet extends LayoutManagerChrome {
super(host, false); super(host, false);
Context context = host.getContext(); Context context = host.getContext();
// Build Event Filters mTabStripLayoutHelperManager =
mTabStripFilter = new StripLayoutHelperManager(context, this, mHost.getLayoutRenderHost());
new TabStripEventFilter(context, new TabStripEventHandler(), null, false, false);
mTabStripLayoutHelperManager = new StripLayoutHelperManager(
context, this, mHost.getLayoutRenderHost(), mTabStripFilter);
// Set up state // Set up state
mDefaultTitle = context.getString(R.string.tab_loading_default_title); mDefaultTitle = context.getString(R.string.tab_loading_default_title);
...@@ -207,57 +196,4 @@ public class LayoutManagerChromeTablet extends LayoutManagerChrome { ...@@ -207,57 +196,4 @@ public class LayoutManagerChromeTablet extends LayoutManagerChrome {
return super.isSwipeEnabled(direction); 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; ...@@ -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.content.TabContentManager;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.EdgeSwipeHandler; 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.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.layouts.eventfilter.ScrollDirection;
import org.chromium.chrome.browser.compositor.overlays.SceneOverlay; import org.chromium.chrome.browser.compositor.overlays.SceneOverlay;
import org.chromium.chrome.browser.compositor.scene_layer.ToolbarSceneLayer; import org.chromium.chrome.browser.compositor.scene_layer.ToolbarSceneLayer;
...@@ -57,10 +56,6 @@ public class LayoutManagerDocument extends LayoutManager ...@@ -57,10 +56,6 @@ public class LayoutManagerDocument extends LayoutManager
// Event Filters // Event Filters
private final EdgeSwipeHandler mToolbarSwipeHandler; private final EdgeSwipeHandler mToolbarSwipeHandler;
// Event Filter Handlers
/** A {@link GestureHandler} that will delegate all events to {@link #getActiveLayout()}. */
protected final GestureHandler mGestureHandler;
// Internal State // Internal State
private final SparseArray<LayoutTab> mTabCache = new SparseArray<LayoutTab>(); private final SparseArray<LayoutTab> mTabCache = new SparseArray<LayoutTab>();
private final ContextualSearchPanel mContextualSearchPanel; private final ContextualSearchPanel mContextualSearchPanel;
...@@ -86,7 +81,6 @@ public class LayoutManagerDocument extends LayoutManager ...@@ -86,7 +81,6 @@ public class LayoutManagerDocument extends LayoutManager
mToolbarOverlay = new ToolbarSceneLayer(mContext, this, renderHost); mToolbarOverlay = new ToolbarSceneLayer(mContext, this, renderHost);
// Build Event Filter Handlers // Build Event Filter Handlers
mGestureHandler = new GestureHandlerLayoutDelegate(this);
mToolbarSwipeHandler = new ToolbarSwipeHandler(this); mToolbarSwipeHandler = new ToolbarSwipeHandler(this);
mOverlayPanelManager = new OverlayPanelManager(); mOverlayPanelManager = new OverlayPanelManager();
......
...@@ -61,12 +61,11 @@ public class StaticLayout extends Layout { ...@@ -61,12 +61,11 @@ public class StaticLayout extends Layout {
* @param context The current Android's context. * @param context The current Android's context.
* @param updateHost The {@link LayoutUpdateHost} view for this layout. * @param updateHost The {@link LayoutUpdateHost} view for this layout.
* @param renderHost The {@link LayoutRenderHost} 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. * @param panelManager The {@link OverlayPanelManager} responsible for showing panels.
*/ */
public StaticLayout(Context context, LayoutUpdateHost updateHost, LayoutRenderHost renderHost, public StaticLayout(Context context, LayoutUpdateHost updateHost, LayoutRenderHost renderHost,
EventFilter eventFilter, OverlayPanelManager panelManager) { EventFilter eventFilter, OverlayPanelManager panelManager) {
super(context, updateHost, renderHost, eventFilter); super(context, updateHost, renderHost);
mHandler = new Handler(); mHandler = new Handler();
mUnstallRunnable = new UnstallRunnable(); mUnstallRunnable = new UnstallRunnable();
...@@ -213,6 +212,11 @@ public class StaticLayout extends Layout { ...@@ -213,6 +212,11 @@ public class StaticLayout extends Layout {
return mLayoutTabs != null && mLayoutTabs.length > 0; return mLayoutTabs != null && mLayoutTabs.length > 0;
} }
@Override
protected EventFilter getEventFilter() {
return null;
}
@Override @Override
protected SceneLayer getSceneLayer() { protected SceneLayer getSceneLayer() {
return mSceneLayer; return mSceneLayer;
......
...@@ -16,6 +16,7 @@ import org.chromium.chrome.browser.compositor.LayerTitleCache; ...@@ -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.ChromeAnimation.Animatable;
import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab; 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.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.EventFilter;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.ScrollDirection; import org.chromium.chrome.browser.compositor.layouts.eventfilter.ScrollDirection;
import org.chromium.chrome.browser.compositor.scene_layer.SceneLayer; import org.chromium.chrome.browser.compositor.scene_layer.SceneLayer;
...@@ -69,6 +70,7 @@ public class ToolbarSwipeLayout extends Layout implements Animatable<ToolbarSwip ...@@ -69,6 +70,7 @@ public class ToolbarSwipeLayout extends Layout implements Animatable<ToolbarSwip
private final float mSpaceBetweenTabs; private final float mSpaceBetweenTabs;
private final float mCommitDistanceFromEdge; private final float mCommitDistanceFromEdge;
private final BlackHoleEventFilter mBlackHoleEventFilter;
private final TabListSceneLayer mSceneLayer; private final TabListSceneLayer mSceneLayer;
private final Interpolator mEdgeInterpolator = new DecelerateInterpolator(); private final Interpolator mEdgeInterpolator = new DecelerateInterpolator();
...@@ -79,9 +81,10 @@ public class ToolbarSwipeLayout extends Layout implements Animatable<ToolbarSwip ...@@ -79,9 +81,10 @@ public class ToolbarSwipeLayout extends Layout implements Animatable<ToolbarSwip
* @param renderHost The {@link LayoutRenderHost} 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 eventFilter The {@link EventFilter} that is needed for this view.
*/ */
public ToolbarSwipeLayout(Context context, LayoutUpdateHost updateHost, public ToolbarSwipeLayout(
LayoutRenderHost renderHost, EventFilter eventFilter) { Context context, LayoutUpdateHost updateHost, LayoutRenderHost renderHost) {
super(context, updateHost, renderHost, eventFilter); super(context, updateHost, renderHost);
mBlackHoleEventFilter = new BlackHoleEventFilter(context);
Resources res = context.getResources(); Resources res = context.getResources();
final float pxToDp = 1.0f / res.getDisplayMetrics().density; final float pxToDp = 1.0f / res.getDisplayMetrics().density;
mCommitDistanceFromEdge = res.getDimension(R.dimen.toolbar_swipe_commit_distance) * pxToDp; mCommitDistanceFromEdge = res.getDimension(R.dimen.toolbar_swipe_commit_distance) * pxToDp;
...@@ -354,6 +357,11 @@ public class ToolbarSwipeLayout extends Layout implements Animatable<ToolbarSwip ...@@ -354,6 +357,11 @@ public class ToolbarSwipeLayout extends Layout implements Animatable<ToolbarSwip
@Override @Override
public void onPropertyAnimationFinished(Property prop) {} public void onPropertyAnimationFinished(Property prop) {}
@Override
protected EventFilter getEventFilter() {
return mBlackHoleEventFilter;
}
@Override @Override
protected SceneLayer getSceneLayer() { protected SceneLayer getSceneLayer() {
return mSceneLayer; return mSceneLayer;
......
...@@ -15,6 +15,7 @@ import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost; ...@@ -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.LayoutUpdateHost;
import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab; 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.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.EventFilter;
import org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack; import org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack;
import org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation; import org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation;
...@@ -66,6 +67,7 @@ public class SimpleAnimationLayout ...@@ -66,6 +67,7 @@ public class SimpleAnimationLayout
private LayoutTab mAnimatedTab; private LayoutTab mAnimatedTab;
private final TabListSceneLayer mSceneLayer; private final TabListSceneLayer mSceneLayer;
private final BlackHoleEventFilter mBlackHoleEventFilter;
/** /**
* Creates an instance of the {@link SimpleAnimationLayout}. * Creates an instance of the {@link SimpleAnimationLayout}.
...@@ -74,9 +76,10 @@ public class SimpleAnimationLayout ...@@ -74,9 +76,10 @@ public class SimpleAnimationLayout
* @param renderHost The {@link LayoutRenderHost} 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 eventFilter The {@link EventFilter} that is needed for this view.
*/ */
public SimpleAnimationLayout(Context context, LayoutUpdateHost updateHost, public SimpleAnimationLayout(
LayoutRenderHost renderHost, EventFilter eventFilter) { Context context, LayoutUpdateHost updateHost, LayoutRenderHost renderHost) {
super(context, updateHost, renderHost, eventFilter); super(context, updateHost, renderHost);
mBlackHoleEventFilter = new BlackHoleEventFilter(context);
mSceneLayer = new TabListSceneLayer(); mSceneLayer = new TabListSceneLayer();
} }
...@@ -406,6 +409,11 @@ public class SimpleAnimationLayout ...@@ -406,6 +409,11 @@ public class SimpleAnimationLayout
@Override @Override
public void onPropertyAnimationFinished(Property prop) {} public void onPropertyAnimationFinished(Property prop) {}
@Override
protected EventFilter getEventFilter() {
return mBlackHoleEventFilter;
}
@Override @Override
protected SceneLayer getSceneLayer() { protected SceneLayer getSceneLayer() {
return mSceneLayer; return mSceneLayer;
......
...@@ -11,6 +11,7 @@ import android.graphics.RectF; ...@@ -11,6 +11,7 @@ import android.graphics.RectF;
import org.chromium.base.VisibleForTesting; import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.compositor.LayerTitleCache; 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.LayoutRenderHost;
import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
import org.chromium.chrome.browser.compositor.layouts.components.CompositorButton; import org.chromium.chrome.browser.compositor.layouts.components.CompositorButton;
...@@ -18,6 +19,7 @@ import org.chromium.chrome.browser.compositor.layouts.components.CompositorButto ...@@ -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.components.VirtualView;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.AreaGestureEventFilter; 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.EventFilter;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.GestureHandler;
import org.chromium.chrome.browser.compositor.overlays.SceneOverlay; 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.SceneOverlayLayer;
import org.chromium.chrome.browser.compositor.scene_layer.TabStripSceneLayer; import org.chromium.chrome.browser.compositor.scene_layer.TabStripSceneLayer;
...@@ -69,18 +71,75 @@ public class StripLayoutHelperManager implements SceneOverlay { ...@@ -69,18 +71,75 @@ public class StripLayoutHelperManager implements SceneOverlay {
private TabStripSceneLayer mTabStripTreeProvider; 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}. * Creates an instance of the {@link StripLayoutHelperManager}.
* @param context The current Android {@link Context}. * @param context The current Android {@link Context}.
* @param updateHost The parent {@link LayoutUpdateHost}. * @param updateHost The parent {@link LayoutUpdateHost}.
* @param renderHost The {@link LayoutRenderHost}. * @param renderHost The {@link LayoutRenderHost}.
*/ */
public StripLayoutHelperManager(Context context, LayoutUpdateHost updateHost, public StripLayoutHelperManager(
LayoutRenderHost renderHost, AreaGestureEventFilter eventFilter) { Context context, LayoutUpdateHost updateHost, LayoutRenderHost renderHost) {
mUpdateHost = updateHost; mUpdateHost = updateHost;
mTabStripTreeProvider = new TabStripSceneLayer(context); mTabStripTreeProvider = new TabStripSceneLayer(context);
mTabStripEventHandler = new TabStripEventHandler();
mEventFilter = eventFilter; mEventFilter =
new AreaGestureEventFilter(context, mTabStripEventHandler, null, false, false);
mNormalHelper = new StripLayoutHelper(context, updateHost, renderHost, false); mNormalHelper = new StripLayoutHelper(context, updateHost, renderHost, false);
mIncognitoHelper = new StripLayoutHelper(context, updateHost, renderHost, true); mIncognitoHelper = new StripLayoutHelper(context, updateHost, renderHost, true);
...@@ -120,6 +179,23 @@ public class StripLayoutHelperManager implements SceneOverlay { ...@@ -120,6 +179,23 @@ public class StripLayoutHelperManager implements SceneOverlay {
mNormalHelper.destroy(); 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 @Override
public SceneOverlayLayer getUpdatedSceneOverlayTree(RectF viewport, RectF visibleViewport, public SceneOverlayLayer getUpdatedSceneOverlayTree(RectF viewport, RectF visibleViewport,
LayerTitleCache layerTitleCache, ResourceManager resourceManager, float yOffset) { LayerTitleCache layerTitleCache, ResourceManager resourceManager, float yOffset) {
...@@ -360,94 +436,6 @@ public class StripLayoutHelperManager implements SceneOverlay { ...@@ -360,94 +436,6 @@ public class StripLayoutHelperManager implements SceneOverlay {
getStripLayoutHelper(incognito).tabLoadFinished(id); 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 * @param incognito Whether or not you want the incognito StripLayoutHelper
* @return The requested StripLayoutHelper. * @return The requested StripLayoutHelper.
......
...@@ -16,6 +16,7 @@ import org.chromium.chrome.browser.compositor.layouts.Layout; ...@@ -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.LayoutRenderHost;
import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; 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.EventFilter;
import org.chromium.chrome.browser.compositor.scene_layer.SceneLayer; import org.chromium.chrome.browser.compositor.scene_layer.SceneLayer;
import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModel;
...@@ -31,11 +32,13 @@ import org.chromium.chrome.browser.widget.accessibility.AccessibilityTabModelWra ...@@ -31,11 +32,13 @@ import org.chromium.chrome.browser.widget.accessibility.AccessibilityTabModelWra
public class OverviewListLayout extends Layout implements AccessibilityTabModelAdapterListener { public class OverviewListLayout extends Layout implements AccessibilityTabModelAdapterListener {
private AccessibilityTabModelWrapper mTabModelWrapper; private AccessibilityTabModelWrapper mTabModelWrapper;
private final float mDpToPx; private final float mDpToPx;
private final BlackHoleEventFilter mBlackHoleEventFilter;
private final SceneLayer mSceneLayer; private final SceneLayer mSceneLayer;
public OverviewListLayout(Context context, LayoutUpdateHost updateHost, public OverviewListLayout(
LayoutRenderHost renderHost, EventFilter eventFilter) { Context context, LayoutUpdateHost updateHost, LayoutRenderHost renderHost) {
super(context, updateHost, renderHost, eventFilter); super(context, updateHost, renderHost);
mBlackHoleEventFilter = new BlackHoleEventFilter(context);
mDpToPx = context.getResources().getDisplayMetrics().density; mDpToPx = context.getResources().getDisplayMetrics().density;
mSceneLayer = new SceneLayer(); mSceneLayer = new SceneLayer();
} }
...@@ -185,6 +188,11 @@ public class OverviewListLayout extends Layout implements AccessibilityTabModelA ...@@ -185,6 +188,11 @@ public class OverviewListLayout extends Layout implements AccessibilityTabModelA
onTabSelecting(0, tabId); onTabSelecting(0, tabId);
} }
@Override
protected EventFilter getEventFilter() {
return mBlackHoleEventFilter;
}
@Override @Override
protected SceneLayer getSceneLayer() { protected SceneLayer getSceneLayer() {
return mSceneLayer; return mSceneLayer;
......
...@@ -157,7 +157,6 @@ chrome_java_sources = [ ...@@ -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/ChromeAnimation.java",
"java/src/org/chromium/chrome/browser/compositor/layouts/EdgeSwipeHandlerLayoutDelegate.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/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/Layout.java",
"java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java", "java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java",
"java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java", "java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java",
......
...@@ -80,7 +80,7 @@ public class TabStripUtils { ...@@ -80,7 +80,7 @@ public class TabStripUtils {
base.getInstrumentation().runOnMainSync(new Runnable() { base.getInstrumentation().runOnMainSync(new Runnable() {
@Override @Override
public void run() { public void run() {
manager.click(0, x, y, false, 0); manager.simulateClick(x, y, false, 0);
} }
}); });
} }
...@@ -98,7 +98,7 @@ public class TabStripUtils { ...@@ -98,7 +98,7 @@ public class TabStripUtils {
base.getInstrumentation().runOnMainSync(new Runnable() { base.getInstrumentation().runOnMainSync(new Runnable() {
@Override @Override
public void run() { public void run() {
manager.click(0, x, y, false, 0); manager.simulateClick(x, y, false, 0);
} }
}); });
} }
...@@ -116,7 +116,7 @@ public class TabStripUtils { ...@@ -116,7 +116,7 @@ public class TabStripUtils {
base.getInstrumentation().runOnMainSync(new Runnable() { base.getInstrumentation().runOnMainSync(new Runnable() {
@Override @Override
public void run() { 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