diff options
| -rw-r--r-- | api/current.xml | 19 | ||||
| -rw-r--r-- | core/java/android/view/View.java | 9 | ||||
| -rw-r--r-- | core/java/android/view/ViewGroup.java | 5 | ||||
| -rw-r--r-- | services/java/com/android/server/WindowManagerService.java | 33 |
4 files changed, 45 insertions, 21 deletions
diff --git a/api/current.xml b/api/current.xml index 08e86707ccf7..a8666694107c 100644 --- a/api/current.xml +++ b/api/current.xml @@ -201443,7 +201443,7 @@ static="false" final="false" deprecated="not deprecated" - visibility="protected" + visibility="public" > <parameter name="event" type="android.view.DragEvent"> </parameter> @@ -203185,6 +203185,23 @@ <parameter name="animation" type="android.view.animation.Animation"> </parameter> </method> +<method name="startDrag" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +<parameter name="data" type="android.content.ClipData"> +</parameter> +<parameter name="thumbBuilder" type="android.view.View.DragThumbnailBuilder"> +</parameter> +<parameter name="myWindowOnly" type="boolean"> +</parameter> +</method> <method name="unscheduleDrawable" return="void" abstract="false" diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 35b806a092d1..472f7b4d0c7e 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -9898,11 +9898,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } /** - * Drag and drop. App calls startDrag(), then callbacks to onMeasureDragThumbnail() - * and onDrawDragThumbnail() happen, then the drag operation is handed over to the - * OS. + * Drag and drop. App calls startDrag(), then callbacks to the thumbnail builder's + * onProvideThumbnailMetrics() and onDrawThumbnail() methods happen, then the drag + * operation is handed over to the OS. * !!! TODO: real docs - * @hide */ public final boolean startDrag(ClipData data, DragThumbnailBuilder thumbBuilder, boolean myWindowOnly) { @@ -10027,7 +10026,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility * For DRAG_ENDED_EVENT, the 'event' argument may be null. The view should return * to its normal visual state. */ - protected boolean onDragEvent(DragEvent event) { + public boolean onDragEvent(DragEvent event) { return false; } diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 5ebc981e7c3e..5b3a091d0545 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -938,11 +938,16 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager if (ViewDebug.DEBUG_DRAG) Log.d(View.VIEW_LOG_TAG, "Drop event: " + event); View target = findFrontmostDroppableChildAt(event.mX, event.mY, mLocalPoint); if (target != null) { + if (ViewDebug.DEBUG_DRAG) Log.d(View.VIEW_LOG_TAG, " dispatch drop to " + target); event.mX = mLocalPoint.x; event.mY = mLocalPoint.y; retval = target.dispatchDragEvent(event); event.mX = tx; event.mY = ty; + } else { + if (ViewDebug.DEBUG_DRAG) { + Log.d(View.VIEW_LOG_TAG, " not dropped on an accepting view"); + } } } break; } diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java index 30aed69f781c..59f74348a20a 100644 --- a/services/java/com/android/server/WindowManagerService.java +++ b/services/java/com/android/server/WindowManagerService.java @@ -505,7 +505,7 @@ public class WindowManagerService extends IWindowManager.Stub InputChannel mServerChannel, mClientChannel; WindowState mTargetWindow; ArrayList<WindowState> mNotifiedWindows; - boolean mDragEnded; + boolean mDragInProgress; private final Rect tmpRect = new Rect(); @@ -562,6 +562,7 @@ public class WindowManagerService extends IWindowManager.Stub // works correctly in calling out to the apps. mDataDescription = new ClipDescription(mData); mNotifiedWindows.clear(); + mDragInProgress = true; if (DEBUG_DRAG) { Slog.d(TAG, "broadcasting DRAG_STARTED of " + mDataDescription); @@ -586,7 +587,7 @@ public class WindowManagerService extends IWindowManager.Stub * process, so it's safe for the caller to call recycle() on the event afterwards. */ private void sendDragStartedLw(WindowState newWin, DragEvent event) { - if (!mDragEnded && newWin.isPotentialDragTarget()) { + if (mDragInProgress && newWin.isPotentialDragTarget()) { try { // clone for local callees since dispatch will recycle the event if (Process.myPid() == newWin.mSession.mPid) { @@ -606,20 +607,22 @@ public class WindowManagerService extends IWindowManager.Stub * was begun. This is a rare case. */ private void sendDragStartedIfNeededLw(WindowState newWin) { - // If we have sent the drag-started, we needn't do so again - for (WindowState ws : mNotifiedWindows) { - if (ws == newWin) { - return; + if (mDragInProgress) { + // If we have sent the drag-started, we needn't do so again + for (WindowState ws : mNotifiedWindows) { + if (ws == newWin) { + return; + } } + if (DEBUG_DRAG) { + Slog.d(TAG, "sending DRAG_STARTED to new window " + newWin); + } + DragEvent event = DragEvent.obtain(DragEvent.ACTION_DRAG_STARTED, 0, 0, + mDataDescription, null); + // sendDragStartedLw() clones 'event' if the window is process-local + sendDragStartedLw(newWin, event); + event.recycle(); } - if (DEBUG_DRAG) { - Slog.d(TAG, "sending DRAG_STARTED to new window " + newWin); - } - DragEvent event = DragEvent.obtain(DragEvent.ACTION_DRAG_STARTED, 0, 0, - mDataDescription, null); - // sendDragStartedLw() clones 'event' if the window is process-local - sendDragStartedLw(newWin, event); - event.recycle(); } void broadcastDragEnded() { @@ -636,7 +639,7 @@ public class WindowManagerService extends IWindowManager.Stub } } mNotifiedWindows.clear(); - mDragEnded = true; + mDragInProgress = false; } evt.recycle(); } |