RecentsViewTouchHandler.java revision a20eeda52951021da758fefba7bf956c9c9d15a2
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; 23be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport android.view.MotionEvent; 243e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winsonimport android.view.ViewConfiguration; 25231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinsonimport android.view.ViewDebug; 26c0d7058b14c24cd07912f5629c26b39b7b4673d5Winson 2719cf2972582198484816ac15ba83a4f46946082bJorim Jaggiimport com.android.internal.policy.DividerSnapAlgorithm; 2853ec42cb17693b2d631746e1e5d31021a3359163Winsonimport com.android.systemui.recents.Recents; 29882072baacaee4ecd43f0209b691a9af746462f2Winsonimport com.android.systemui.recents.RecentsConfiguration; 30be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport com.android.systemui.recents.events.EventBus; 3119cf2972582198484816ac15ba83a4f46946082bJorim Jaggiimport com.android.systemui.recents.events.activity.ConfigurationChangedEvent; 329b001396c26e5b5ee95e0a54213a8a421179e365Winsonimport com.android.systemui.recents.events.ui.HideIncompatibleAppOverlayEvent; 339b001396c26e5b5ee95e0a54213a8a421179e365Winsonimport com.android.systemui.recents.events.ui.ShowIncompatibleAppOverlayEvent; 34eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winsonimport com.android.systemui.recents.events.ui.dragndrop.DragDropTargetChangedEvent; 35be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport com.android.systemui.recents.events.ui.dragndrop.DragEndEvent; 36be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport com.android.systemui.recents.events.ui.dragndrop.DragStartEvent; 37eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winsonimport com.android.systemui.recents.events.ui.dragndrop.DragStartInitializeDropTargetsEvent; 38d759a7123a7cacf431399b310421c59a6c818e53Winsonimport com.android.systemui.recents.misc.SystemServicesProxy; 39be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport com.android.systemui.recents.model.Task; 40be7607af8875236b9cf7bdb5f5aa089c207529afWinsonimport com.android.systemui.recents.model.TaskStack; 41be7607af8875236b9cf7bdb5f5aa089c207529afWinson 42eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winsonimport java.util.ArrayList; 43eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson 44be7607af8875236b9cf7bdb5f5aa089c207529afWinson/** 45be7607af8875236b9cf7bdb5f5aa089c207529afWinson * Represents the dock regions for each orientation. 46be7607af8875236b9cf7bdb5f5aa089c207529afWinson */ 47be7607af8875236b9cf7bdb5f5aa089c207529afWinsonclass DockRegion { 48882072baacaee4ecd43f0209b691a9af746462f2Winson public static TaskStack.DockState[] PHONE_LANDSCAPE = { 49e92440ee5fad343c680d889136f9a9847a80a418Winson // We only allow docking to the left for now on small devices 502364f26dc24191e5bfbab45bc1bdf9babe13af80Winson TaskStack.DockState.LEFT 51be7607af8875236b9cf7bdb5f5aa089c207529afWinson }; 52882072baacaee4ecd43f0209b691a9af746462f2Winson public static TaskStack.DockState[] PHONE_PORTRAIT = { 53e92440ee5fad343c680d889136f9a9847a80a418Winson // We only allow docking to the top for now on small devices 544165d336b6cd69715eda7fbdfd272a878097170eWinson TaskStack.DockState.TOP 55be7607af8875236b9cf7bdb5f5aa089c207529afWinson }; 56882072baacaee4ecd43f0209b691a9af746462f2Winson public static TaskStack.DockState[] TABLET_LANDSCAPE = { 57e92440ee5fad343c680d889136f9a9847a80a418Winson TaskStack.DockState.LEFT, 58e92440ee5fad343c680d889136f9a9847a80a418Winson TaskStack.DockState.RIGHT 59882072baacaee4ecd43f0209b691a9af746462f2Winson }; 60882072baacaee4ecd43f0209b691a9af746462f2Winson public static TaskStack.DockState[] TABLET_PORTRAIT = PHONE_PORTRAIT; 61be7607af8875236b9cf7bdb5f5aa089c207529afWinson} 62be7607af8875236b9cf7bdb5f5aa089c207529afWinson 63be7607af8875236b9cf7bdb5f5aa089c207529afWinson/** 64be7607af8875236b9cf7bdb5f5aa089c207529afWinson * Handles touch events for a RecentsView. 65be7607af8875236b9cf7bdb5f5aa089c207529afWinson */ 66eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winsonpublic class RecentsViewTouchHandler { 67eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson 68be7607af8875236b9cf7bdb5f5aa089c207529afWinson private RecentsView mRv; 69be7607af8875236b9cf7bdb5f5aa089c207529afWinson 70231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinson @ViewDebug.ExportedProperty(deepExport=true, prefix="drag_task") 71be7607af8875236b9cf7bdb5f5aa089c207529afWinson private Task mDragTask; 72231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinson @ViewDebug.ExportedProperty(deepExport=true, prefix="drag_task_view_") 73be7607af8875236b9cf7bdb5f5aa089c207529afWinson private TaskView mTaskView; 74be7607af8875236b9cf7bdb5f5aa089c207529afWinson 75231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinson @ViewDebug.ExportedProperty(category="recents") 76479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson private Point mTaskViewOffset = new Point(); 77231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinson @ViewDebug.ExportedProperty(category="recents") 78be7607af8875236b9cf7bdb5f5aa089c207529afWinson private Point mDownPos = new Point(); 79231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinson @ViewDebug.ExportedProperty(category="recents") 803e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson private boolean mDragRequested; 81231bc9c54a48921f9c6a1ae187969c9bfe9d121fWinson @ViewDebug.ExportedProperty(category="recents") 823e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson private boolean mIsDragging; 833e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson private float mDragSlop; 84eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson 85eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson private DropTarget mLastDropTarget; 8619cf2972582198484816ac15ba83a4f46946082bJorim Jaggi private DividerSnapAlgorithm mDividerSnapAlgorithm; 87eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson private ArrayList<DropTarget> mDropTargets = new ArrayList<>(); 88036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson private ArrayList<TaskStack.DockState> mVisibleDockStates = new ArrayList<>(); 89be7607af8875236b9cf7bdb5f5aa089c207529afWinson 90be7607af8875236b9cf7bdb5f5aa089c207529afWinson public RecentsViewTouchHandler(RecentsView rv) { 91be7607af8875236b9cf7bdb5f5aa089c207529afWinson mRv = rv; 923e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson mDragSlop = ViewConfiguration.get(rv.getContext()).getScaledTouchSlop(); 9319cf2972582198484816ac15ba83a4f46946082bJorim Jaggi updateSnapAlgorithm(); 9419cf2972582198484816ac15ba83a4f46946082bJorim Jaggi } 9519cf2972582198484816ac15ba83a4f46946082bJorim Jaggi 9619cf2972582198484816ac15ba83a4f46946082bJorim Jaggi private void updateSnapAlgorithm() { 9719cf2972582198484816ac15ba83a4f46946082bJorim Jaggi Rect insets = new Rect(); 9819cf2972582198484816ac15ba83a4f46946082bJorim Jaggi SystemServicesProxy.getInstance(mRv.getContext()).getStableInsets(insets); 9919cf2972582198484816ac15ba83a4f46946082bJorim Jaggi mDividerSnapAlgorithm = DividerSnapAlgorithm.create(mRv.getContext(), insets); 100be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 101be7607af8875236b9cf7bdb5f5aa089c207529afWinson 102882072baacaee4ecd43f0209b691a9af746462f2Winson /** 103eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson * Registers a new drop target for the current drag only. 104eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson */ 105eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson public void registerDropTargetForCurrentDrag(DropTarget target) { 106eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson mDropTargets.add(target); 107eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson } 108eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson 109eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson /** 110882072baacaee4ecd43f0209b691a9af746462f2Winson * Returns the preferred dock states for the current orientation. 111882072baacaee4ecd43f0209b691a9af746462f2Winson */ 112882072baacaee4ecd43f0209b691a9af746462f2Winson public TaskStack.DockState[] getDockStatesForCurrentOrientation() { 1134165d336b6cd69715eda7fbdfd272a878097170eWinson boolean isLandscape = mRv.getResources().getConfiguration().orientation == 1144165d336b6cd69715eda7fbdfd272a878097170eWinson Configuration.ORIENTATION_LANDSCAPE; 11553ec42cb17693b2d631746e1e5d31021a3359163Winson RecentsConfiguration config = Recents.getConfiguration(); 1164165d336b6cd69715eda7fbdfd272a878097170eWinson TaskStack.DockState[] dockStates = isLandscape ? 117882072baacaee4ecd43f0209b691a9af746462f2Winson (config.isLargeScreen ? DockRegion.TABLET_LANDSCAPE : DockRegion.PHONE_LANDSCAPE) : 118882072baacaee4ecd43f0209b691a9af746462f2Winson (config.isLargeScreen ? DockRegion.TABLET_PORTRAIT : DockRegion.PHONE_PORTRAIT); 119882072baacaee4ecd43f0209b691a9af746462f2Winson return dockStates; 1204165d336b6cd69715eda7fbdfd272a878097170eWinson } 1214165d336b6cd69715eda7fbdfd272a878097170eWinson 122036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson /** 123036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson * Returns the set of visible dock states for this current drag. 124036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson */ 125036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson public ArrayList<TaskStack.DockState> getVisibleDockStates() { 126036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson return mVisibleDockStates; 127036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson } 128036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson 129be7607af8875236b9cf7bdb5f5aa089c207529afWinson /** Touch preprocessing for handling below */ 130be7607af8875236b9cf7bdb5f5aa089c207529afWinson public boolean onInterceptTouchEvent(MotionEvent ev) { 1314165d336b6cd69715eda7fbdfd272a878097170eWinson handleTouchEvent(ev); 1323e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson return mDragRequested; 133be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 134be7607af8875236b9cf7bdb5f5aa089c207529afWinson 135be7607af8875236b9cf7bdb5f5aa089c207529afWinson /** Handles touch events once we have intercepted them */ 136be7607af8875236b9cf7bdb5f5aa089c207529afWinson public boolean onTouchEvent(MotionEvent ev) { 1374165d336b6cd69715eda7fbdfd272a878097170eWinson handleTouchEvent(ev); 1383e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson return mDragRequested; 1394165d336b6cd69715eda7fbdfd272a878097170eWinson } 1404165d336b6cd69715eda7fbdfd272a878097170eWinson 1414165d336b6cd69715eda7fbdfd272a878097170eWinson /**** Events ****/ 1424165d336b6cd69715eda7fbdfd272a878097170eWinson 1434165d336b6cd69715eda7fbdfd272a878097170eWinson public final void onBusEvent(DragStartEvent event) { 144d759a7123a7cacf431399b310421c59a6c818e53Winson SystemServicesProxy ssp = Recents.getSystemServices(); 1454165d336b6cd69715eda7fbdfd272a878097170eWinson mRv.getParent().requestDisallowInterceptTouchEvent(true); 1463e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson mDragRequested = true; 1473e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson // We defer starting the actual drag handling until the user moves past the drag slop 1483e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson mIsDragging = false; 1494165d336b6cd69715eda7fbdfd272a878097170eWinson mDragTask = event.task; 1504165d336b6cd69715eda7fbdfd272a878097170eWinson mTaskView = event.taskView; 151eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson mDropTargets.clear(); 1524165d336b6cd69715eda7fbdfd272a878097170eWinson 153479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson int[] recentsViewLocation = new int[2]; 154479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mRv.getLocationInWindow(recentsViewLocation); 155479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mTaskViewOffset.set(mTaskView.getLeft() - recentsViewLocation[0] + event.tlOffset.x, 156479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mTaskView.getTop() - recentsViewLocation[1] + event.tlOffset.y); 157479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson float x = mDownPos.x - mTaskViewOffset.x; 158479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson float y = mDownPos.y - mTaskViewOffset.y; 159479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mTaskView.setTranslationX(x); 160479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mTaskView.setTranslationY(y); 161eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson 162036693cf71f8c4d2dd0dfb57ad05e8827ed6df60Winson mVisibleDockStates.clear(); 16319cf2972582198484816ac15ba83a4f46946082bJorim Jaggi if (ActivityManager.supportsMultiWindow() && !ssp.hasDockedTask() 16419cf2972582198484816ac15ba83a4f46946082bJorim Jaggi && mDividerSnapAlgorithm.isSplitScreenFeasible()) { 165f21c3dace89b168f5e5e4e96532d977b8b0a1cf5Winson Recents.logDockAttempt(mRv.getContext(), event.task.getTopComponent(), 166f21c3dace89b168f5e5e4e96532d977b8b0a1cf5Winson event.task.resizeMode); 167931845fcb3823ce175fcfc7c6ce2d9751102c331Winson if (!event.task.isDockable) { 1689b001396c26e5b5ee95e0a54213a8a421179e365Winson EventBus.getDefault().send(new ShowIncompatibleAppOverlayEvent()); 169931845fcb3823ce175fcfc7c6ce2d9751102c331Winson } else { 170931845fcb3823ce175fcfc7c6ce2d9751102c331Winson // Add the dock state drop targets (these take priority) 171931845fcb3823ce175fcfc7c6ce2d9751102c331Winson TaskStack.DockState[] dockStates = getDockStatesForCurrentOrientation(); 172931845fcb3823ce175fcfc7c6ce2d9751102c331Winson for (TaskStack.DockState dockState : dockStates) { 173931845fcb3823ce175fcfc7c6ce2d9751102c331Winson registerDropTargetForCurrentDrag(dockState); 17499ef458ff1b79c93a8dfdc289fb6ff80fd7aacf6Winson dockState.update(mRv.getContext()); 175931845fcb3823ce175fcfc7c6ce2d9751102c331Winson mVisibleDockStates.add(dockState); 176931845fcb3823ce175fcfc7c6ce2d9751102c331Winson } 177eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson } 178eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson } 179eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson 180eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson // Request other drop targets to register themselves 181d952961977a0eb6c1fefcb0707d1c61741515f68Winson EventBus.getDefault().send(new DragStartInitializeDropTargetsEvent(event.task, 182d952961977a0eb6c1fefcb0707d1c61741515f68Winson event.taskView, this)); 1834165d336b6cd69715eda7fbdfd272a878097170eWinson } 1844165d336b6cd69715eda7fbdfd272a878097170eWinson 1854165d336b6cd69715eda7fbdfd272a878097170eWinson public final void onBusEvent(DragEndEvent event) { 1869b001396c26e5b5ee95e0a54213a8a421179e365Winson if (!mDragTask.isDockable) { 1879b001396c26e5b5ee95e0a54213a8a421179e365Winson EventBus.getDefault().send(new HideIncompatibleAppOverlayEvent()); 1889b001396c26e5b5ee95e0a54213a8a421179e365Winson } 1893e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson mDragRequested = false; 1904165d336b6cd69715eda7fbdfd272a878097170eWinson mDragTask = null; 1914165d336b6cd69715eda7fbdfd272a878097170eWinson mTaskView = null; 192eca4ab6e99bcb2a7b31b8b4b1c3b5474297b6b25Winson mLastDropTarget = null; 1934165d336b6cd69715eda7fbdfd272a878097170eWinson } 194be7607af8875236b9cf7bdb5f5aa089c207529afWinson 19519cf2972582198484816ac15ba83a4f46946082bJorim Jaggi public final void onBusEvent(ConfigurationChangedEvent event) { 19625160db73f37619a26a3d87a06625925d881b0fdJorim Jaggi if (event.fromDisplayDensityChange) { 19725160db73f37619a26a3d87a06625925d881b0fdJorim Jaggi updateSnapAlgorithm(); 19825160db73f37619a26a3d87a06625925d881b0fdJorim Jaggi } 19919cf2972582198484816ac15ba83a4f46946082bJorim Jaggi } 20019cf2972582198484816ac15ba83a4f46946082bJorim Jaggi 2014165d336b6cd69715eda7fbdfd272a878097170eWinson /** 2024165d336b6cd69715eda7fbdfd272a878097170eWinson * Handles dragging touch events 2034165d336b6cd69715eda7fbdfd272a878097170eWinson */ 2044165d336b6cd69715eda7fbdfd272a878097170eWinson private void handleTouchEvent(MotionEvent ev) { 205a20eeda52951021da758fefba7bf956c9c9d15a2Jorim Jaggi int action = ev.getActionMasked(); 206a20eeda52951021da758fefba7bf956c9c9d15a2Jorim Jaggi switch (action) { 207be7607af8875236b9cf7bdb5f5aa089c207529afWinson case MotionEvent.ACTION_DOWN: 208be7607af8875236b9cf7bdb5f5aa089c207529afWinson mDownPos.set((int) ev.getX(), (int) ev.getY()); 209be7607af8875236b9cf7bdb5f5aa089c207529afWinson break; 210be7607af8875236b9cf7bdb5f5aa089c207529afWinson case MotionEvent.ACTION_MOVE: { 2113e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson float evX = ev.getX(); 2123e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson float evY = ev.getY(); 2133e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson float x = evX - mTaskViewOffset.x; 2143e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson float y = evY - mTaskViewOffset.y; 2153e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson 2163e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (mDragRequested) { 2173e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (!mIsDragging) { 2183e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson mIsDragging = Math.hypot(evX - mDownPos.x, evY - mDownPos.y) > mDragSlop; 2194165d336b6cd69715eda7fbdfd272a878097170eWinson } 2203e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (mIsDragging) { 2213e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson int width = mRv.getMeasuredWidth(); 2223e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson int height = mRv.getMeasuredHeight(); 2233e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson 2243e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson DropTarget currentDropTarget = null; 2253e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson 2263e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson // Give priority to the current drop target to retain the touch handling 2273e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (mLastDropTarget != null) { 2283e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (mLastDropTarget.acceptsDrop((int) evX, (int) evY, width, height, 2293e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson true /* isCurrentTarget */)) { 2303e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson currentDropTarget = mLastDropTarget; 2313e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson } 2323e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson } 2333e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson 2343e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson // Otherwise, find the next target to handle this event 2353e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (currentDropTarget == null) { 2363e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson for (DropTarget target : mDropTargets) { 2373e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (target.acceptsDrop((int) evX, (int) evY, width, height, 2383e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson false /* isCurrentTarget */)) { 2393e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson currentDropTarget = target; 2403e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson break; 2413e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson } 2423e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson } 2433e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson } 2443e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (mLastDropTarget != currentDropTarget) { 2453e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson mLastDropTarget = currentDropTarget; 2463e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson EventBus.getDefault().send(new DragDropTargetChangedEvent(mDragTask, 2473e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson currentDropTarget)); 2483e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson } 2493e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson 250be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 251be7607af8875236b9cf7bdb5f5aa089c207529afWinson 252479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mTaskView.setTranslationX(x); 253479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson mTaskView.setTranslationY(y); 2544165d336b6cd69715eda7fbdfd272a878097170eWinson } 255be7607af8875236b9cf7bdb5f5aa089c207529afWinson break; 256be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 257be7607af8875236b9cf7bdb5f5aa089c207529afWinson case MotionEvent.ACTION_UP: 258be7607af8875236b9cf7bdb5f5aa089c207529afWinson case MotionEvent.ACTION_CANCEL: { 2593e8747414520ee348cf4b9c4a6afd9ff80b5a8f8Winson if (mDragRequested) { 260479f7446cf489fb99c91b3fc2bf96b1dc184f5baWinson EventBus.getDefault().send(new DragEndEvent(mDragTask, mTaskView, 261a20eeda52951021da758fefba7bf956c9c9d15a2Jorim Jaggi action == MotionEvent.ACTION_UP ? mLastDropTarget : null)); 26209d8a184c6d9d996663da1756ab4ac7d54c04b45Winson break; 26309d8a184c6d9d996663da1756ab4ac7d54c04b45Winson } 264be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 265be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 266be7607af8875236b9cf7bdb5f5aa089c207529afWinson } 267be7607af8875236b9cf7bdb5f5aa089c207529afWinson} 268