Index: chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolderBehavior.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolderBehavior.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolderBehavior.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4828d19ecdb44f302ea901eab9be8872006a077f |
--- /dev/null |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolderBehavior.java |
@@ -0,0 +1,56 @@ |
+// Copyright 2016 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; |
+ |
+import android.content.Context; |
+import android.support.design.widget.CoordinatorLayout; |
+import android.support.design.widget.CoordinatorLayout.Behavior; |
+import android.util.AttributeSet; |
+import android.view.MotionEvent; |
+import android.view.View; |
+ |
+/** |
+ * Default {@link Behavior} for widgets that are children of {@link CompositorViewHolder} and want |
+ * to handle touch events. |
+ */ |
+public class CompositorViewHolderBehavior extends Behavior<View> { |
+ private boolean mShouldIntercept; |
+ |
+ /** |
+ * Constructs the object programmatically. |
+ */ |
+ public CompositorViewHolderBehavior() { |
+ super(); |
+ } |
+ |
+ /** |
+ * Constructs the object during inflation. |
+ */ |
+ public CompositorViewHolderBehavior(Context context, AttributeSet attrs) { |
+ super(context, attrs); |
+ } |
+ |
+ @Override |
+ public boolean onInterceptTouchEvent(CoordinatorLayout parent, View child, MotionEvent ev) { |
+ mShouldIntercept = child.getVisibility() == View.VISIBLE && isTouchInBound(ev, child); |
+ return mShouldIntercept; |
+ } |
+ |
+ @Override |
+ public boolean onTouchEvent(CoordinatorLayout parent, View child, MotionEvent ev) { |
+ if (!mShouldIntercept) return false; |
+ ev.offsetLocation(-child.getX(), -child.getY()); |
+ child.dispatchTouchEvent(ev); |
+ return true; |
+ } |
+ |
+ /** |
+ * @return Whether the {@link MotionEvent} happens within the bound of the given {@link View}. |
+ */ |
+ private static boolean isTouchInBound(MotionEvent ev, View view) { |
+ return ev.getX() >= view.getX() && ev.getX() - view.getX() <= view.getWidth() |
+ && ev.getY() >= view.getY() && ev.getY() - view.getY() <= view.getHeight(); |
+ } |
+} |