| Index: chrome/android/java_staging/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchStaticEventFilter.java
 | 
| diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchStaticEventFilter.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchStaticEventFilter.java
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..f6322aa7f0b99ad0757665efb4dab8b6a75f28a8
 | 
| --- /dev/null
 | 
| +++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchStaticEventFilter.java
 | 
| @@ -0,0 +1,104 @@
 | 
| +// 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.contextualsearch;
 | 
| +
 | 
| +import android.content.Context;
 | 
| +import android.view.MotionEvent;
 | 
| +
 | 
| +import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanel;
 | 
| +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.EventFilterHost;
 | 
| +
 | 
| +/**
 | 
| + * A {@link EventFilter} used to filter events in the Contextual Search Bar, when displayed
 | 
| + * in the StaticLayout.
 | 
| + */
 | 
| +public class ContextualSearchStaticEventFilter extends EventFilter {
 | 
| +    /**
 | 
| +     * The @{link ContextualSearchPanel} that controls Contextual Search's UI.
 | 
| +     */
 | 
| +    private final ContextualSearchPanel mSearchPanel;
 | 
| +
 | 
| +    /**
 | 
| +     * The @{link SwipeRecognizer} that recognizes directional swipe gestures.
 | 
| +     */
 | 
| +    private final SwipeRecognizer mSwipeRecognizer;
 | 
| +
 | 
| +    private final ContextualSearchTapHandler mTapHandler;
 | 
| +
 | 
| +    /**
 | 
| +     * Interface to handle taps on the contextual search bar..
 | 
| +     */
 | 
| +    public interface ContextualSearchTapHandler {
 | 
| +        /**
 | 
| +         * Handle a tap event on the contextual seach bar.
 | 
| +         * @param time The time of the tap event.
 | 
| +         * @param x The x position of the tap event.
 | 
| +         * @param y The y position of the tap event.
 | 
| +         */
 | 
| +        void handleTapContextualSearchBar(long time, float x, float y);
 | 
| +    }
 | 
| +
 | 
| +    /**
 | 
| +     * Constructs a {@link ContextualSearchStaticEventFilter}.
 | 
| +     *
 | 
| +     * @param context The current Android {@link Context}.
 | 
| +     * @param host The @{link EventFilterHost} associated to this filter.
 | 
| +     * @param searchPanel The @{link ContextualSearchPanel} that controls Contextual Seach's UI.
 | 
| +     * @param swipeHandler The @{link EdgeSwipeHandler} for Contextual Search events.
 | 
| +     */
 | 
| +    public ContextualSearchStaticEventFilter(Context context, EventFilterHost host,
 | 
| +            ContextualSearchPanel searchPanel, EdgeSwipeHandler swipeHandler,
 | 
| +            ContextualSearchTapHandler tapHandler) {
 | 
| +        super(context, host);
 | 
| +
 | 
| +        mSearchPanel = searchPanel;
 | 
| +        mSwipeRecognizer = new SwipeRecognizerImpl(context);
 | 
| +        mSwipeRecognizer.setSwipeHandler(swipeHandler);
 | 
| +        mTapHandler = tapHandler;
 | 
| +    }
 | 
| +
 | 
| +    @Override
 | 
| +    protected boolean onInterceptTouchEventInternal(MotionEvent event, boolean isKeyboardShowing) {
 | 
| +        // TODO(pedrosimonetti): isKeyboardShowing has the wrong value after
 | 
| +        // rotating the device. We don't really need to check whether the
 | 
| +        // keyboard is showing here because Contextual Search's Panel will
 | 
| +        // be closed, if opened, when the keyboard shows up. Even so,
 | 
| +        // it would be nice fixing this problem in Chrome-Android.
 | 
| +        return mSearchPanel.isPeeking()
 | 
| +                && mSearchPanel.isYCoordinateInsideSearchBar(
 | 
| +                        mSearchPanel.getFullscreenY(event.getY()) * mPxToDp);
 | 
| +    }
 | 
| +
 | 
| +    @Override
 | 
| +    protected boolean onTouchEventInternal(MotionEvent event) {
 | 
| +        if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
 | 
| +            // To avoid a gray flash of empty content, show the search content
 | 
| +            // view immediately on tap rather than waiting for panel expansion.
 | 
| +            // TODO(pedrosimonetti): Once we implement "side-swipe to dismiss"
 | 
| +            // we'll have to revisit this because we don't want to set the
 | 
| +            // Content View visibility to true when the side-swipe is detected.
 | 
| +            mSearchPanel.setSearchContentViewVisibility(true);
 | 
| +        }
 | 
| +
 | 
| +        mSwipeRecognizer.onTouchEvent(event);
 | 
| +        return true;
 | 
| +    }
 | 
| +
 | 
| +    private class SwipeRecognizerImpl extends SwipeRecognizer {
 | 
| +        public SwipeRecognizerImpl(Context context) {
 | 
| +            super(context);
 | 
| +        }
 | 
| +
 | 
| +        @Override
 | 
| +        public boolean onSingleTapUp(MotionEvent event) {
 | 
| +            if (mTapHandler == null) return true;
 | 
| +            mTapHandler.handleTapContextualSearchBar(event.getEventTime(),
 | 
| +                    event.getX() * mPxToDp, mSearchPanel.getFullscreenY(event.getY()) * mPxToDp);
 | 
| +            return true;
 | 
| +        }
 | 
| +    }
 | 
| +}
 | 
| 
 |