RecentsViewTouchHandler.java revision 931845fcb3823ce175fcfc7c6ce2d9751102c331
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; 24931845fcb3823ce175fcfc7c6ce2d9751102c331Winsonimport android.widget.Toast; 25c0d7058b14c24cd07912f5629c26b39b7b4673d5Winson 26931845fcb3823ce175fcfc7c6ce2d9751102c331Winsonimport com.android.systemui.R; 2753ec42cb17693b2d631746e1e5d31021a3359163Winsonimport com.android.systemui.recents.Recents; 28882072baacaee4ecd43f0209b691a9af746462f2Winsonimport com.android.systemui.recents.RecentsConfiguration; 29be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport com.android.systemui.recents.events.EventBus; 30eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winsonimport com.android.systemui.recents.events.ui.dragndrop.DragDropTargetChangedEvent; 31be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport com.android.systemui.recents.events.ui.dragndrop.DragEndEvent; 32be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport com.android.systemui.recents.events.ui.dragndrop.DragStartEvent; 33eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winsonimport com.android.systemui.recents.events.ui.dragndrop.DragStartInitializeDropTargetsEvent; 34d759a7123a7cacf431399b310421c59a6c818e53Winsonimport com.android.systemui.recents.misc.SystemServicesProxy; 35be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport com.android.systemui.recents.model.Task; 36be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport com.android.systemui.recents.model.TaskStack; 37be7607af8875236b9cf7bdb5f5aa089c207529afWinson 38eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winsonimport java.util.ArrayList; 39eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson 40be7607af8875236b9cf7bdb5f5aa089c207529afWinson 41be7607af8875236b9cf7bdb5f5aa089c207529afWinson/** 42be7607af8875236b9cf7bdb5f5aa089c207529afWinson * Represents the dock regions for each orientation. 43be7607af8875236b9cf7bdb5f5aa089c207529afWinson */ 44be7607af8875236b9cf7bdb5f5aa089c207529afWinsonclass DockRegion { 45882072baacaee4ecd43f0209b691a9af746462f2Winson public static TaskStack.DockState[] PHONE_LANDSCAPE = { 46e92440ee5fad343c680d889136f9a9847a80a418Winson // We only allow docking to the left for now on small devices 472364f26dc24191e5bfbab45bc1bdf9babe13af80Winson TaskStack.DockState.LEFT 48be7607af8875236b9cf7bdb5f5aa089c207529afWinson }; 49882072baacaee4ecd43f0209b691a9af746462f2Winson public static TaskStack.DockState[] PHONE_PORTRAIT = { 50e92440ee5fad343c680d889136f9a9847a80a418Winson // We only allow docking to the top for now on small devices 514165d336b6cd69715eda7fbdfd272a878097170eWinson TaskStack.DockState.TOP 52be7607af8875236b9cf7bdb5f5aa089c207529afWinson }; 53882072baacaee4ecd43f0209b691a9af746462f2Winson public static TaskStack.DockState[] TABLET_LANDSCAPE = { 54e92440ee5fad343c680d889136f9a9847a80a418Winson TaskStack.DockState.LEFT, 55e92440ee5fad343c680d889136f9a9847a80a418Winson TaskStack.DockState.RIGHT 56882072baacaee4ecd43f0209b691a9af746462f2Winson }; 57882072baacaee4ecd43f0209b691a9af746462f2Winson public static TaskStack.DockState[] TABLET_PORTRAIT = PHONE_PORTRAIT; 58be7607af8875236b9cf7bdb5f5aa089c207529afWinson} 59be7607af8875236b9cf7bdb5f5aa089c207529afWinson 60be7607af8875236b9cf7bdb5f5aa089c207529afWinson/** 61be7607af8875236b9cf7bdb5f5aa089c207529afWinson * Handles touch events for a RecentsView. 62be7607af8875236b9cf7bdb5f5aa089c207529afWinson */ 63eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winsonpublic class RecentsViewTouchHandler { 64eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson 65be7607af8875236b9cf7bdb5f5aa089c207529afWinson private RecentsView mRv; 66be7607af8875236b9cf7bdb5f5aa089c207529afWinson 67231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinson @ViewDebug.ExportedProperty(deepExport=true, prefix="drag_task") 68be7607af8875236b9cf7bdb5f5aa089c207529afWinson private Task mDragTask; 69231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinson @ViewDebug.ExportedProperty(deepExport=true, prefix="drag_task_view_") 70be7607af8875236b9cf7bdb5f5aa089c207529afWinson private TaskView mTaskView; 71be7607af8875236b9cf7bdb5f5aa089c207529afWinson 72231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinson @ViewDebug.ExportedProperty(category="recents") 73479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson private Point mTaskViewOffset = new Point(); 74231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinson @ViewDebug.ExportedProperty(category="recents") 75be7607af8875236b9cf7bdb5f5aa089c207529afWinson private Point mDownPos = new Point(); 76231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinson @ViewDebug.ExportedProperty(category="recents") 773e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson private boolean mDragRequested; 78231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinson @ViewDebug.ExportedProperty(category="recents") 793e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson private boolean mIsDragging; 803e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson private float mDragSlop; 81eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson 82eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson private DropTarget mLastDropTarget; 83eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson private ArrayList<DropTarget> mDropTargets = new ArrayList<>(); 84036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson private ArrayList<TaskStack.DockState> mVisibleDockStates = new ArrayList<>(); 85be7607af8875236b9cf7bdb5f5aa089c207529afWinson 86be7607af8875236b9cf7bdb5f5aa089c207529afWinson public RecentsViewTouchHandler(RecentsView rv) { 87be7607af8875236b9cf7bdb5f5aa089c207529afWinson mRv = rv; 883e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson mDragSlop = ViewConfiguration.get(rv.getContext()).getScaledTouchSlop(); 89be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 90be7607af8875236b9cf7bdb5f5aa089c207529afWinson 91882072baacaee4ecd43f0209b691a9af746462f2Winson /** 92eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson * Registers a new drop target for the current drag only. 93eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson */ 94eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson public void registerDropTargetForCurrentDrag(DropTarget target) { 95eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson mDropTargets.add(target); 96eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson } 97eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson 98eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson /** 99882072baacaee4ecd43f0209b691a9af746462f2Winson * Returns the preferred dock states for the current orientation. 100882072baacaee4ecd43f0209b691a9af746462f2Winson */ 101882072baacaee4ecd43f0209b691a9af746462f2Winson public TaskStack.DockState[] getDockStatesForCurrentOrientation() { 1024165d336b6cd69715eda7fbdfd272a878097170eWinson boolean isLandscape = mRv.getResources().getConfiguration().orientation == 1034165d336b6cd69715eda7fbdfd272a878097170eWinson Configuration.ORIENTATION_LANDSCAPE; 10453ec42cb17693b2d631746e1e5d31021a3359163Winson RecentsConfiguration config = Recents.getConfiguration(); 1054165d336b6cd69715eda7fbdfd272a878097170eWinson TaskStack.DockState[] dockStates = isLandscape ? 106882072baacaee4ecd43f0209b691a9af746462f2Winson (config.isLargeScreen ? DockRegion.TABLET_LANDSCAPE : DockRegion.PHONE_LANDSCAPE) : 107882072baacaee4ecd43f0209b691a9af746462f2Winson (config.isLargeScreen ? DockRegion.TABLET_PORTRAIT : DockRegion.PHONE_PORTRAIT); 108882072baacaee4ecd43f0209b691a9af746462f2Winson return dockStates; 1094165d336b6cd69715eda7fbdfd272a878097170eWinson } 1104165d336b6cd69715eda7fbdfd272a878097170eWinson 111036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson /** 112036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson * Returns the set of visible dock states for this current drag. 113036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson */ 114036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson public ArrayList<TaskStack.DockState> getVisibleDockStates() { 115036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson return mVisibleDockStates; 116036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson } 117036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson 118be7607af8875236b9cf7bdb5f5aa089c207529afWinson /** Touch preprocessing for handling below */ 119be7607af8875236b9cf7bdb5f5aa089c207529afWinson public boolean onInterceptTouchEvent(MotionEvent ev) { 1204165d336b6cd69715eda7fbdfd272a878097170eWinson handleTouchEvent(ev); 1213e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson return mDragRequested; 122be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 123be7607af8875236b9cf7bdb5f5aa089c207529afWinson 124be7607af8875236b9cf7bdb5f5aa089c207529afWinson /** Handles touch events once we have intercepted them */ 125be7607af8875236b9cf7bdb5f5aa089c207529afWinson public boolean onTouchEvent(MotionEvent ev) { 1264165d336b6cd69715eda7fbdfd272a878097170eWinson handleTouchEvent(ev); 1273e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson return mDragRequested; 1284165d336b6cd69715eda7fbdfd272a878097170eWinson } 1294165d336b6cd69715eda7fbdfd272a878097170eWinson 1304165d336b6cd69715eda7fbdfd272a878097170eWinson /**** Events ****/ 1314165d336b6cd69715eda7fbdfd272a878097170eWinson 1324165d336b6cd69715eda7fbdfd272a878097170eWinson public final void onBusEvent(DragStartEvent event) { 133d759a7123a7cacf431399b310421c59a6c818e53Winson SystemServicesProxy ssp = Recents.getSystemServices(); 1344165d336b6cd69715eda7fbdfd272a878097170eWinson mRv.getParent().requestDisallowInterceptTouchEvent(true); 1353e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson mDragRequested = true; 1363e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson // We defer starting the actual drag handling until the user moves past the drag slop 1373e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson mIsDragging = false; 1384165d336b6cd69715eda7fbdfd272a878097170eWinson mDragTask = event.task; 1394165d336b6cd69715eda7fbdfd272a878097170eWinson mTaskView = event.taskView; 140eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson mDropTargets.clear(); 1414165d336b6cd69715eda7fbdfd272a878097170eWinson 142479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson int[] recentsViewLocation = new int[2]; 143479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mRv.getLocationInWindow(recentsViewLocation); 144479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mTaskViewOffset.set(mTaskView.getLeft() - recentsViewLocation[0] + event.tlOffset.x, 145479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mTaskView.getTop() - recentsViewLocation[1] + event.tlOffset.y); 146479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson float x = mDownPos.x - mTaskViewOffset.x; 147479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson float y = mDownPos.y - mTaskViewOffset.y; 148479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mTaskView.setTranslationX(x); 149479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mTaskView.setTranslationY(y); 150eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson 151036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson mVisibleDockStates.clear(); 152036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson if (!ssp.hasDockedTask() && mRv.getTaskStack().getTaskCount() > 1) { 153931845fcb3823ce175fcfc7c6ce2d9751102c331Winson if (!event.task.isDockable) { 154931845fcb3823ce175fcfc7c6ce2d9751102c331Winson Toast.makeText(mRv.getContext(), R.string.recents_drag_non_dockable_task_message, 155931845fcb3823ce175fcfc7c6ce2d9751102c331Winson Toast.LENGTH_SHORT).show(); 156931845fcb3823ce175fcfc7c6ce2d9751102c331Winson } else { 157931845fcb3823ce175fcfc7c6ce2d9751102c331Winson // Add the dock state drop targets (these take priority) 158931845fcb3823ce175fcfc7c6ce2d9751102c331Winson TaskStack.DockState[] dockStates = getDockStatesForCurrentOrientation(); 159931845fcb3823ce175fcfc7c6ce2d9751102c331Winson for (TaskStack.DockState dockState : dockStates) { 160931845fcb3823ce175fcfc7c6ce2d9751102c331Winson registerDropTargetForCurrentDrag(dockState); 161931845fcb3823ce175fcfc7c6ce2d9751102c331Winson mVisibleDockStates.add(dockState); 162931845fcb3823ce175fcfc7c6ce2d9751102c331Winson } 163eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson } 164eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson } 165eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson 166eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson // Request other drop targets to register themselves 167d952961977a0eb6c1fefcb0707d1c61741515f68Winson EventBus.getDefault().send(new DragStartInitializeDropTargetsEvent(event.task, 168d952961977a0eb6c1fefcb0707d1c61741515f68Winson event.taskView, this)); 1694165d336b6cd69715eda7fbdfd272a878097170eWinson } 1704165d336b6cd69715eda7fbdfd272a878097170eWinson 1714165d336b6cd69715eda7fbdfd272a878097170eWinson public final void onBusEvent(DragEndEvent event) { 1723e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson mDragRequested = false; 1734165d336b6cd69715eda7fbdfd272a878097170eWinson mDragTask = null; 1744165d336b6cd69715eda7fbdfd272a878097170eWinson mTaskView = null; 175eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson mLastDropTarget = null; 1764165d336b6cd69715eda7fbdfd272a878097170eWinson } 177be7607af8875236b9cf7bdb5f5aa089c207529afWinson 1784165d336b6cd69715eda7fbdfd272a878097170eWinson /** 1794165d336b6cd69715eda7fbdfd272a878097170eWinson * Handles dragging touch events 1804165d336b6cd69715eda7fbdfd272a878097170eWinson */ 1814165d336b6cd69715eda7fbdfd272a878097170eWinson private void handleTouchEvent(MotionEvent ev) { 182be7607af8875236b9cf7bdb5f5aa089c207529afWinson int action = ev.getAction(); 183be7607af8875236b9cf7bdb5f5aa089c207529afWinson switch (action & MotionEvent.ACTION_MASK) { 184be7607af8875236b9cf7bdb5f5aa089c207529afWinson case MotionEvent.ACTION_DOWN: 185be7607af8875236b9cf7bdb5f5aa089c207529afWinson mDownPos.set((int) ev.getX(), (int) ev.getY()); 186be7607af8875236b9cf7bdb5f5aa089c207529afWinson break; 187be7607af8875236b9cf7bdb5f5aa089c207529afWinson case MotionEvent.ACTION_MOVE: { 1883e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson float evX = ev.getX(); 1893e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson float evY = ev.getY(); 1903e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson float x = evX - mTaskViewOffset.x; 1913e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson float y = evY - mTaskViewOffset.y; 1923e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson 1933e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (mDragRequested) { 1943e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (!mIsDragging) { 1953e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson mIsDragging = Math.hypot(evX - mDownPos.x, evY - mDownPos.y) > mDragSlop; 1964165d336b6cd69715eda7fbdfd272a878097170eWinson } 1973e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (mIsDragging) { 1983e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson int width = mRv.getMeasuredWidth(); 1993e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson int height = mRv.getMeasuredHeight(); 2003e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson 2013e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson DropTarget currentDropTarget = null; 2023e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson 2033e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson // Give priority to the current drop target to retain the touch handling 2043e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (mLastDropTarget != null) { 2053e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (mLastDropTarget.acceptsDrop((int) evX, (int) evY, width, height, 2063e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson true /* isCurrentTarget */)) { 2073e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson currentDropTarget = mLastDropTarget; 2083e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson } 2093e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson } 2103e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson 2113e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson // Otherwise, find the next target to handle this event 2123e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (currentDropTarget == null) { 2133e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson for (DropTarget target : mDropTargets) { 2143e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (target.acceptsDrop((int) evX, (int) evY, width, height, 2153e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson false /* isCurrentTarget */)) { 2163e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson currentDropTarget = target; 2173e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson break; 2183e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson } 2193e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson } 2203e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson } 2213e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (mLastDropTarget != currentDropTarget) { 2223e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson mLastDropTarget = currentDropTarget; 2233e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson EventBus.getDefault().send(new DragDropTargetChangedEvent(mDragTask, 2243e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson currentDropTarget)); 2253e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson } 2263e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson 227be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 228be7607af8875236b9cf7bdb5f5aa089c207529afWinson 229479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mTaskView.setTranslationX(x); 230479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mTaskView.setTranslationY(y); 2314165d336b6cd69715eda7fbdfd272a878097170eWinson } 232be7607af8875236b9cf7bdb5f5aa089c207529afWinson break; 233be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 234be7607af8875236b9cf7bdb5f5aa089c207529afWinson case MotionEvent.ACTION_UP: 235be7607af8875236b9cf7bdb5f5aa089c207529afWinson case MotionEvent.ACTION_CANCEL: { 2363e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (mDragRequested) { 237479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson EventBus.getDefault().send(new DragEndEvent(mDragTask, mTaskView, 238aaeaac17831090594e4927b1531c4658d239a3eaWinson Chung mLastDropTarget)); 23909d8a184c6d9d996663da1756ab4ac7d54c04b45Winson break; 24009d8a184c6d9d996663da1756ab4ac7d54c04b45Winson } 241be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 242be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 243be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 244be7607af8875236b9cf7bdb5f5aa089c207529afWinson} 245