RecentsViewTouchHandler.java revision 3975de5f8347b3ef1d64a038f3d50dd065618367
1be7607af8875236b9cf7bdb5f5aa089c207529afWinson/* 2be7607af8875236b9cf7bdb5f5aa089c207529afWinson * Copyright (C) 2014 The Android Open Source Project 3be7607af8875236b9cf7bdb5f5aa089c207529afWinson * 4be7607af8875236b9cf7bdb5f5aa089c207529afWinson * Licensed under the Apache License, Version 2.0 (the "License"); 5be7607af8875236b9cf7bdb5f5aa089c207529afWinson * you may not use this file except in compliance with the License. 6be7607af8875236b9cf7bdb5f5aa089c207529afWinson * You may obtain a copy of the License at 7be7607af8875236b9cf7bdb5f5aa089c207529afWinson * 8be7607af8875236b9cf7bdb5f5aa089c207529afWinson * http://www.apache.org/licenses/LICENSE-2.0 9be7607af8875236b9cf7bdb5f5aa089c207529afWinson * 10be7607af8875236b9cf7bdb5f5aa089c207529afWinson * Unless required by applicable law or agreed to in writing, software 11be7607af8875236b9cf7bdb5f5aa089c207529afWinson * distributed under the License is distributed on an "AS IS" BASIS, 12be7607af8875236b9cf7bdb5f5aa089c207529afWinson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13be7607af8875236b9cf7bdb5f5aa089c207529afWinson * See the License for the specific language governing permissions and 14be7607af8875236b9cf7bdb5f5aa089c207529afWinson * limitations under the License. 15be7607af8875236b9cf7bdb5f5aa089c207529afWinson */ 16be7607af8875236b9cf7bdb5f5aa089c207529afWinson 17be7607af8875236b9cf7bdb5f5aa089c207529afWinsonpackage com.android.systemui.recents.views; 18be7607af8875236b9cf7bdb5f5aa089c207529afWinson 19c694a509ff768b6a942616676dd8103e20d06e66Winsonimport android.app.ActivityManager; 20be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport android.content.res.Configuration; 21be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport android.graphics.Point; 2219cf2972582198484816ac15ba83a4f46946082bJorim Jaggiimport android.graphics.Rect; 23131d53a7d817560ad06b5f26dc64a2969aeed53fWinsonimport android.view.InputDevice; 24be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport android.view.MotionEvent; 25131d53a7d817560ad06b5f26dc64a2969aeed53fWinsonimport android.view.PointerIcon; 263e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winsonimport android.view.ViewConfiguration; 27231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinsonimport android.view.ViewDebug; 28c0d7058b14c24cd07912f5629c26b39b7b4673d5Winson 2919cf2972582198484816ac15ba83a4f46946082bJorim Jaggiimport com.android.internal.policy.DividerSnapAlgorithm; 3053ec42cb17693b2d631746e1e5d31021a3359163Winsonimport com.android.systemui.recents.Recents; 31882072baacaee4ecd43f0209b691a9af746462f2Winsonimport com.android.systemui.recents.RecentsConfiguration; 32be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport com.android.systemui.recents.events.EventBus; 3319cf2972582198484816ac15ba83a4f46946082bJorim Jaggiimport com.android.systemui.recents.events.activity.ConfigurationChangedEvent; 343975de5f8347b3ef1d64a038f3d50dd065618367Matthew Ngimport com.android.systemui.recents.events.activity.HideRecentsEvent; 359b001396c26e5b5ee95e0a54213a8a421179e365Winsonimport com.android.systemui.recents.events.ui.HideIncompatibleAppOverlayEvent; 369b001396c26e5b5ee95e0a54213a8a421179e365Winsonimport com.android.systemui.recents.events.ui.ShowIncompatibleAppOverlayEvent; 37eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winsonimport com.android.systemui.recents.events.ui.dragndrop.DragDropTargetChangedEvent; 38be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport com.android.systemui.recents.events.ui.dragndrop.DragEndEvent; 39be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport com.android.systemui.recents.events.ui.dragndrop.DragStartEvent; 40eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winsonimport com.android.systemui.recents.events.ui.dragndrop.DragStartInitializeDropTargetsEvent; 41d759a7123a7cacf431399b310421c59a6c818e53Winsonimport com.android.systemui.recents.misc.SystemServicesProxy; 42be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport com.android.systemui.recents.model.Task; 43be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport com.android.systemui.recents.model.TaskStack; 44be7607af8875236b9cf7bdb5f5aa089c207529afWinson 45eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winsonimport java.util.ArrayList; 46eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson 47be7607af8875236b9cf7bdb5f5aa089c207529afWinson/** 48be7607af8875236b9cf7bdb5f5aa089c207529afWinson * Represents the dock regions for each orientation. 49be7607af8875236b9cf7bdb5f5aa089c207529afWinson */ 50be7607af8875236b9cf7bdb5f5aa089c207529afWinsonclass DockRegion { 5108deff0a67bd1e2d44477ed7c84c39fb3299fb7cWinson public static TaskStack.DockState[] PHONE_LANDSCAPE = { 5208deff0a67bd1e2d44477ed7c84c39fb3299fb7cWinson // We only allow docking to the left in landscape for now on small devices 532364f26dc24191e5bfbab45bc1bdf9babe13af80Winson TaskStack.DockState.LEFT 54be7607af8875236b9cf7bdb5f5aa089c207529afWinson }; 55882072baacaee4ecd43f0209b691a9af746462f2Winson public static TaskStack.DockState[] PHONE_PORTRAIT = { 56e92440ee5fad343c680d889136f9a9847a80a418Winson // We only allow docking to the top for now on small devices 574165d336b6cd69715eda7fbdfd272a878097170eWinson TaskStack.DockState.TOP 58be7607af8875236b9cf7bdb5f5aa089c207529afWinson }; 59882072baacaee4ecd43f0209b691a9af746462f2Winson public static TaskStack.DockState[] TABLET_LANDSCAPE = { 60e92440ee5fad343c680d889136f9a9847a80a418Winson TaskStack.DockState.LEFT, 61e92440ee5fad343c680d889136f9a9847a80a418Winson TaskStack.DockState.RIGHT 62882072baacaee4ecd43f0209b691a9af746462f2Winson }; 63882072baacaee4ecd43f0209b691a9af746462f2Winson public static TaskStack.DockState[] TABLET_PORTRAIT = PHONE_PORTRAIT; 64be7607af8875236b9cf7bdb5f5aa089c207529afWinson} 65be7607af8875236b9cf7bdb5f5aa089c207529afWinson 66be7607af8875236b9cf7bdb5f5aa089c207529afWinson/** 67be7607af8875236b9cf7bdb5f5aa089c207529afWinson * Handles touch events for a RecentsView. 68be7607af8875236b9cf7bdb5f5aa089c207529afWinson */ 69eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winsonpublic class RecentsViewTouchHandler { 70eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson 71be7607af8875236b9cf7bdb5f5aa089c207529afWinson private RecentsView mRv; 72be7607af8875236b9cf7bdb5f5aa089c207529afWinson 73231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinson @ViewDebug.ExportedProperty(deepExport=true, prefix="drag_task") 74be7607af8875236b9cf7bdb5f5aa089c207529afWinson private Task mDragTask; 75231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinson @ViewDebug.ExportedProperty(deepExport=true, prefix="drag_task_view_") 76be7607af8875236b9cf7bdb5f5aa089c207529afWinson private TaskView mTaskView; 77be7607af8875236b9cf7bdb5f5aa089c207529afWinson 78231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinson @ViewDebug.ExportedProperty(category="recents") 79479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson private Point mTaskViewOffset = new Point(); 80231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinson @ViewDebug.ExportedProperty(category="recents") 81be7607af8875236b9cf7bdb5f5aa089c207529afWinson private Point mDownPos = new Point(); 82231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinson @ViewDebug.ExportedProperty(category="recents") 833e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson private boolean mDragRequested; 84231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinson @ViewDebug.ExportedProperty(category="recents") 853e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson private boolean mIsDragging; 863e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson private float mDragSlop; 87131d53a7d817560ad06b5f26dc64a2969aeed53fWinson private int mDeviceId = -1; 88eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson 89eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson private DropTarget mLastDropTarget; 9019cf2972582198484816ac15ba83a4f46946082bJorim Jaggi private DividerSnapAlgorithm mDividerSnapAlgorithm; 91eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson private ArrayList<DropTarget> mDropTargets = new ArrayList<>(); 92036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson private ArrayList<TaskStack.DockState> mVisibleDockStates = new ArrayList<>(); 93be7607af8875236b9cf7bdb5f5aa089c207529afWinson 94be7607af8875236b9cf7bdb5f5aa089c207529afWinson public RecentsViewTouchHandler(RecentsView rv) { 95be7607af8875236b9cf7bdb5f5aa089c207529afWinson mRv = rv; 963e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson mDragSlop = ViewConfiguration.get(rv.getContext()).getScaledTouchSlop(); 9719cf2972582198484816ac15ba83a4f46946082bJorim Jaggi updateSnapAlgorithm(); 9819cf2972582198484816ac15ba83a4f46946082bJorim Jaggi } 9919cf2972582198484816ac15ba83a4f46946082bJorim Jaggi 10019cf2972582198484816ac15ba83a4f46946082bJorim Jaggi private void updateSnapAlgorithm() { 10119cf2972582198484816ac15ba83a4f46946082bJorim Jaggi Rect insets = new Rect(); 10219cf2972582198484816ac15ba83a4f46946082bJorim Jaggi SystemServicesProxy.getInstance(mRv.getContext()).getStableInsets(insets); 10319cf2972582198484816ac15ba83a4f46946082bJorim Jaggi mDividerSnapAlgorithm = DividerSnapAlgorithm.create(mRv.getContext(), insets); 104be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 105be7607af8875236b9cf7bdb5f5aa089c207529afWinson 106882072baacaee4ecd43f0209b691a9af746462f2Winson /** 107eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson * Registers a new drop target for the current drag only. 108eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson */ 109eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson public void registerDropTargetForCurrentDrag(DropTarget target) { 110eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson mDropTargets.add(target); 111eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson } 112eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson 113eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson /** 114882072baacaee4ecd43f0209b691a9af746462f2Winson * Returns the preferred dock states for the current orientation. 115882072baacaee4ecd43f0209b691a9af746462f2Winson */ 116882072baacaee4ecd43f0209b691a9af746462f2Winson public TaskStack.DockState[] getDockStatesForCurrentOrientation() { 1174165d336b6cd69715eda7fbdfd272a878097170eWinson boolean isLandscape = mRv.getResources().getConfiguration().orientation == 1184165d336b6cd69715eda7fbdfd272a878097170eWinson Configuration.ORIENTATION_LANDSCAPE; 11953ec42cb17693b2d631746e1e5d31021a3359163Winson RecentsConfiguration config = Recents.getConfiguration(); 120c54c748ede08ee79dee2397d2e0820a4067ab3aaWinson if (config.isLargeScreen) { 121c54c748ede08ee79dee2397d2e0820a4067ab3aaWinson return isLandscape ? DockRegion.TABLET_LANDSCAPE : DockRegion.TABLET_PORTRAIT; 122c54c748ede08ee79dee2397d2e0820a4067ab3aaWinson } else { 12308deff0a67bd1e2d44477ed7c84c39fb3299fb7cWinson return isLandscape ? DockRegion.PHONE_LANDSCAPE : DockRegion.PHONE_PORTRAIT; 124c54c748ede08ee79dee2397d2e0820a4067ab3aaWinson } 1254165d336b6cd69715eda7fbdfd272a878097170eWinson } 1264165d336b6cd69715eda7fbdfd272a878097170eWinson 127036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson /** 128036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson * Returns the set of visible dock states for this current drag. 129036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson */ 130036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson public ArrayList<TaskStack.DockState> getVisibleDockStates() { 131036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson return mVisibleDockStates; 132036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson } 133036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson 134be7607af8875236b9cf7bdb5f5aa089c207529afWinson /** Touch preprocessing for handling below */ 135be7607af8875236b9cf7bdb5f5aa089c207529afWinson public boolean onInterceptTouchEvent(MotionEvent ev) { 1364165d336b6cd69715eda7fbdfd272a878097170eWinson handleTouchEvent(ev); 1373e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson return mDragRequested; 138be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 139be7607af8875236b9cf7bdb5f5aa089c207529afWinson 140be7607af8875236b9cf7bdb5f5aa089c207529afWinson /** Handles touch events once we have intercepted them */ 141be7607af8875236b9cf7bdb5f5aa089c207529afWinson public boolean onTouchEvent(MotionEvent ev) { 1424165d336b6cd69715eda7fbdfd272a878097170eWinson handleTouchEvent(ev); 1433975de5f8347b3ef1d64a038f3d50dd065618367Matthew Ng if (ev.getAction() == MotionEvent.ACTION_UP && mRv.getStack().getStackTaskCount() == 0) { 1443975de5f8347b3ef1d64a038f3d50dd065618367Matthew Ng EventBus.getDefault().send(new HideRecentsEvent(false, true)); 1453975de5f8347b3ef1d64a038f3d50dd065618367Matthew Ng } 1463975de5f8347b3ef1d64a038f3d50dd065618367Matthew Ng return true; 1474165d336b6cd69715eda7fbdfd272a878097170eWinson } 1484165d336b6cd69715eda7fbdfd272a878097170eWinson 1494165d336b6cd69715eda7fbdfd272a878097170eWinson /**** Events ****/ 1504165d336b6cd69715eda7fbdfd272a878097170eWinson 1514165d336b6cd69715eda7fbdfd272a878097170eWinson public final void onBusEvent(DragStartEvent event) { 152d759a7123a7cacf431399b310421c59a6c818e53Winson SystemServicesProxy ssp = Recents.getSystemServices(); 1534165d336b6cd69715eda7fbdfd272a878097170eWinson mRv.getParent().requestDisallowInterceptTouchEvent(true); 1543e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson mDragRequested = true; 1553e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson // We defer starting the actual drag handling until the user moves past the drag slop 1563e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson mIsDragging = false; 1574165d336b6cd69715eda7fbdfd272a878097170eWinson mDragTask = event.task; 1584165d336b6cd69715eda7fbdfd272a878097170eWinson mTaskView = event.taskView; 159eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson mDropTargets.clear(); 1604165d336b6cd69715eda7fbdfd272a878097170eWinson 161479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson int[] recentsViewLocation = new int[2]; 162479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mRv.getLocationInWindow(recentsViewLocation); 163479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mTaskViewOffset.set(mTaskView.getLeft() - recentsViewLocation[0] + event.tlOffset.x, 164479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mTaskView.getTop() - recentsViewLocation[1] + event.tlOffset.y); 165479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson float x = mDownPos.x - mTaskViewOffset.x; 166479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson float y = mDownPos.y - mTaskViewOffset.y; 167479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mTaskView.setTranslationX(x); 168479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mTaskView.setTranslationY(y); 169eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson 170036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson mVisibleDockStates.clear(); 17119cf2972582198484816ac15ba83a4f46946082bJorim Jaggi if (ActivityManager.supportsMultiWindow() && !ssp.hasDockedTask() 17219cf2972582198484816ac15ba83a4f46946082bJorim Jaggi && mDividerSnapAlgorithm.isSplitScreenFeasible()) { 173f21c3dace89b168f5e5e4e96532d977b8b0a1cf5Winson Recents.logDockAttempt(mRv.getContext(), event.task.getTopComponent(), 174f21c3dace89b168f5e5e4e96532d977b8b0a1cf5Winson event.task.resizeMode); 175931845fcb3823ce175fcfc7c6ce2d9751102c331Winson if (!event.task.isDockable) { 1769b001396c26e5b5ee95e0a54213a8a421179e365Winson EventBus.getDefault().send(new ShowIncompatibleAppOverlayEvent()); 177931845fcb3823ce175fcfc7c6ce2d9751102c331Winson } else { 178931845fcb3823ce175fcfc7c6ce2d9751102c331Winson // Add the dock state drop targets (these take priority) 179931845fcb3823ce175fcfc7c6ce2d9751102c331Winson TaskStack.DockState[] dockStates = getDockStatesForCurrentOrientation(); 180931845fcb3823ce175fcfc7c6ce2d9751102c331Winson for (TaskStack.DockState dockState : dockStates) { 181931845fcb3823ce175fcfc7c6ce2d9751102c331Winson registerDropTargetForCurrentDrag(dockState); 18299ef458ff1b79c93a8dfdc289fb6ff80fd7aacf6Winson dockState.update(mRv.getContext()); 183931845fcb3823ce175fcfc7c6ce2d9751102c331Winson mVisibleDockStates.add(dockState); 184931845fcb3823ce175fcfc7c6ce2d9751102c331Winson } 185eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson } 186eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson } 187eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson 188eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson // Request other drop targets to register themselves 189d952961977a0eb6c1fefcb0707d1c61741515f68Winson EventBus.getDefault().send(new DragStartInitializeDropTargetsEvent(event.task, 190d952961977a0eb6c1fefcb0707d1c61741515f68Winson event.taskView, this)); 191131d53a7d817560ad06b5f26dc64a2969aeed53fWinson if (mDeviceId != -1) { 192131d53a7d817560ad06b5f26dc64a2969aeed53fWinson InputDevice.getDevice(mDeviceId).setPointerType(PointerIcon.TYPE_GRABBING); 193131d53a7d817560ad06b5f26dc64a2969aeed53fWinson } 1944165d336b6cd69715eda7fbdfd272a878097170eWinson } 1954165d336b6cd69715eda7fbdfd272a878097170eWinson 1964165d336b6cd69715eda7fbdfd272a878097170eWinson public final void onBusEvent(DragEndEvent event) { 1979b001396c26e5b5ee95e0a54213a8a421179e365Winson if (!mDragTask.isDockable) { 1989b001396c26e5b5ee95e0a54213a8a421179e365Winson EventBus.getDefault().send(new HideIncompatibleAppOverlayEvent()); 1999b001396c26e5b5ee95e0a54213a8a421179e365Winson } 2003e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson mDragRequested = false; 2014165d336b6cd69715eda7fbdfd272a878097170eWinson mDragTask = null; 2024165d336b6cd69715eda7fbdfd272a878097170eWinson mTaskView = null; 203eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson mLastDropTarget = null; 2044165d336b6cd69715eda7fbdfd272a878097170eWinson } 205be7607af8875236b9cf7bdb5f5aa089c207529afWinson 20619cf2972582198484816ac15ba83a4f46946082bJorim Jaggi public final void onBusEvent(ConfigurationChangedEvent event) { 2079832f8f463a7d5448af2294bce05eac85f4dbef0Winson if (event.fromDisplayDensityChange || event.fromDeviceOrientationChange) { 20825160db73f37619a26a3d87a06625925d881b0fdJorim Jaggi updateSnapAlgorithm(); 20925160db73f37619a26a3d87a06625925d881b0fdJorim Jaggi } 21019cf2972582198484816ac15ba83a4f46946082bJorim Jaggi } 21119cf2972582198484816ac15ba83a4f46946082bJorim Jaggi 2124165d336b6cd69715eda7fbdfd272a878097170eWinson /** 2134165d336b6cd69715eda7fbdfd272a878097170eWinson * Handles dragging touch events 2144165d336b6cd69715eda7fbdfd272a878097170eWinson */ 2154165d336b6cd69715eda7fbdfd272a878097170eWinson private void handleTouchEvent(MotionEvent ev) { 216a20eeda52951021da758fefba7bf956c9c9d15a2Jorim Jaggi int action = ev.getActionMasked(); 217a20eeda52951021da758fefba7bf956c9c9d15a2Jorim Jaggi switch (action) { 218be7607af8875236b9cf7bdb5f5aa089c207529afWinson case MotionEvent.ACTION_DOWN: 219be7607af8875236b9cf7bdb5f5aa089c207529afWinson mDownPos.set((int) ev.getX(), (int) ev.getY()); 220131d53a7d817560ad06b5f26dc64a2969aeed53fWinson mDeviceId = ev.getDeviceId(); 221be7607af8875236b9cf7bdb5f5aa089c207529afWinson break; 222be7607af8875236b9cf7bdb5f5aa089c207529afWinson case MotionEvent.ACTION_MOVE: { 2233e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson float evX = ev.getX(); 2243e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson float evY = ev.getY(); 2253e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson float x = evX - mTaskViewOffset.x; 2263e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson float y = evY - mTaskViewOffset.y; 2273e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson 2283e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (mDragRequested) { 2293e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (!mIsDragging) { 2303e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson mIsDragging = Math.hypot(evX - mDownPos.x, evY - mDownPos.y) > mDragSlop; 2314165d336b6cd69715eda7fbdfd272a878097170eWinson } 2323e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (mIsDragging) { 2333e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson int width = mRv.getMeasuredWidth(); 2343e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson int height = mRv.getMeasuredHeight(); 2353e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson 2363e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson DropTarget currentDropTarget = null; 2373e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson 2383e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson // Give priority to the current drop target to retain the touch handling 2393e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (mLastDropTarget != null) { 2403e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (mLastDropTarget.acceptsDrop((int) evX, (int) evY, width, height, 24108deff0a67bd1e2d44477ed7c84c39fb3299fb7cWinson mRv.mSystemInsets, true /* isCurrentTarget */)) { 2423e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson currentDropTarget = mLastDropTarget; 2433e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson } 2443e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson } 2453e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson 2463e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson // Otherwise, find the next target to handle this event 2473e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (currentDropTarget == null) { 2483e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson for (DropTarget target : mDropTargets) { 2493e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (target.acceptsDrop((int) evX, (int) evY, width, height, 25008deff0a67bd1e2d44477ed7c84c39fb3299fb7cWinson mRv.mSystemInsets, false /* isCurrentTarget */)) { 2513e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson currentDropTarget = target; 2523e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson break; 2533e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson } 2543e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson } 2553e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson } 2563e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (mLastDropTarget != currentDropTarget) { 2573e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson mLastDropTarget = currentDropTarget; 2583e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson EventBus.getDefault().send(new DragDropTargetChangedEvent(mDragTask, 2593e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson currentDropTarget)); 2603e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson } 2613e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson 262be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 263be7607af8875236b9cf7bdb5f5aa089c207529afWinson 264479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mTaskView.setTranslationX(x); 265479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mTaskView.setTranslationY(y); 2664165d336b6cd69715eda7fbdfd272a878097170eWinson } 267be7607af8875236b9cf7bdb5f5aa089c207529afWinson break; 268be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 269be7607af8875236b9cf7bdb5f5aa089c207529afWinson case MotionEvent.ACTION_UP: 270be7607af8875236b9cf7bdb5f5aa089c207529afWinson case MotionEvent.ACTION_CANCEL: { 2713e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (mDragRequested) { 272f300badbf10505fbcb884aebb0f2c3120e018748Jorim Jaggi boolean cancelled = action == MotionEvent.ACTION_CANCEL; 273f300badbf10505fbcb884aebb0f2c3120e018748Jorim Jaggi if (cancelled) { 274f300badbf10505fbcb884aebb0f2c3120e018748Jorim Jaggi EventBus.getDefault().send(new DragDropTargetChangedEvent(mDragTask, null)); 275f300badbf10505fbcb884aebb0f2c3120e018748Jorim Jaggi } 276479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson EventBus.getDefault().send(new DragEndEvent(mDragTask, mTaskView, 277f300badbf10505fbcb884aebb0f2c3120e018748Jorim Jaggi !cancelled ? mLastDropTarget : null)); 27809d8a184c6d9d996663da1756ab4ac7d54c04b45Winson break; 27909d8a184c6d9d996663da1756ab4ac7d54c04b45Winson } 280131d53a7d817560ad06b5f26dc64a2969aeed53fWinson mDeviceId = -1; 281be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 282be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 283be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 284be7607af8875236b9cf7bdb5f5aa089c207529afWinson} 285