1 package com.android.dialer.list;
2 
3 import android.util.Log;
4 import android.view.View;
5 
6 import com.android.contacts.common.compat.CompatUtils;
7 
8 import java.util.ArrayList;
9 import java.util.List;
10 
11 /**
12  * Class that handles and combines drag events generated from multiple views, and then fires
13  * off events to any OnDragDropListeners that have registered for callbacks.
14  */
15 public class DragDropController {
16 
17     private final List<OnDragDropListener> mOnDragDropListeners =
18             new ArrayList<OnDragDropListener>();
19     private final DragItemContainer mDragItemContainer;
20     private final int[] mLocationOnScreen = new int[2];
21 
22     /**
23      * Callback interface used to retrieve views based on the current touch coordinates of the
24      * drag event. The {@link DragItemContainer} houses the draggable views that this
25      * {@link DragDropController} controls.
26      */
27     public interface DragItemContainer {
getViewForLocation(int x, int y)28         public PhoneFavoriteSquareTileView getViewForLocation(int x, int y);
29     }
30 
DragDropController(DragItemContainer dragItemContainer)31     public DragDropController(DragItemContainer dragItemContainer) {
32         mDragItemContainer = dragItemContainer;
33     }
34 
35     /**
36      * @return True if the drag is started, false if the drag is cancelled for some reason.
37      */
handleDragStarted(View v, int x, int y)38     boolean handleDragStarted(View v, int x, int y) {
39         int screenX = x;
40         int screenY = y;
41         // The coordinates in dragEvent of DragEvent.ACTION_DRAG_STARTED before NYC is window-related.
42         // This is fixed in NYC.
43         if (CompatUtils.isNCompatible()) {
44             v.getLocationOnScreen(mLocationOnScreen);
45             screenX = x + mLocationOnScreen[0];
46             screenY = y + mLocationOnScreen[1];
47         }
48         final PhoneFavoriteSquareTileView tileView = mDragItemContainer.getViewForLocation(
49                 screenX, screenY);
50         if (tileView == null) {
51             return false;
52         }
53         for (int i = 0; i < mOnDragDropListeners.size(); i++) {
54             mOnDragDropListeners.get(i).onDragStarted(screenX, screenY, tileView);
55         }
56 
57         return true;
58     }
59 
handleDragHovered(View v, int x, int y)60     public void handleDragHovered(View v, int x, int y) {
61         v.getLocationOnScreen(mLocationOnScreen);
62         final int screenX = x + mLocationOnScreen[0];
63         final int screenY = y + mLocationOnScreen[1];
64         final PhoneFavoriteSquareTileView view = mDragItemContainer.getViewForLocation(
65                 screenX, screenY);
66         for (int i = 0; i < mOnDragDropListeners.size(); i++) {
67             mOnDragDropListeners.get(i).onDragHovered(screenX, screenY, view);
68         }
69     }
70 
handleDragFinished(int x, int y, boolean isRemoveView)71     public void handleDragFinished(int x, int y, boolean isRemoveView) {
72         if (isRemoveView) {
73             for (int i = 0; i < mOnDragDropListeners.size(); i++) {
74                 mOnDragDropListeners.get(i).onDroppedOnRemove();
75             }
76         }
77 
78         for (int i = 0; i < mOnDragDropListeners.size(); i++) {
79             mOnDragDropListeners.get(i).onDragFinished(x, y);
80         }
81     }
82 
addOnDragDropListener(OnDragDropListener listener)83     public void addOnDragDropListener(OnDragDropListener listener) {
84         if (!mOnDragDropListeners.contains(listener)) {
85             mOnDragDropListeners.add(listener);
86         }
87     }
88 
removeOnDragDropListener(OnDragDropListener listener)89     public void removeOnDragDropListener(OnDragDropListener listener) {
90         if (mOnDragDropListeners.contains(listener)) {
91             mOnDragDropListeners.remove(listener);
92         }
93     }
94 
95 }
96