Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5ada6cb0 authored by Christopher Tate's avatar Christopher Tate Committed by Chris Tate
Browse files

More drag/drop adjustments:

* Make View.onDragEvent() public instead of protected.
* No longer @hide View.startDrag()
* Properly manage the boundaries of DRAG_STARTED / DRAG_ENDED notifications
  to windows (and as a result don't send bogus empty DRAG_STARTED events or
  double-recycle pooled DragEvents)

Change-Id: Ib75f5c1417640c82a5b043c555e02d6e6f4b4d9c
parent c7912274
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -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"
+4 −5
Original line number Diff line number Diff line
@@ -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;
    }

+5 −0
Original line number Diff line number Diff line
@@ -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;
        }
+18 −15
Original line number Diff line number Diff line
@@ -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,6 +607,7 @@ public class WindowManagerService extends IWindowManager.Stub
         * was begun.  This is a rare case.
         */
        private void sendDragStartedIfNeededLw(WindowState newWin) {
            if (mDragInProgress) {
                // If we have sent the drag-started, we needn't do so again
                for (WindowState ws : mNotifiedWindows) {
                    if (ws == newWin) {
@@ -621,6 +623,7 @@ public class WindowManagerService extends IWindowManager.Stub
                sendDragStartedLw(newWin, event);
                event.recycle();
            }
        }

        void broadcastDragEnded() {
            if (DEBUG_DRAG) {
@@ -636,7 +639,7 @@ public class WindowManagerService extends IWindowManager.Stub
                    }
                }
                mNotifiedWindows.clear();
                mDragEnded = true;
                mDragInProgress = false;
            }
            evt.recycle();
        }