DragController.java revision 8dfcba4af7a7ece09e8c7d96053e54f3a383e905
131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/*
231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * you may not use this file except in compliance with the License.
631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * You may obtain a copy of the License at
731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
1031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * See the License for the specific language governing permissions and
1431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * limitations under the License.
1531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */
1631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
17a5902524d4403885eb4c50360bf3465c6be796efJoe Onoratopackage com.android.launcher2;
1831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
1900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.content.Context;
2000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.graphics.Bitmap;
2100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.graphics.Rect;
2200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.graphics.RectF;
2300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.os.Handler;
240280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurkaimport android.os.IBinder;
2500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.os.Vibrator;
26e048e8a8eff51e8c2c271d16c864367dac438ca2Joe Onoratoimport android.util.DisplayMetrics;
2700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.util.Log;
2800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.view.KeyEvent;
2900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.view.MotionEvent;
300280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurkaimport android.view.View;
31a16fd5a6bd5371d40a5679261d416f06f8efa022Patrick Dubroyimport android.view.ViewConfiguration;
32e048e8a8eff51e8c2c271d16c864367dac438ca2Joe Onoratoimport android.view.WindowManager;
3300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratoimport android.view.inputmethod.InputMethodManager;
3400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
35120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohenimport com.android.launcher.R;
36c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohen
37c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohenimport java.util.ArrayList;
3831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
3931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/**
4000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato * Class for initiating a drag within a view or across multiple views.
4131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */
4200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratopublic class DragController {
43ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy    @SuppressWarnings({"UnusedDeclaration"})
442e5c432a0aa7e83031575df73bed43a297e2eed3Joe Onorato    private static final String TAG = "Launcher.DragController";
452e5c432a0aa7e83031575df73bed43a297e2eed3Joe Onorato
4600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /** Indicates the drag is a move.  */
4700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    public static int DRAG_ACTION_MOVE = 0;
4800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
4900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /** Indicates the drag is a copy.  */
5000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    public static int DRAG_ACTION_COPY = 1;
5100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
5200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private static final int SCROLL_DELAY = 600;
5300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private static final int VIBRATE_DURATION = 35;
5400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
5500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private static final boolean PROFILE_DRAWING_DURING_DRAG = false;
5600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
5700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private static final int SCROLL_OUTSIDE_ZONE = 0;
5800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private static final int SCROLL_WAITING_IN_ZONE = 1;
5900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
6054fa3b95557c283976e8c1aa8a157b460b0b4513Patrick Dubroy    static final int SCROLL_NONE = -1;
611262e369484ce7f2565655ed80e6299232c70bd7Patrick Dubroy    static final int SCROLL_LEFT = 0;
621262e369484ce7f2565655ed80e6299232c70bd7Patrick Dubroy    static final int SCROLL_RIGHT = 1;
6300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
648dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen    private Launcher mLauncher;
6500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private Handler mHandler;
6600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private final Vibrator mVibrator = new Vibrator();
6700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
6800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    // temporaries to avoid gc thrash
6900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private Rect mRectTemp = new Rect();
7000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private final int[] mCoordinatesTemp = new int[2];
7100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
7200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /** Whether or not we're dragging. */
7300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private boolean mDragging;
7400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
7500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /** X coordinate of the down event. */
76e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen    private int mMotionDownX;
7700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
7800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /** Y coordinate of the down event. */
79e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen    private int mMotionDownY;
8000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
81658db74c24817892f1a379b16620744f38f60e40Joe Onorato    /** the area at the edge of the screen that makes the workspace go left
82658db74c24817892f1a379b16620744f38f60e40Joe Onorato     *   or right while you're dragging.
83658db74c24817892f1a379b16620744f38f60e40Joe Onorato     */
84658db74c24817892f1a379b16620744f38f60e40Joe Onorato    private int mScrollZone;
85658db74c24817892f1a379b16620744f38f60e40Joe Onorato
86cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen    private DropTarget.DragObject mDragObject = new DropTarget.DragObject();
8700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
8800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /** Who can receive drop events */
8900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private ArrayList<DropTarget> mDropTargets = new ArrayList<DropTarget>();
9000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
914ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy    private ArrayList<DragListener> mListeners = new ArrayList<DragListener>();
9200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
9300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /** The window token used as the parent for the DragView. */
9400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private IBinder mWindowToken;
9500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
9600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /** The view that will be scrolled when dragging to the left and right edges of the screen. */
9700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private View mScrollView;
9800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
99ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy    private View mMoveTarget;
100ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy
10100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private DragScroller mDragScroller;
10200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private int mScrollState = SCROLL_OUTSIDE_ZONE;
10300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private ScrollRunnable mScrollRunnable = new ScrollRunnable();
10400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
10500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private RectF mDeleteRegion;
10600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private DropTarget mLastDropTarget;
10700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
10800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private InputMethodManager mInputMethodManager;
10900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
110a16fd5a6bd5371d40a5679261d416f06f8efa022Patrick Dubroy    private int mLastTouch[] = new int[2];
111a16fd5a6bd5371d40a5679261d416f06f8efa022Patrick Dubroy    private int mDistanceSinceScroll = 0;
112a16fd5a6bd5371d40a5679261d416f06f8efa022Patrick Dubroy
11331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
11431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * Interface to receive notifications when a drag starts or stops
11531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
11631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    interface DragListener {
11731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
11831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        /**
11931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project         * A drag has begun
12031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project         *
12131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project         * @param source An object representing where the drag originated
12231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project         * @param info The data associated with the object that is being dragged
12331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project         * @param dragAction The drag action: either {@link DragController#DRAG_ACTION_MOVE}
12431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project         *        or {@link DragController#DRAG_ACTION_COPY}
12531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project         */
1265162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato        void onDragStart(DragSource source, Object info, int dragAction);
12731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
12831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        /**
129e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung         * The drag has ended
13031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project         */
13131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        void onDragEnd();
13231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
13331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
13431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
13500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * Used to create a new DragLayer from XML.
13600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     *
13700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * @param context The application's context.
13831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
1398dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen    public DragController(Launcher launcher) {
1408dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        mLauncher = launcher;
14100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mHandler = new Handler();
1428dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        mScrollZone = launcher.getResources().getDimensionPixelSize(R.dimen.scroll_zone);
14300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
14431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
1451262e369484ce7f2565655ed80e6299232c70bd7Patrick Dubroy    public boolean dragging() {
1461262e369484ce7f2565655ed80e6299232c70bd7Patrick Dubroy        return mDragging;
1471262e369484ce7f2565655ed80e6299232c70bd7Patrick Dubroy    }
1481262e369484ce7f2565655ed80e6299232c70bd7Patrick Dubroy
14931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
1505162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato     * Starts a drag.
151a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka     *
15231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * @param v The view that is being dragged
15331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * @param source An object representing where the drag originated
154ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy     * @param dragInfo The data associated with the object that is being dragged
15531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * @param dragAction The drag action: either {@link #DRAG_ACTION_MOVE} or
15631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     *        {@link #DRAG_ACTION_COPY}
15731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
15800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    public void startDrag(View v, DragSource source, Object dragInfo, int dragAction) {
159a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka        startDrag(v, source, dragInfo, dragAction, null);
160a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    }
161a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
162a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    /**
163a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka     * Starts a drag.
164a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka     *
165a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka     * @param v The view that is being dragged
166a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka     * @param source An object representing where the drag originated
167a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka     * @param dragInfo The data associated with the object that is being dragged
168a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka     * @param dragAction The drag action: either {@link #DRAG_ACTION_MOVE} or
169a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka     *        {@link #DRAG_ACTION_COPY}
170a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka     * @param dragRegion Coordinates within the bitmap b for the position of item being dragged.
171a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka     *          Makes dragging feel more precise, e.g. you can clip out a transparent border
172a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka     */
173a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    public void startDrag(View v, DragSource source, Object dragInfo, int dragAction,
174a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka            Rect dragRegion) {
1755162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato        Bitmap b = getViewBitmap(v);
1765162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato
1773f8175a86e24b3568d1f5b12e1d3d5efcc57d691Daniel Sandler        if (b == null) {
1783f8175a86e24b3568d1f5b12e1d3d5efcc57d691Daniel Sandler            // out of memory?
1793f8175a86e24b3568d1f5b12e1d3d5efcc57d691Daniel Sandler            return;
1803f8175a86e24b3568d1f5b12e1d3d5efcc57d691Daniel Sandler        }
1813f8175a86e24b3568d1f5b12e1d3d5efcc57d691Daniel Sandler
1825162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato        int[] loc = mCoordinatesTemp;
1838dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        mLauncher.getDragLayer().getLocationInDragLayer(v, loc);
1848dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        int dragLayerX = loc[0];
1858dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        int dragLayerY = loc[1];
1865162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato
1878dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        startDrag(b, dragLayerX, dragLayerY, source, dragInfo, dragAction, dragRegion);
1885162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato        b.recycle();
1895162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato
1905162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato        if (dragAction == DRAG_ACTION_MOVE) {
1915162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato            v.setVisibility(View.GONE);
1925162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato        }
1935162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato    }
1945162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato
1955162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato    /**
1965162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato     * Starts a drag.
197a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka     *
198e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung     * @param v The view that is being dragged
199e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung     * @param bmp The bitmap that represents the view being dragged
200e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung     * @param source An object representing where the drag originated
201e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung     * @param dragInfo The data associated with the object that is being dragged
202e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung     * @param dragAction The drag action: either {@link #DRAG_ACTION_MOVE} or
203e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung     *        {@link #DRAG_ACTION_COPY}
204e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung     * @param dragRegion Coordinates within the bitmap b for the position of item being dragged.
205e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung     *          Makes dragging feel more precise, e.g. you can clip out a transparent border
206e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung     */
207e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung    public void startDrag(View v, Bitmap bmp, DragSource source, Object dragInfo, int dragAction,
208e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung            Rect dragRegion) {
209e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung        int[] loc = mCoordinatesTemp;
2108dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        mLauncher.getDragLayer().getLocationInDragLayer(v, loc);
2118dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        int dragLayerX = loc[0];
2128dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        int dragLayerY = loc[1];
213e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung
2148dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        startDrag(bmp, dragLayerX, dragLayerY, source, dragInfo, dragAction, dragRegion);
215e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung
216e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung        if (dragAction == DRAG_ACTION_MOVE) {
217e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung            v.setVisibility(View.GONE);
218e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung        }
219e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung    }
220e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung
221e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung    /**
222e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung     * Starts a drag.
223e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung     *
2245162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato     * @param b The bitmap to display as the drag image.  It will be re-scaled to the
2255162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato     *          enlarged size.
2268dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen     * @param dragLayerX The x position in the DragLayer of the left-top of the bitmap.
2278dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen     * @param dragLayerY The y position in the DragLayer of the left-top of the bitmap.
2285162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato     * @param source An object representing where the drag originated
229ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy     * @param dragInfo The data associated with the object that is being dragged
2305162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato     * @param dragAction The drag action: either {@link #DRAG_ACTION_MOVE} or
2315162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato     *        {@link #DRAG_ACTION_COPY}
2325162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato     */
2338dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen    public void startDrag(Bitmap b, int dragLayerX, int dragLayerY,
2345162ea9b1f41dbebe00fd9ec4d1e15a697971439Joe Onorato            DragSource source, Object dragInfo, int dragAction) {
2358dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        startDrag(b, dragLayerX, dragLayerY, source, dragInfo, dragAction, null);
236a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    }
237a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
238a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka    /**
239a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka     * Starts a drag.
240a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka     *
241a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka     * @param b The bitmap to display as the drag image.  It will be re-scaled to the
242a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka     *          enlarged size.
2438dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen     * @param dragLayerX The x position in the DragLayer of the left-top of the bitmap.
2448dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen     * @param dragLayerY The y position in the DragLayer of the left-top of the bitmap.
245a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka     * @param source An object representing where the drag originated
246a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka     * @param dragInfo The data associated with the object that is being dragged
247a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka     * @param dragAction The drag action: either {@link #DRAG_ACTION_MOVE} or
248a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka     *        {@link #DRAG_ACTION_COPY}
249a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka     * @param dragRegion Coordinates within the bitmap b for the position of item being dragged.
250a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka     *          Makes dragging feel more precise, e.g. you can clip out a transparent border
251a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka     */
2528dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen    public void startDrag(Bitmap b, int dragLayerX, int dragLayerY,
253a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka            DragSource source, Object dragInfo, int dragAction, Rect dragRegion) {
25400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        if (PROFILE_DRAWING_DURING_DRAG) {
25500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            android.os.Debug.startMethodTracing("Launcher");
25600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        }
25700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
25800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        // Hide soft keyboard, if visible
25900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        if (mInputMethodManager == null) {
26000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            mInputMethodManager = (InputMethodManager)
2618dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen                    mLauncher.getSystemService(Context.INPUT_METHOD_SERVICE);
26200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        }
26300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mInputMethodManager.hideSoftInputFromWindow(mWindowToken, 0);
26400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
2654ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy        for (DragListener listener : mListeners) {
2664ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy            listener.onDragStart(source, dragInfo, dragAction);
26700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        }
26800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
2698dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        final int registrationX = mMotionDownX - dragLayerX;
2708dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        final int registrationY = mMotionDownY - dragLayerY;
27100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
272a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka        final int dragRegionLeft = dragRegion == null ? 0 : dragRegion.left;
273a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka        final int dragRegionTop = dragRegion == null ? 0 : dragRegion.top;
274e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen
27500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mDragging = true;
276cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen
277bfbfd26c627a18f8e1e3e6d0e53e78feab360203Adam Cohen        mDragObject.dragComplete = false;
2788dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        mDragObject.xOffset = mMotionDownX - (dragLayerX + dragRegionLeft);
2798dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        mDragObject.yOffset = mMotionDownY - (dragLayerY + dragRegionTop);
280cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen        mDragObject.dragSource = source;
281cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen        mDragObject.dragInfo = dragInfo;
28200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
28300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mVibrator.vibrate(VIBRATE_DURATION);
28400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
2858dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        final DragView dragView = mDragObject.dragView = new DragView(mLauncher, b, registrationX,
286cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen                registrationY, 0, 0, b.getWidth(), b.getHeight());
287a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
288a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        final DragSource dragSource = source;
289a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        dragView.setOnDrawRunnable(new Runnable() {
290a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy            public void run() {
291a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy                dragSource.onDragViewVisible();
292a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy            };
293a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy        });
294a669d79d0dcf034651ce305a8cd334272bec3374Patrick Dubroy
295a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka        if (dragRegion != null) {
296e3e27a854f3eca363d3c5ce353d19de475272d87Adam Cohen            dragView.setDragRegion(new Rect(dragRegion));
297a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka        }
298a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka
2998dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        dragView.show(mMotionDownX, mMotionDownY);
3008dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        handleMoveEvent(mMotionDownX, mMotionDownY);
30100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
30200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
30300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /**
30400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * Draw the view into a bitmap.
30500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     */
306120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen    Bitmap getViewBitmap(View v) {
30700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        v.clearFocus();
30800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        v.setPressed(false);
30900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
31000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        boolean willNotCache = v.willNotCacheDrawing();
31100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        v.setWillNotCacheDrawing(false);
31200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
31300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        // Reset the drawing cache background color to fully transparent
31400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        // for the duration of this operation
31500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        int color = v.getDrawingCacheBackgroundColor();
31600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        v.setDrawingCacheBackgroundColor(0);
317120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen        float alpha = v.getAlpha();
318120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen        v.setAlpha(1.0f);
31900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
32000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        if (color != 0) {
32100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            v.destroyDrawingCache();
32200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        }
32300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        v.buildDrawingCache();
32400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        Bitmap cacheBitmap = v.getDrawingCache();
3253f8175a86e24b3568d1f5b12e1d3d5efcc57d691Daniel Sandler        if (cacheBitmap == null) {
3263f8175a86e24b3568d1f5b12e1d3d5efcc57d691Daniel Sandler            Log.e(TAG, "failed getViewBitmap(" + v + ")", new RuntimeException());
3273f8175a86e24b3568d1f5b12e1d3d5efcc57d691Daniel Sandler            return null;
3283f8175a86e24b3568d1f5b12e1d3d5efcc57d691Daniel Sandler        }
32900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
33000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        Bitmap bitmap = Bitmap.createBitmap(cacheBitmap);
33100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
33200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        // Restore the view
33300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        v.destroyDrawingCache();
334120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen        v.setAlpha(alpha);
33500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        v.setWillNotCacheDrawing(willNotCache);
33600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        v.setDrawingCacheBackgroundColor(color);
33700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
33800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        return bitmap;
33900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
34000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
34100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /**
34200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * Call this from a drag source view like this:
34300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     *
34400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * <pre>
34500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     *  @Override
34600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     *  public boolean dispatchKeyEvent(KeyEvent event) {
34700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     *      return mDragController.dispatchKeyEvent(this, event)
34800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     *              || super.dispatchKeyEvent(event);
34900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * </pre>
35000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     */
351ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy    @SuppressWarnings({"UnusedDeclaration"})
35200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    public boolean dispatchKeyEvent(KeyEvent event) {
35300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        return mDragging;
35400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
35500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
356304dcde0e301c2f1a0b2bdc80ea8617930691b6eWinson Chung    public boolean isDragging() {
357304dcde0e301c2f1a0b2bdc80ea8617930691b6eWinson Chung        return mDragging;
358304dcde0e301c2f1a0b2bdc80ea8617930691b6eWinson Chung    }
359304dcde0e301c2f1a0b2bdc80ea8617930691b6eWinson Chung
36024b6fd854f75f21700a330c2f0d11938e5dfeab6Joe Onorato    /**
36124b6fd854f75f21700a330c2f0d11938e5dfeab6Joe Onorato     * Stop dragging without dropping.
36224b6fd854f75f21700a330c2f0d11938e5dfeab6Joe Onorato     */
36324b6fd854f75f21700a330c2f0d11938e5dfeab6Joe Onorato    public void cancelDrag() {
364621e6406fadba27d6cff1c38b31d5cdf99c0f97aWinson Chung        if (mDragging) {
365c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung            if (mLastDropTarget != null) {
366c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung                mLastDropTarget.onDragExit(mDragObject);
367c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung            }
368bfbfd26c627a18f8e1e3e6d0e53e78feab360203Adam Cohen            mDragObject.dragComplete = true;
369c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohen            mDragObject.dragSource.onDropCompleted(null, mDragObject, false);
370621e6406fadba27d6cff1c38b31d5cdf99c0f97aWinson Chung        }
37124b6fd854f75f21700a330c2f0d11938e5dfeab6Joe Onorato        endDrag();
37224b6fd854f75f21700a330c2f0d11938e5dfeab6Joe Onorato    }
37324b6fd854f75f21700a330c2f0d11938e5dfeab6Joe Onorato
37400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private void endDrag() {
37500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        if (mDragging) {
37600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            mDragging = false;
3774ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy            for (DragListener listener : mListeners) {
3784ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy                listener.onDragEnd();
37900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            }
380cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen            if (mDragObject.dragView != null) {
381cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen                mDragObject.dragView.remove();
382cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen                mDragObject.dragView = null;
38300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            }
38400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        }
38500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
38600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
38700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /**
38800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * Call this from a drag source view.
38900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     */
39000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    public boolean onInterceptTouchEvent(MotionEvent ev) {
3919c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        if (false) {
392a30ce8e6b25e41f392a41fd4d0d3e0a424a84dadJoe Onorato            Log.d(Launcher.TAG, "DragController.onInterceptTouchEvent " + ev + " mDragging="
3939c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato                    + mDragging);
3949c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato        }
39500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        final int action = ev.getAction();
39600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
3978dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        final int dragLayerX = (int) ev.getX();
3988dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        final int dragLayerY = (int) ev.getY();
39900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
40000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        switch (action) {
40100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            case MotionEvent.ACTION_MOVE:
40200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                break;
40300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            case MotionEvent.ACTION_DOWN:
40400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                // Remember location of down touch
4058dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen                mMotionDownX = dragLayerX;
4068dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen                mMotionDownY = dragLayerY;
40700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                mLastDropTarget = null;
40800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                break;
40900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            case MotionEvent.ACTION_UP:
41000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                if (mDragging) {
4118dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen                    drop(dragLayerX, dragLayerY);
41200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                }
41300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                endDrag();
41400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                break;
415621e6406fadba27d6cff1c38b31d5cdf99c0f97aWinson Chung            case MotionEvent.ACTION_CANCEL:
416621e6406fadba27d6cff1c38b31d5cdf99c0f97aWinson Chung                cancelDrag();
417621e6406fadba27d6cff1c38b31d5cdf99c0f97aWinson Chung                break;
41800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        }
41900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
42000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        return mDragging;
42100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
42200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
42300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /**
424ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy     * Sets the view that should handle move events.
425ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy     */
426ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy    void setMoveTarget(View view) {
427ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy        mMoveTarget = view;
428ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy    }
429ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy
430ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy    public boolean dispatchUnhandledMove(View focused, int direction) {
431ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy        return mMoveTarget != null && mMoveTarget.dispatchUnhandledMove(focused, direction);
432ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy    }
433ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy
434de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy    private void handleMoveEvent(int x, int y) {
435cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen        mDragObject.dragView.move(x, y);
436de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy
437de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy        // Drop on someone?
438de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy        final int[] coordinates = mCoordinatesTemp;
439de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy        DropTarget dropTarget = findDropTarget(x, y, coordinates);
440cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen        mDragObject.x = coordinates[0];
441cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen        mDragObject.y = coordinates[1];
442de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy        if (dropTarget != null) {
443cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen            DropTarget delegate = dropTarget.getDropTargetDelegate(mDragObject);
444de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy            if (delegate != null) {
445de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy                dropTarget = delegate;
446de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy            }
447de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy
448de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy            if (mLastDropTarget != dropTarget) {
449de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy                if (mLastDropTarget != null) {
450cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen                    mLastDropTarget.onDragExit(mDragObject);
451de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy                }
452cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen                dropTarget.onDragEnter(mDragObject);
453de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy            }
454cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen            dropTarget.onDragOver(mDragObject);
455de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy        } else {
456de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy            if (mLastDropTarget != null) {
457cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen                mLastDropTarget.onDragExit(mDragObject);
458de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy            }
459de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy        }
460de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy        mLastDropTarget = dropTarget;
461de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy
462de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy        // Scroll, maybe, but not if we're in the delete region.
463de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy        boolean inDeleteRegion = false;
464de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy        if (mDeleteRegion != null) {
465de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy            inDeleteRegion = mDeleteRegion.contains(x, y);
466de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy        }
467a16fd5a6bd5371d40a5679261d416f06f8efa022Patrick Dubroy
468a16fd5a6bd5371d40a5679261d416f06f8efa022Patrick Dubroy        // After a scroll, the touch point will still be in the scroll region.
469a16fd5a6bd5371d40a5679261d416f06f8efa022Patrick Dubroy        // Rather than scrolling immediately, require a bit of twiddling to scroll again
4708dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        final int slop = ViewConfiguration.get(mLauncher).getScaledWindowTouchSlop();
471a16fd5a6bd5371d40a5679261d416f06f8efa022Patrick Dubroy        mDistanceSinceScroll +=
472a16fd5a6bd5371d40a5679261d416f06f8efa022Patrick Dubroy            Math.sqrt(Math.pow(mLastTouch[0] - x, 2) + Math.pow(mLastTouch[1] - y, 2));
473a16fd5a6bd5371d40a5679261d416f06f8efa022Patrick Dubroy        mLastTouch[0] = x;
474a16fd5a6bd5371d40a5679261d416f06f8efa022Patrick Dubroy        mLastTouch[1] = y;
475a16fd5a6bd5371d40a5679261d416f06f8efa022Patrick Dubroy
476658db74c24817892f1a379b16620744f38f60e40Joe Onorato        if (!inDeleteRegion && x < mScrollZone) {
477a16fd5a6bd5371d40a5679261d416f06f8efa022Patrick Dubroy            if (mScrollState == SCROLL_OUTSIDE_ZONE && mDistanceSinceScroll > slop) {
478de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy                mScrollState = SCROLL_WAITING_IN_ZONE;
479de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy                mScrollRunnable.setDirection(SCROLL_LEFT);
480de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy                mHandler.postDelayed(mScrollRunnable, SCROLL_DELAY);
4811262e369484ce7f2565655ed80e6299232c70bd7Patrick Dubroy                mDragScroller.onEnterScrollArea(SCROLL_LEFT);
482de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy            }
483658db74c24817892f1a379b16620744f38f60e40Joe Onorato        } else if (!inDeleteRegion && x > mScrollView.getWidth() - mScrollZone) {
484a16fd5a6bd5371d40a5679261d416f06f8efa022Patrick Dubroy            if (mScrollState == SCROLL_OUTSIDE_ZONE && mDistanceSinceScroll > slop) {
485de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy                mScrollState = SCROLL_WAITING_IN_ZONE;
486de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy                mScrollRunnable.setDirection(SCROLL_RIGHT);
487de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy                mHandler.postDelayed(mScrollRunnable, SCROLL_DELAY);
4881262e369484ce7f2565655ed80e6299232c70bd7Patrick Dubroy                mDragScroller.onEnterScrollArea(SCROLL_RIGHT);
489de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy            }
490de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy        } else {
491de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy            if (mScrollState == SCROLL_WAITING_IN_ZONE) {
492de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy                mScrollState = SCROLL_OUTSIDE_ZONE;
493de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy                mScrollRunnable.setDirection(SCROLL_RIGHT);
494de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy                mHandler.removeCallbacks(mScrollRunnable);
4951262e369484ce7f2565655ed80e6299232c70bd7Patrick Dubroy                mDragScroller.onExitScrollArea();
496de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy            }
497de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy        }
498de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy    }
499de7658b5e02ae10010e44fcf8d9c5814f54d9eb0Patrick Dubroy
500ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy    /**
50100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * Call this from a drag source view.
50200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     */
50300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    public boolean onTouchEvent(MotionEvent ev) {
50400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        if (!mDragging) {
50500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            return false;
50600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        }
50700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
50800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        final int action = ev.getAction();
5098dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        final int dragLayerX = (int) ev.getX();
5108dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen        final int dragLayerY = (int) ev.getY();
51100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
51200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        switch (action) {
51300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        case MotionEvent.ACTION_DOWN:
51400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            // Remember where the motion event started
5158dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen            mMotionDownX = dragLayerX;
5168dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen            mMotionDownY = dragLayerY;
51700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
5188dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen            if ((dragLayerX < mScrollZone) || (dragLayerX > mScrollView.getWidth() - mScrollZone)) {
51900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                mScrollState = SCROLL_WAITING_IN_ZONE;
52000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                mHandler.postDelayed(mScrollRunnable, SCROLL_DELAY);
52100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            } else {
52200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                mScrollState = SCROLL_OUTSIDE_ZONE;
52300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            }
52400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            break;
52500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        case MotionEvent.ACTION_MOVE:
5268dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen            handleMoveEvent(dragLayerX, dragLayerY);
52700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            break;
52800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        case MotionEvent.ACTION_UP:
529b0a6bbeeab0960419dcd1f695c209ca0ec36ab8aPatrick Dubroy            // Ensure that we've processed a move event at the current pointer location.
5308dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen            handleMoveEvent(dragLayerX, dragLayerY);
531b0a6bbeeab0960419dcd1f695c209ca0ec36ab8aPatrick Dubroy
53200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            mHandler.removeCallbacks(mScrollRunnable);
53300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            if (mDragging) {
5348dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen                drop(dragLayerX, dragLayerY);
53500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            }
53600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            endDrag();
53700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            break;
53800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        case MotionEvent.ACTION_CANCEL:
53924b6fd854f75f21700a330c2f0d11938e5dfeab6Joe Onorato            cancelDrag();
540621e6406fadba27d6cff1c38b31d5cdf99c0f97aWinson Chung            break;
54100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        }
54200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
54300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        return true;
54400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
54500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
546b0a6bbeeab0960419dcd1f695c209ca0ec36ab8aPatrick Dubroy    private void drop(float x, float y) {
54700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        final int[] coordinates = mCoordinatesTemp;
548b0a6bbeeab0960419dcd1f695c209ca0ec36ab8aPatrick Dubroy        final DropTarget dropTarget = findDropTarget((int) x, (int) y, coordinates);
54900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
550cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen        mDragObject.x = coordinates[0];
551cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen        mDragObject.y = coordinates[1];
552b0a6bbeeab0960419dcd1f695c209ca0ec36ab8aPatrick Dubroy        boolean accepted = false;
55300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        if (dropTarget != null) {
554bfbfd26c627a18f8e1e3e6d0e53e78feab360203Adam Cohen            mDragObject.dragComplete = true;
555cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen            dropTarget.onDragExit(mDragObject);
556cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen            if (dropTarget.acceptDrop(mDragObject)) {
557cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen                dropTarget.onDrop(mDragObject);
558b0a6bbeeab0960419dcd1f695c209ca0ec36ab8aPatrick Dubroy                accepted = true;
55900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            }
56000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        }
561c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohen        mDragObject.dragSource.onDropCompleted((View) dropTarget, mDragObject, accepted);
56200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
56300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
56400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private DropTarget findDropTarget(int x, int y, int[] dropCoordinates) {
56500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        final Rect r = mRectTemp;
56600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
56700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        final ArrayList<DropTarget> dropTargets = mDropTargets;
56800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        final int count = dropTargets.size();
56900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        for (int i=count-1; i>=0; i--) {
570440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy            DropTarget target = dropTargets.get(i);
5710280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka            if (!target.isDropEnabled())
5720280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka                continue;
5730280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka
57400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            target.getHitRect(r);
575440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy
5768dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen            // Convert the hit rect to DragLayer coordinates
5778dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen            target.getLocationInDragLayer(dropCoordinates);
57800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            r.offset(dropCoordinates[0] - target.getLeft(), dropCoordinates[1] - target.getTop());
579440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy
580cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen            mDragObject.x = x;
581cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen            mDragObject.y = y;
58200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            if (r.contains(x, y)) {
583cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen                DropTarget delegate = target.getDropTargetDelegate(mDragObject);
584440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy                if (delegate != null) {
585440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy                    target = delegate;
5868dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen                    target.getLocationInDragLayer(dropCoordinates);
587440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy                }
588440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy
589440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy                // Make dropCoordinates relative to the DropTarget
59000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                dropCoordinates[0] = x - dropCoordinates[0];
59100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                dropCoordinates[1] = y - dropCoordinates[1];
592440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy
59300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                return target;
59400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            }
59500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        }
59600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        return null;
59700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
59800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
59900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    public void setDragScoller(DragScroller scroller) {
60000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mDragScroller = scroller;
60100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
60200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
60300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    public void setWindowToken(IBinder token) {
60400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mWindowToken = token;
60500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
60600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
60731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
60831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * Sets the drag listner which will be notified when a drag starts or ends.
60931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
6104ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy    public void addDragListener(DragListener l) {
6114ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy        mListeners.add(l);
61200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
61300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
61431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
61531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * Remove a previously installed drag listener.
61631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
61700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    public void removeDragListener(DragListener l) {
6184ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy        mListeners.remove(l);
61900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
62000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
62100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /**
62200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * Add a DropTarget to the list of potential places to receive drop events.
62300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     */
62400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    public void addDropTarget(DropTarget target) {
62500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mDropTargets.add(target);
62600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
62700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
62800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /**
62900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * Don't send drop events to <em>target</em> any more.
63000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     */
63100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    public void removeDropTarget(DropTarget target) {
63200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mDropTargets.remove(target);
63300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
63400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
63500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /**
63600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * Set which view scrolls for touch events near the edge of the screen.
63700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     */
63800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    public void setScrollView(View v) {
63900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mScrollView = v;
64000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
64100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
64200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    /**
64300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     * Specifies the delete region.  We won't scroll on touch events over the delete region.
64400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     *
6458dfcba4af7a7ece09e8c7d96053e54f3a383e905Adam Cohen     * @param region The rectangle in DragLayer coordinates of the delete region.
64600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato     */
64700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    void setDeleteRegion(RectF region) {
64800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mDeleteRegion = region;
64900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
65000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
6515f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy    DragView getDragView() {
652cb3382b1bfe1a534b1b44f5c4def9b2db605ac90Adam Cohen        return mDragObject.dragView;
6535f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy    }
6545f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy
65500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    private class ScrollRunnable implements Runnable {
65600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        private int mDirection;
65700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
65800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        ScrollRunnable() {
65900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        }
66000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
66100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        public void run() {
66200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            if (mDragScroller != null) {
66300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                if (mDirection == SCROLL_LEFT) {
66400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                    mDragScroller.scrollLeft();
66500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                } else {
66600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                    mDragScroller.scrollRight();
66700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                }
66800acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                mScrollState = SCROLL_OUTSIDE_ZONE;
669a16fd5a6bd5371d40a5679261d416f06f8efa022Patrick Dubroy                mDistanceSinceScroll = 0;
670a16fd5a6bd5371d40a5679261d416f06f8efa022Patrick Dubroy                mDragScroller.onExitScrollArea();
67100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            }
67200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        }
67300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
67400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        void setDirection(int direction) {
67500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato            mDirection = direction;
67600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        }
67700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    }
67831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project}
679