diff options
Diffstat (limited to 'src/com/android/launcher3/AppsContainerView.java')
-rw-r--r-- | src/com/android/launcher3/AppsContainerView.java | 65 |
1 files changed, 62 insertions, 3 deletions
diff --git a/src/com/android/launcher3/AppsContainerView.java b/src/com/android/launcher3/AppsContainerView.java index 52bc6b6ef..376f888f6 100644 --- a/src/com/android/launcher3/AppsContainerView.java +++ b/src/com/android/launcher3/AppsContainerView.java @@ -63,7 +63,8 @@ public class AppsContainerView extends FrameLayout implements DragSource, Insett private EditText mSearchBarView; private int mNumAppsPerRow; - private Point mLastTouchDownPos = new Point(); + private Point mLastTouchDownPos = new Point(-1, -1); + private Point mLastTouchPos = new Point(); private Rect mInsets = new Rect(); private Rect mFixedBounds = new Rect(); private int mContentMarginStart; @@ -235,11 +236,21 @@ public class AppsContainerView extends FrameLayout implements DragSource, Insett } @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + return handleTouchEvent(ev); + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + return handleTouchEvent(ev); + } + + @Override public boolean onTouch(View v, MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: - mLastTouchDownPos.set((int) ev.getX(), (int) ev.getY()); + mLastTouchPos.set((int) ev.getX(), (int) ev.getY()); break; } return false; @@ -256,7 +267,7 @@ public class AppsContainerView extends FrameLayout implements DragSource, Insett if (!mLauncher.isDraggingEnabled()) return false; // Start the drag - mLauncher.getWorkspace().beginDragShared(v, mLastTouchDownPos, this, false); + mLauncher.getWorkspace().beginDragShared(v, mLastTouchPos, this, false); // We delay entering spring-loaded mode slightly to make sure the UI // thready is free of any work. @@ -429,6 +440,54 @@ public class AppsContainerView extends FrameLayout implements DragSource, Insett } /** + * Handles the touch events to dismiss all apps when clicking outside the bounds of the + * recycler view. + */ + private boolean handleTouchEvent(MotionEvent ev) { + LauncherAppState app = LauncherAppState.getInstance(); + DeviceProfile grid = app.getDynamicGrid().getDeviceProfile(); + + switch (ev.getAction()) { + case MotionEvent.ACTION_DOWN: + if (!mFixedBounds.isEmpty()) { + // Outset the fixed bounds and check if the touch is outside all apps + Rect tmpRect = new Rect(mFixedBounds); + tmpRect.inset(-grid.allAppsIconSizePx / 2, 0); + if (ev.getX() < tmpRect.left || ev.getX() > tmpRect.right) { + mLastTouchDownPos.set((int) ev.getX(), (int) ev.getY()); + return true; + } + } else { + // Check if the touch is outside all apps + if (ev.getX() < getPaddingLeft() || + ev.getX() > (getWidth() - getPaddingRight())) { + mLastTouchDownPos.set((int) ev.getX(), (int) ev.getY()); + return true; + } + } + break; + case MotionEvent.ACTION_UP: + if (mLastTouchDownPos.x > -1) { + ViewConfiguration viewConfig = ViewConfiguration.get(getContext()); + float dx = ev.getX() - mLastTouchDownPos.x; + float dy = ev.getY() - mLastTouchDownPos.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: + mLastTouchDownPos.set(-1, -1); + break; + } + return false; + } + + /** * Update the padding of the Apps view and children. To ensure that the RecyclerView has the * full width to handle touches right to the edge of the screen, we only apply the top and * bottom padding to the AppsContainerView and then the left/right padding on the RecyclerView |