Move handling touch logic from AllAppsContainerView to BaseContainerView.
Now both AllAppsContainerView and WidgetsContainerView will be
dismissed when the background is clicked.
Bug: 27130340
Change-Id: Ie8446e4b8908742ddc8a227fe71ea56ec11c2457
diff --git a/src/com/android/launcher3/BaseContainerView.java b/src/com/android/launcher3/BaseContainerView.java
index fe95106..b7321d9 100644
--- a/src/com/android/launcher3/BaseContainerView.java
+++ b/src/com/android/launcher3/BaseContainerView.java
@@ -16,14 +16,19 @@
package com.android.launcher3;
+import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
+import android.graphics.Point;
+import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.InsetDrawable;
import android.util.AttributeSet;
+import android.view.MotionEvent;
import android.view.View;
+import android.view.ViewConfiguration;
import android.widget.FrameLayout;
import com.android.launcher3.allapps.AllAppsContainerView;
@@ -49,6 +54,8 @@
private TransformingTouchDelegate mTouchDelegate;
+ private final PointF mLastTouchDownPosPx = new PointF(-1.0f, -1.0f);
+
public BaseContainerView(Context context) {
this(context, null);
}
@@ -122,6 +129,17 @@
updatePaddings();
}
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ return handleTouchEvent(ev);
+ }
+
+ @SuppressLint("ClickableViewAccessibility")
+ @Override
+ public boolean onTouchEvent(MotionEvent ev) {
+ return handleTouchEvent(ev);
+ }
+
public void setRevealDrawableColor(int color) {
((ColorDrawable) mBaseDrawable).setColor(color);
}
@@ -162,5 +180,40 @@
mContent.setBackground(revealDrawable);
}
+ /**
+ * Handles the touch events that shows the workspace when clicking outside the bounds of the
+ * touch delegate target view.
+ */
+ private boolean handleTouchEvent(MotionEvent ev) {
+ switch (ev.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ // Check if the touch is outside touch delegate target view
+ View touchDelegateTargetView = getTouchDelegateTargetView();
+ float leftBoundPx = touchDelegateTargetView.getLeft();
+ if (ev.getX() < leftBoundPx ||
+ ev.getX() > (touchDelegateTargetView.getWidth() + leftBoundPx)) {
+ mLastTouchDownPosPx.set((int) ev.getX(), (int) ev.getY());
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ if (mLastTouchDownPosPx.x > -1) {
+ ViewConfiguration viewConfig = ViewConfiguration.get(getContext());
+ float dx = ev.getX() - mLastTouchDownPosPx.x;
+ float dy = ev.getY() - mLastTouchDownPosPx.y;
+ float distance = PointF.length(dx, dy);
+ if (distance < viewConfig.getScaledTouchSlop()) {
+ // The background was clicked, so just go home
+ Launcher.getLauncher(getContext()).showWorkspace(true);
+ return true;
+ }
+ }
+ // Fall through
+ case MotionEvent.ACTION_CANCEL:
+ mLastTouchDownPosPx.set(-1, -1);
+ break;
+ }
+ return false;
+ }
+
public abstract View getTouchDelegateTargetView();
}
diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java
index 11aa86b..8cb493a 100644
--- a/src/com/android/launcher3/allapps/AllAppsContainerView.java
+++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java
@@ -143,9 +143,6 @@
private final RecyclerView.LayoutManager mLayoutManager;
private final RecyclerView.ItemDecoration mItemDecoration;
- // The computed bounds of the container
- private final Rect mContentBounds = new Rect();
-
private AllAppsRecyclerView mAppsRecyclerView;
private AllAppsSearchBarController mSearchBarController;
@@ -158,8 +155,7 @@
private int mSectionNamesMargin;
private int mNumAppsPerRow;
private int mNumPredictedAppsPerRow;
- // This coordinate is relative to this container view
- private final Point mBoundsCheckLastTouchDownPos = new Point(-1, -1);
+
public AllAppsContainerView(Context context) {
this(context, null);
@@ -368,10 +364,6 @@
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int widthPx = MeasureSpec.getSize(widthMeasureSpec);
- int heightPx = MeasureSpec.getSize(heightMeasureSpec);
- mContentBounds.set(mContainerPaddingLeft, 0, widthPx - mContainerPaddingRight, heightPx);
-
DeviceProfile grid = mLauncher.getDeviceProfile();
grid.updateAppsViewNumCols();
if (FeatureFlags.LAUNCHER3_ALL_APPS_PULL_UP) {
@@ -446,17 +438,6 @@
}
@Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- return handleTouchEvent(ev);
- }
-
- @SuppressLint("ClickableViewAccessibility")
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- return handleTouchEvent(ev);
- }
-
- @Override
public boolean onLongClick(View v) {
// Return early if this is not initiated from a touch
if (!v.isInTouchMode()) return false;
@@ -561,55 +542,6 @@
}
}
- /**
- * Handles the touch events to dismiss all apps when clicking outside the bounds of the
- * recycler view.
- */
- private boolean handleTouchEvent(MotionEvent ev) {
- DeviceProfile grid = mLauncher.getDeviceProfile();
- int x = (int) ev.getX();
- int y = (int) ev.getY();
-
- switch (ev.getAction()) {
- case MotionEvent.ACTION_DOWN:
- if (!mContentBounds.isEmpty()) {
- // Outset the fixed bounds and check if the touch is outside all apps
- Rect tmpRect = new Rect(mContentBounds);
- tmpRect.inset(-grid.allAppsIconSizePx / 2, 0);
- if (ev.getX() < tmpRect.left || ev.getX() > tmpRect.right) {
- mBoundsCheckLastTouchDownPos.set(x, y);
- return true;
- }
- } else {
- // Check if the touch is outside all apps
- if (ev.getX() < getPaddingLeft() ||
- ev.getX() > (getWidth() - getPaddingRight())) {
- mBoundsCheckLastTouchDownPos.set(x, y);
- return true;
- }
- }
- break;
- case MotionEvent.ACTION_UP:
- if (mBoundsCheckLastTouchDownPos.x > -1) {
- ViewConfiguration viewConfig = ViewConfiguration.get(getContext());
- float dx = ev.getX() - mBoundsCheckLastTouchDownPos.x;
- float dy = ev.getY() - mBoundsCheckLastTouchDownPos.y;
- float distance = (float) Math.hypot(dx, dy);
- if (distance < viewConfig.getScaledTouchSlop()) {
- // The background was clicked, so just go home
- Launcher launcher = (Launcher) getContext();
- launcher.showWorkspace(true);
- return true;
- }
- }
- // Fall through
- case MotionEvent.ACTION_CANCEL:
- mBoundsCheckLastTouchDownPos.set(-1, -1);
- break;
- }
- return false;
- }
-
@Override
public void onSearchResult(String query, ArrayList<ComponentKey> apps) {
if (apps != null) {