RecentsViewTouchHandler.java revision 231bc9c54a48921f9c6a1ae187969c9bfe9d121f
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 19be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport android.content.res.Configuration; 20be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport android.graphics.Point; 21be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport android.view.MotionEvent; 223e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winsonimport android.view.ViewConfiguration; 23231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinsonimport android.view.ViewDebug; 24c0d7058b14c24cd07912f5629c26b39b7b4673d5Winson 2553ec42cb17693b2d631746e1e5d31021a3359163Winsonimport com.android.systemui.recents.Recents; 26882072baacaee4ecd43f0209b691a9af746462f2Winsonimport com.android.systemui.recents.RecentsConfiguration; 27be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport com.android.systemui.recents.events.EventBus; 28eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winsonimport com.android.systemui.recents.events.ui.dragndrop.DragDropTargetChangedEvent; 29be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport com.android.systemui.recents.events.ui.dragndrop.DragEndEvent; 30be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport com.android.systemui.recents.events.ui.dragndrop.DragStartEvent; 31eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winsonimport com.android.systemui.recents.events.ui.dragndrop.DragStartInitializeDropTargetsEvent; 32d759a7123a7cacf431399b310421c59a6c818e53Winsonimport com.android.systemui.recents.misc.SystemServicesProxy; 33be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport com.android.systemui.recents.model.Task; 34be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport com.android.systemui.recents.model.TaskStack; 35be7607af8875236b9cf7bdb5f5aa089c207529afWinson 36eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winsonimport java.util.ArrayList; 37eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson 38be7607af8875236b9cf7bdb5f5aa089c207529afWinson 39be7607af8875236b9cf7bdb5f5aa089c207529afWinson/** 40be7607af8875236b9cf7bdb5f5aa089c207529afWinson * Represents the dock regions for each orientation. 41be7607af8875236b9cf7bdb5f5aa089c207529afWinson */ 42be7607af8875236b9cf7bdb5f5aa089c207529afWinsonclass DockRegion { 43882072baacaee4ecd43f0209b691a9af746462f2Winson public static TaskStack.DockState[] PHONE_LANDSCAPE = { 44e92440ee5fad343c680d889136f9a9847a80a418Winson // We only allow docking to the left for now on small devices 452364f26dc24191e5bfbab45bc1bdf9babe13af80Winson TaskStack.DockState.LEFT 46be7607af8875236b9cf7bdb5f5aa089c207529afWinson }; 47882072baacaee4ecd43f0209b691a9af746462f2Winson public static TaskStack.DockState[] PHONE_PORTRAIT = { 48e92440ee5fad343c680d889136f9a9847a80a418Winson // We only allow docking to the top for now on small devices 494165d336b6cd69715eda7fbdfd272a878097170eWinson TaskStack.DockState.TOP 50be7607af8875236b9cf7bdb5f5aa089c207529afWinson }; 51882072baacaee4ecd43f0209b691a9af746462f2Winson public static TaskStack.DockState[] TABLET_LANDSCAPE = { 52e92440ee5fad343c680d889136f9a9847a80a418Winson TaskStack.DockState.LEFT, 53e92440ee5fad343c680d889136f9a9847a80a418Winson TaskStack.DockState.RIGHT 54882072baacaee4ecd43f0209b691a9af746462f2Winson }; 55882072baacaee4ecd43f0209b691a9af746462f2Winson public static TaskStack.DockState[] TABLET_PORTRAIT = PHONE_PORTRAIT; 56be7607af8875236b9cf7bdb5f5aa089c207529afWinson} 57be7607af8875236b9cf7bdb5f5aa089c207529afWinson 58be7607af8875236b9cf7bdb5f5aa089c207529afWinson/** 59be7607af8875236b9cf7bdb5f5aa089c207529afWinson * Handles touch events for a RecentsView. 60be7607af8875236b9cf7bdb5f5aa089c207529afWinson */ 61eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winsonpublic class RecentsViewTouchHandler { 62eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson 63be7607af8875236b9cf7bdb5f5aa089c207529afWinson private RecentsView mRv; 64be7607af8875236b9cf7bdb5f5aa089c207529afWinson 65231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinson @ViewDebug.ExportedProperty(deepExport=true, prefix="drag_task") 66be7607af8875236b9cf7bdb5f5aa089c207529afWinson private Task mDragTask; 67231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinson @ViewDebug.ExportedProperty(deepExport=true, prefix="drag_task_view_") 68be7607af8875236b9cf7bdb5f5aa089c207529afWinson private TaskView mTaskView; 69be7607af8875236b9cf7bdb5f5aa089c207529afWinson 70231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinson @ViewDebug.ExportedProperty(category="recents") 71479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson private Point mTaskViewOffset = new Point(); 72231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinson @ViewDebug.ExportedProperty(category="recents") 73be7607af8875236b9cf7bdb5f5aa089c207529afWinson private Point mDownPos = new Point(); 74231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinson @ViewDebug.ExportedProperty(category="recents") 753e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson private boolean mDragRequested; 76231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinson @ViewDebug.ExportedProperty(category="recents") 773e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson private boolean mIsDragging; 783e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson private float mDragSlop; 79eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson 80eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson private DropTarget mLastDropTarget; 81eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson private ArrayList<DropTarget> mDropTargets = new ArrayList<>(); 82036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson private ArrayList<TaskStack.DockState> mVisibleDockStates = new ArrayList<>(); 83be7607af8875236b9cf7bdb5f5aa089c207529afWinson 84be7607af8875236b9cf7bdb5f5aa089c207529afWinson public RecentsViewTouchHandler(RecentsView rv) { 85be7607af8875236b9cf7bdb5f5aa089c207529afWinson mRv = rv; 863e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson mDragSlop = ViewConfiguration.get(rv.getContext()).getScaledTouchSlop(); 87be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 88be7607af8875236b9cf7bdb5f5aa089c207529afWinson 89882072baacaee4ecd43f0209b691a9af746462f2Winson /** 90eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson * Registers a new drop target for the current drag only. 91eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson */ 92eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson public void registerDropTargetForCurrentDrag(DropTarget target) { 93eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson mDropTargets.add(target); 94eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson } 95eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson 96eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson /** 97882072baacaee4ecd43f0209b691a9af746462f2Winson * Returns the preferred dock states for the current orientation. 98882072baacaee4ecd43f0209b691a9af746462f2Winson */ 99882072baacaee4ecd43f0209b691a9af746462f2Winson public TaskStack.DockState[] getDockStatesForCurrentOrientation() { 1004165d336b6cd69715eda7fbdfd272a878097170eWinson boolean isLandscape = mRv.getResources().getConfiguration().orientation == 1014165d336b6cd69715eda7fbdfd272a878097170eWinson Configuration.ORIENTATION_LANDSCAPE; 10253ec42cb17693b2d631746e1e5d31021a3359163Winson RecentsConfiguration config = Recents.getConfiguration(); 1034165d336b6cd69715eda7fbdfd272a878097170eWinson TaskStack.DockState[] dockStates = isLandscape ? 104882072baacaee4ecd43f0209b691a9af746462f2Winson (config.isLargeScreen ? DockRegion.TABLET_LANDSCAPE : DockRegion.PHONE_LANDSCAPE) : 105882072baacaee4ecd43f0209b691a9af746462f2Winson (config.isLargeScreen ? DockRegion.TABLET_PORTRAIT : DockRegion.PHONE_PORTRAIT); 106882072baacaee4ecd43f0209b691a9af746462f2Winson return dockStates; 1074165d336b6cd69715eda7fbdfd272a878097170eWinson } 1084165d336b6cd69715eda7fbdfd272a878097170eWinson 109036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson /** 110036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson * Returns the set of visible dock states for this current drag. 111036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson */ 112036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson public ArrayList<TaskStack.DockState> getVisibleDockStates() { 113036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson return mVisibleDockStates; 114036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson } 115036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson 116be7607af8875236b9cf7bdb5f5aa089c207529afWinson /** Touch preprocessing for handling below */ 117be7607af8875236b9cf7bdb5f5aa089c207529afWinson public boolean onInterceptTouchEvent(MotionEvent ev) { 1184165d336b6cd69715eda7fbdfd272a878097170eWinson handleTouchEvent(ev); 1193e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson return mDragRequested; 120be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 121be7607af8875236b9cf7bdb5f5aa089c207529afWinson 122be7607af8875236b9cf7bdb5f5aa089c207529afWinson /** Handles touch events once we have intercepted them */ 123be7607af8875236b9cf7bdb5f5aa089c207529afWinson public boolean onTouchEvent(MotionEvent ev) { 1244165d336b6cd69715eda7fbdfd272a878097170eWinson handleTouchEvent(ev); 1253e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson return mDragRequested; 1264165d336b6cd69715eda7fbdfd272a878097170eWinson } 1274165d336b6cd69715eda7fbdfd272a878097170eWinson 1284165d336b6cd69715eda7fbdfd272a878097170eWinson /**** Events ****/ 1294165d336b6cd69715eda7fbdfd272a878097170eWinson 1304165d336b6cd69715eda7fbdfd272a878097170eWinson public final void onBusEvent(DragStartEvent event) { 131d759a7123a7cacf431399b310421c59a6c818e53Winson SystemServicesProxy ssp = Recents.getSystemServices(); 1324165d336b6cd69715eda7fbdfd272a878097170eWinson mRv.getParent().requestDisallowInterceptTouchEvent(true); 1333e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson mDragRequested = true; 1343e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson // We defer starting the actual drag handling until the user moves past the drag slop 1353e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson mIsDragging = false; 1364165d336b6cd69715eda7fbdfd272a878097170eWinson mDragTask = event.task; 1374165d336b6cd69715eda7fbdfd272a878097170eWinson mTaskView = event.taskView; 138eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson mDropTargets.clear(); 1394165d336b6cd69715eda7fbdfd272a878097170eWinson 140479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson int[] recentsViewLocation = new int[2]; 141479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mRv.getLocationInWindow(recentsViewLocation); 142479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mTaskViewOffset.set(mTaskView.getLeft() - recentsViewLocation[0] + event.tlOffset.x, 143479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mTaskView.getTop() - recentsViewLocation[1] + event.tlOffset.y); 144479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson float x = mDownPos.x - mTaskViewOffset.x; 145479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson float y = mDownPos.y - mTaskViewOffset.y; 146479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mTaskView.setTranslationX(x); 147479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mTaskView.setTranslationY(y); 148eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson 149036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson mVisibleDockStates.clear(); 150036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson if (!ssp.hasDockedTask() && mRv.getTaskStack().getTaskCount() > 1) { 151eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson // Add the dock state drop targets (these take priority) 152eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson TaskStack.DockState[] dockStates = getDockStatesForCurrentOrientation(); 153eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson for (TaskStack.DockState dockState : dockStates) { 154eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson registerDropTargetForCurrentDrag(dockState); 155036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson mVisibleDockStates.add(dockState); 156eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson } 157eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson } 158eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson 159eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson // Request other drop targets to register themselves 160d952961977a0eb6c1fefcb0707d1c61741515f68Winson EventBus.getDefault().send(new DragStartInitializeDropTargetsEvent(event.task, 161d952961977a0eb6c1fefcb0707d1c61741515f68Winson event.taskView, this)); 1624165d336b6cd69715eda7fbdfd272a878097170eWinson } 1634165d336b6cd69715eda7fbdfd272a878097170eWinson 1644165d336b6cd69715eda7fbdfd272a878097170eWinson public final void onBusEvent(DragEndEvent event) { 1653e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson mDragRequested = false; 1664165d336b6cd69715eda7fbdfd272a878097170eWinson mDragTask = null; 1674165d336b6cd69715eda7fbdfd272a878097170eWinson mTaskView = null; 168eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson mLastDropTarget = null; 1694165d336b6cd69715eda7fbdfd272a878097170eWinson } 170be7607af8875236b9cf7bdb5f5aa089c207529afWinson 1714165d336b6cd69715eda7fbdfd272a878097170eWinson /** 1724165d336b6cd69715eda7fbdfd272a878097170eWinson * Handles dragging touch events 1734165d336b6cd69715eda7fbdfd272a878097170eWinson */ 1744165d336b6cd69715eda7fbdfd272a878097170eWinson private void handleTouchEvent(MotionEvent ev) { 175be7607af8875236b9cf7bdb5f5aa089c207529afWinson int action = ev.getAction(); 176be7607af8875236b9cf7bdb5f5aa089c207529afWinson switch (action & MotionEvent.ACTION_MASK) { 177be7607af8875236b9cf7bdb5f5aa089c207529afWinson case MotionEvent.ACTION_DOWN: 178be7607af8875236b9cf7bdb5f5aa089c207529afWinson mDownPos.set((int) ev.getX(), (int) ev.getY()); 179be7607af8875236b9cf7bdb5f5aa089c207529afWinson break; 180be7607af8875236b9cf7bdb5f5aa089c207529afWinson case MotionEvent.ACTION_MOVE: { 1813e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson float evX = ev.getX(); 1823e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson float evY = ev.getY(); 1833e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson float x = evX - mTaskViewOffset.x; 1843e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson float y = evY - mTaskViewOffset.y; 1853e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson 1863e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (mDragRequested) { 1873e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (!mIsDragging) { 1883e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson mIsDragging = Math.hypot(evX - mDownPos.x, evY - mDownPos.y) > mDragSlop; 1894165d336b6cd69715eda7fbdfd272a878097170eWinson } 1903e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (mIsDragging) { 1913e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson int width = mRv.getMeasuredWidth(); 1923e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson int height = mRv.getMeasuredHeight(); 1933e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson 1943e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson DropTarget currentDropTarget = null; 1953e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson 1963e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson // Give priority to the current drop target to retain the touch handling 1973e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (mLastDropTarget != null) { 1983e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (mLastDropTarget.acceptsDrop((int) evX, (int) evY, width, height, 1993e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson true /* isCurrentTarget */)) { 2003e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson currentDropTarget = mLastDropTarget; 2013e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson } 2023e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson } 2033e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson 2043e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson // Otherwise, find the next target to handle this event 2053e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (currentDropTarget == null) { 2063e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson for (DropTarget target : mDropTargets) { 2073e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (target.acceptsDrop((int) evX, (int) evY, width, height, 2083e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson false /* isCurrentTarget */)) { 2093e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson currentDropTarget = target; 2103e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson break; 2113e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson } 2123e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson } 2133e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson } 2143e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (mLastDropTarget != currentDropTarget) { 2153e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson mLastDropTarget = currentDropTarget; 2163e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson EventBus.getDefault().send(new DragDropTargetChangedEvent(mDragTask, 2173e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson currentDropTarget)); 2183e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson } 2193e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson 220be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 221be7607af8875236b9cf7bdb5f5aa089c207529afWinson 222479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mTaskView.setTranslationX(x); 223479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mTaskView.setTranslationY(y); 2244165d336b6cd69715eda7fbdfd272a878097170eWinson } 225be7607af8875236b9cf7bdb5f5aa089c207529afWinson break; 226be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 227be7607af8875236b9cf7bdb5f5aa089c207529afWinson case MotionEvent.ACTION_UP: 228be7607af8875236b9cf7bdb5f5aa089c207529afWinson case MotionEvent.ACTION_CANCEL: { 2293e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (mDragRequested) { 230479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson EventBus.getDefault().send(new DragEndEvent(mDragTask, mTaskView, 231aaeaac17831090594e4927b1531c4658d239a3eaWinson Chung mLastDropTarget)); 23209d8a184c6d9d996663da1756ab4ac7d54c04b45Winson break; 23309d8a184c6d9d996663da1756ab4ac7d54c04b45Winson } 234be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 235be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 236be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 237be7607af8875236b9cf7bdb5f5aa089c207529afWinson} 238