16e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn/*
26e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Copyright (C) 2011 The Android Open Source Project
36e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn *
46e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
56e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * you may not use this file except in compliance with the License.
66e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * You may obtain a copy of the License at
76e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn *
86e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
96e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn *
106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Unless required by applicable law or agreed to in writing, software
116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * See the License for the specific language governing permissions and
146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * limitations under the License.
156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */
166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornpackage com.android.server.wm;
186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
190bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_DRAG;
200bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION;
210bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS;
220bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS;
230bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.content.ClipData;
266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.content.ClipDescription;
27da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheevimport android.content.Context;
280bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport android.graphics.Matrix;
29398341927f3dca68d71024483aa276d10af4c080Craig Mautnerimport android.graphics.Point;
30ba761124e624ffed2681a9e171cd3f7d8c6ed59eVladislav Kaznacheevimport android.hardware.input.InputManager;
310e8524719559f0be9c8145dbf9f52100e1fb60c3Yorke Leeimport android.os.Build;
326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.IBinder;
336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.Message;
346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.Process;
356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.RemoteException;
36da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheevimport android.os.ServiceManager;
37da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheevimport android.os.UserHandle;
38da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheevimport android.os.UserManager;
39da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheevimport android.os.IUserManager;
406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.util.Slog;
41398341927f3dca68d71024483aa276d10af4c080Craig Mautnerimport android.view.Display;
426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.DragEvent;
436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.InputChannel;
44ba761124e624ffed2681a9e171cd3f7d8c6ed59eVladislav Kaznacheevimport android.view.InputDevice;
45ba761124e624ffed2681a9e171cd3f7d8c6ed59eVladislav Kaznacheevimport android.view.PointerIcon;
463866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianimport android.view.SurfaceControl;
476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.View;
486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.WindowManager;
490bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport android.view.animation.AlphaAnimation;
500bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport android.view.animation.Animation;
510bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport android.view.animation.AnimationSet;
520bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport android.view.animation.DecelerateInterpolator;
530bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport android.view.animation.Interpolator;
540bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport android.view.animation.ScaleAnimation;
550bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport android.view.animation.Transformation;
560bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport android.view.animation.TranslateAnimation;
570bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski
580bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport com.android.server.input.InputApplicationHandle;
590bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport com.android.server.input.InputWindowHandle;
600bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport com.android.server.wm.WindowManagerService.DragInputEventReceiver;
610bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport com.android.server.wm.WindowManagerService.H;
626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
63377c32845bffaf68d5751d8cdf6fd60b8b3f5dc3Vladislav Kaznacheevimport com.android.internal.view.IDragAndDropPermissions;
649149d2b117aef40f38a7d62c0f8c2bb76eb4e244Vladislav Kaznacheev
656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport java.util.ArrayList;
666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn/**
686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Drag/drop state
696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */
706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornclass DragState {
71b3665f1737630151815b6602879e6bf236d3086fVladislav Kaznacheev    private static final long MIN_ANIMATION_DURATION_MS = 195;
72b3665f1737630151815b6602879e6bf236d3086fVladislav Kaznacheev    private static final long MAX_ANIMATION_DURATION_MS = 375;
738b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev
745d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev    private static final int DRAG_FLAGS_URI_ACCESS = View.DRAG_FLAG_GLOBAL_URI_READ |
755d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev            View.DRAG_FLAG_GLOBAL_URI_WRITE;
765d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev
775d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev    private static final int DRAG_FLAGS_URI_PERMISSIONS = DRAG_FLAGS_URI_ACCESS |
785d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev            View.DRAG_FLAG_GLOBAL_PERSISTABLE_URI_PERMISSION |
795d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev            View.DRAG_FLAG_GLOBAL_PREFIX_URI_PERMISSION;
805d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev
816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final WindowManagerService mService;
826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    IBinder mToken;
8329479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian    SurfaceControl mSurfaceControl;
846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int mFlags;
856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    IBinder mLocalWin;
86c748241523e12121015e793f5f368638b98a11feVladislav Kaznacheev    int mPid;
87ede5f5480e58dac9f6ddbd36a3085592d79c98efVladislav Kaznacheev    int mUid;
88da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev    int mSourceUserId;
89da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev    boolean mCrossProfileCopyAllowed;
906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    ClipData mData;
916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    ClipDescription mDataDescription;
92ba761124e624ffed2681a9e171cd3f7d8c6ed59eVladislav Kaznacheev    int mTouchSource;
936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mDragResult;
948b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev    float mOriginalAlpha;
958b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev    float mOriginalX, mOriginalY;
966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    float mCurrentX, mCurrentY;
976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    float mThumbOffsetX, mThumbOffsetY;
9864b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev    InputInterceptor mInputInterceptor;
996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    WindowState mTargetWindow;
1006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    ArrayList<WindowState> mNotifiedWindows;
1016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean mDragInProgress;
1025d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev    DisplayContent mDisplayContent;
1036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1048b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev    private Animation mAnimation;
1058b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev    final Transformation mTransformation = new Transformation();
1068b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev    private final Interpolator mCubicEaseOutInterpolator = new DecelerateInterpolator(1.5f);
107b3665f1737630151815b6602879e6bf236d3086fVladislav Kaznacheev    private Point mDisplaySize = new Point();
1088b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev
1093866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    DragState(WindowManagerService service, IBinder token, SurfaceControl surface,
1106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            int flags, IBinder localWin) {
1116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService = service;
1126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mToken = token;
11329479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian        mSurfaceControl = surface;
1146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mFlags = flags;
1156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mLocalWin = localWin;
1166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mNotifiedWindows = new ArrayList<WindowState>();
1176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void reset() {
12029479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian        if (mSurfaceControl != null) {
12129479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian            mSurfaceControl.destroy();
1226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
12329479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian        mSurfaceControl = null;
1246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mFlags = 0;
1256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mLocalWin = null;
1266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mToken = null;
1276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mData = null;
1286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mThumbOffsetX = mThumbOffsetY = 0;
1296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mNotifiedWindows = null;
1306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
13264b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev    class InputInterceptor {
13364b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev        InputChannel mServerChannel, mClientChannel;
13464b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev        DragInputEventReceiver mInputEventReceiver;
13564b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev        InputApplicationHandle mDragApplicationHandle;
13664b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev        InputWindowHandle mDragWindowHandle;
1375d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev
13864b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev        InputInterceptor(Display display) {
1396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            InputChannel[] channels = InputChannel.openInputChannelPair("drag");
1406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mServerChannel = channels[0];
1416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mClientChannel = channels[1];
1426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mInputManager.registerInputChannel(mServerChannel, null);
14332cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown            mInputEventReceiver = mService.new DragInputEventReceiver(mClientChannel,
14432cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown                    mService.mH.getLooper());
145ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown
146ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown            mDragApplicationHandle = new InputApplicationHandle(null);
147ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown            mDragApplicationHandle.name = "drag";
148ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown            mDragApplicationHandle.dispatchingTimeoutNanos =
149ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown                    WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS;
150ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown
1513787de16d24001eeb452e1c711d4290a396e67c9Vladislav Kaznacheev            mDragWindowHandle = new InputWindowHandle(mDragApplicationHandle, null, null,
1525d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev                    display.getDisplayId());
153ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown            mDragWindowHandle.name = "drag";
154ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown            mDragWindowHandle.inputChannel = mServerChannel;
155ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown            mDragWindowHandle.layer = getDragLayerLw();
156ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown            mDragWindowHandle.layoutParamsFlags = 0;
157ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown            mDragWindowHandle.layoutParamsType = WindowManager.LayoutParams.TYPE_DRAG;
158ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown            mDragWindowHandle.dispatchingTimeoutNanos =
159ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown                    WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS;
160ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown            mDragWindowHandle.visible = true;
161ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown            mDragWindowHandle.canReceiveKeys = false;
162ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown            mDragWindowHandle.hasFocus = true;
163ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown            mDragWindowHandle.hasWallpaper = false;
164ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown            mDragWindowHandle.paused = false;
165ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown            mDragWindowHandle.ownerPid = Process.myPid();
166ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown            mDragWindowHandle.ownerUid = Process.myUid();
167ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown            mDragWindowHandle.inputFeatures = 0;
168ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown            mDragWindowHandle.scaleFactor = 1.0f;
169ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown
170ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown            // The drag window cannot receive new touches.
171ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown            mDragWindowHandle.touchableRegion.setEmpty();
172ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown
173ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown            // The drag window covers the entire display
174ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown            mDragWindowHandle.frameLeft = 0;
175ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown            mDragWindowHandle.frameTop = 0;
176b3665f1737630151815b6602879e6bf236d3086fVladislav Kaznacheev            mDragWindowHandle.frameRight = mDisplaySize.x;
177b3665f1737630151815b6602879e6bf236d3086fVladislav Kaznacheev            mDragWindowHandle.frameBottom = mDisplaySize.y;
17801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown
17901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            // Pause rotations before a drag.
1800bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski            if (DEBUG_ORIENTATION) {
1810bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski                Slog.d(TAG_WM, "Pausing rotation during drag");
18201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            }
18301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            mService.pauseRotationLocked();
1846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
18664b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev        void tearDown() {
1876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mInputManager.unregisterInputChannel(mServerChannel);
18832cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown            mInputEventReceiver.dispose();
18932cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown            mInputEventReceiver = null;
1906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mClientChannel.dispose();
1916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mServerChannel.dispose();
1926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mClientChannel = null;
1936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mServerChannel = null;
194cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
195cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            mDragWindowHandle = null;
196cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            mDragApplicationHandle = null;
19701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown
19801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            // Resume rotations after a drag.
1990bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski            if (DEBUG_ORIENTATION) {
2000bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski                Slog.d(TAG_WM, "Resuming rotation after drag");
20101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            }
20201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            mService.resumeRotationLocked();
2036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
20664b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev    InputChannel getInputChannel() {
20764b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev        return mInputInterceptor == null ? null : mInputInterceptor.mServerChannel;
20864b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev    }
20964b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev
21064b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev    InputWindowHandle getInputWindowHandle() {
21164b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev        return mInputInterceptor == null ? null : mInputInterceptor.mDragWindowHandle;
21264b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev    }
21364b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev
21464b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev    /**
21564b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev     * @param display The Display that the window being dragged is on.
21664b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev     */
21764b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev    void register(Display display) {
218b3665f1737630151815b6602879e6bf236d3086fVladislav Kaznacheev        display.getRealSize(mDisplaySize);
21964b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev        if (DEBUG_DRAG) Slog.d(TAG_WM, "registering drag input channel");
22064b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev        if (mInputInterceptor != null) {
22164b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev            Slog.e(TAG_WM, "Duplicate register of drag input channel");
22264b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev        } else {
22364b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev            mInputInterceptor = new InputInterceptor(display);
22464b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev            mService.mInputMonitor.updateInputWindowsLw(true /*force*/);
22564b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev        }
22664b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev    }
22764b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev
22864b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev    void unregister() {
22964b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev        if (DEBUG_DRAG) Slog.d(TAG_WM, "unregistering drag input channel");
23064b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev        if (mInputInterceptor == null) {
23164b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev            Slog.e(TAG_WM, "Unregister of nonexistent drag input channel");
23264b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev        } else {
23364b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev            // Input channel should be disposed on the thread where the input is being handled.
23464b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev            mService.mH.obtainMessage(
23564b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev                    H.TEAR_DOWN_DRAG_AND_DROP_INPUT, mInputInterceptor).sendToTarget();
23664b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev            mInputInterceptor = null;
23764b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev            mService.mInputMonitor.updateInputWindowsLw(true /*force*/);
23864b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev        }
23964b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev    }
24064b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev
2416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int getDragLayerLw() {
2425cd907d3d6ceebf8731ef1f69347cce6f76109e9Wale Ogunwale        return mService.mPolicy.getWindowLayerFromTypeLw(WindowManager.LayoutParams.TYPE_DRAG)
2436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                * WindowManagerService.TYPE_LAYER_MULTIPLIER
2446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                + WindowManagerService.TYPE_LAYER_OFFSET;
2456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /* call out to each visible window/session informing it about the drag
2486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
2496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void broadcastDragStartedLw(final float touchX, final float touchY) {
2508b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        mOriginalX = mCurrentX = touchX;
2518b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        mOriginalY = mCurrentY = touchY;
2528b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev
2536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // Cache a base-class instance of the clip metadata so that parceling
2546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // works correctly in calling out to the apps.
2556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mDataDescription = (mData != null) ? mData.getDescription() : null;
2566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mNotifiedWindows.clear();
2576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mDragInProgress = true;
2586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
259da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev        mSourceUserId = UserHandle.getUserId(mUid);
260da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev
261da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev        final IUserManager userManager =
262da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev                (IUserManager) ServiceManager.getService(Context.USER_SERVICE);
263da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev        try {
264da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev            mCrossProfileCopyAllowed = !userManager.getUserRestrictions(mSourceUserId).getBoolean(
265da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev                    UserManager.DISALLOW_CROSS_PROFILE_COPY_PASTE);
266da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev        } catch (RemoteException e) {
267da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev            Slog.e(TAG_WM, "Remote Exception calling UserManager: " + e);
268da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev            mCrossProfileCopyAllowed = false;
269da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev        }
270da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev
2710bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski        if (DEBUG_DRAG) {
2720bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski            Slog.d(TAG_WM, "broadcasting DRAG_STARTED at (" + touchX + ", " + touchY + ")");
2736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
275f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale        mDisplayContent.forAllWindows(w -> {
276f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale            sendDragStartedLw(w, touchX, touchY, mDataDescription);
277f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale        }, false /* traverseTopToBottom */ );
2786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
280da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev    /* helper - send a ACTION_DRAG_STARTED event, if the
2816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * designated window is potentially a drop recipient.  There are race situations
2826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * around DRAG_ENDED broadcast, so we make sure that once we've declared that
2836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * the drag has ended, we never send out another DRAG_STARTED for this drag action.
2846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     *
2856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * This method clones the 'event' parameter if it's being delivered to the same
2866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * process, so it's safe for the caller to call recycle() on the event afterwards.
2876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
2886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    private void sendDragStartedLw(WindowState newWin, float touchX, float touchY,
2896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            ClipDescription desc) {
290da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev        if (mDragInProgress && isValidDropTarget(newWin)) {
291ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            DragEvent event = obtainDragEvent(newWin, DragEvent.ACTION_DRAG_STARTED,
292ede5f5480e58dac9f6ddbd36a3085592d79c98efVladislav Kaznacheev                    touchX, touchY, null, desc, null, null, false);
2936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            try {
2946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                newWin.mClient.dispatchDragEvent(event);
2956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // track each window that we've notified that the drag is starting
2966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mNotifiedWindows.add(newWin);
2976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            } catch (RemoteException e) {
2980bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski                Slog.w(TAG_WM, "Unable to drag-start window " + newWin);
2996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            } finally {
3006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // if the callee was local, the dispatch has already recycled the event
3016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                if (Process.myPid() != newWin.mSession.mPid) {
3026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    event.recycle();
3036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
3046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
3056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
308da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev    private boolean isValidDropTarget(WindowState targetWin) {
309da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev        if (targetWin == null) {
310da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev            return false;
311da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev        }
312da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev        if (!targetWin.isPotentialDragTarget()) {
313da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev            return false;
314da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev        }
3150e8524719559f0be9c8145dbf9f52100e1fb60c3Yorke Lee        if ((mFlags & View.DRAG_FLAG_GLOBAL) == 0 || !targetWindowSupportsGlobalDrag(targetWin)) {
316da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev            // Drag is limited to the current window.
317da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev            if (mLocalWin != targetWin.mClient.asBinder()) {
318da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev                return false;
319da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev            }
320da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev        }
321da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev
322da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev        return mCrossProfileCopyAllowed ||
323da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev                mSourceUserId == UserHandle.getUserId(targetWin.getOwningUid());
324da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev    }
325da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev
3260e8524719559f0be9c8145dbf9f52100e1fb60c3Yorke Lee    private boolean targetWindowSupportsGlobalDrag(WindowState targetWin) {
3270e8524719559f0be9c8145dbf9f52100e1fb60c3Yorke Lee        // Global drags are limited to system windows, and windows for apps that are targeting N and
3280e8524719559f0be9c8145dbf9f52100e1fb60c3Yorke Lee        // above.
3290e8524719559f0be9c8145dbf9f52100e1fb60c3Yorke Lee        return targetWin.mAppToken == null
33072919d2c310db04fdb860e926ccb0bfe6e3aef08Wale Ogunwale                || targetWin.mAppToken.mTargetSdk >= Build.VERSION_CODES.N;
3310e8524719559f0be9c8145dbf9f52100e1fb60c3Yorke Lee    }
3320e8524719559f0be9c8145dbf9f52100e1fb60c3Yorke Lee
333da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev    /* helper - send a ACTION_DRAG_STARTED event only if the window has not
3346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * previously been notified, i.e. it became visible after the drag operation
3356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * was begun.  This is a rare case.
3366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
3376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void sendDragStartedIfNeededLw(WindowState newWin) {
3386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mDragInProgress) {
3396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // If we have sent the drag-started, we needn't do so again
340da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev            if (isWindowNotified(newWin)) {
341da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev                return;
3426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
3430bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski            if (DEBUG_DRAG) {
3440bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski                Slog.d(TAG_WM, "need to send DRAG_STARTED to new window " + newWin);
3456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
3466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            sendDragStartedLw(newWin, mCurrentX, mCurrentY, mDataDescription);
3476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
350da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev    private boolean isWindowNotified(WindowState newWin) {
351da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev        for (WindowState ws : mNotifiedWindows) {
352da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev            if (ws == newWin) {
353da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev                return true;
354da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev            }
355da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev        }
356da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev        return false;
357da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev    }
358da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev
359a56b2b97872e43c2afe5ee6b09ac05bc90d38508Vladislav Kaznacheev    private void broadcastDragEndedLw() {
36068dd2e864412851cd4e8b00c02a3a9ff0347df32Vladislav Kaznacheev        final int myPid = Process.myPid();
36168dd2e864412851cd4e8b00c02a3a9ff0347df32Vladislav Kaznacheev
3620bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski        if (DEBUG_DRAG) {
3630bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski            Slog.d(TAG_WM, "broadcasting DRAG_ENDED");
3646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
36568dd2e864412851cd4e8b00c02a3a9ff0347df32Vladislav Kaznacheev        for (WindowState ws : mNotifiedWindows) {
366c748241523e12121015e793f5f368638b98a11feVladislav Kaznacheev            float x = 0;
367c748241523e12121015e793f5f368638b98a11feVladislav Kaznacheev            float y = 0;
368c748241523e12121015e793f5f368638b98a11feVladislav Kaznacheev            if (!mDragResult && (ws.mSession.mPid == mPid)) {
369c748241523e12121015e793f5f368638b98a11feVladislav Kaznacheev                // Report unconsumed drop location back to the app that started the drag.
370c748241523e12121015e793f5f368638b98a11feVladislav Kaznacheev                x = mCurrentX;
371c748241523e12121015e793f5f368638b98a11feVladislav Kaznacheev                y = mCurrentY;
372c748241523e12121015e793f5f368638b98a11feVladislav Kaznacheev            }
37368dd2e864412851cd4e8b00c02a3a9ff0347df32Vladislav Kaznacheev            DragEvent evt = DragEvent.obtain(DragEvent.ACTION_DRAG_ENDED,
374c748241523e12121015e793f5f368638b98a11feVladislav Kaznacheev                    x, y, null, null, null, null, mDragResult);
3756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            try {
3766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                ws.mClient.dispatchDragEvent(evt);
3776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            } catch (RemoteException e) {
3780bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski                Slog.w(TAG_WM, "Unable to drag-end window " + ws);
3796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
38068dd2e864412851cd4e8b00c02a3a9ff0347df32Vladislav Kaznacheev            // if the current window is in the same process,
38168dd2e864412851cd4e8b00c02a3a9ff0347df32Vladislav Kaznacheev            // the dispatch has already recycled the event
38268dd2e864412851cd4e8b00c02a3a9ff0347df32Vladislav Kaznacheev            if (myPid != ws.mSession.mPid) {
38368dd2e864412851cd4e8b00c02a3a9ff0347df32Vladislav Kaznacheev                evt.recycle();
38468dd2e864412851cd4e8b00c02a3a9ff0347df32Vladislav Kaznacheev            }
3856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mNotifiedWindows.clear();
3876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mDragInProgress = false;
3886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void endDragLw() {
391a56b2b97872e43c2afe5ee6b09ac05bc90d38508Vladislav Kaznacheev        if (mAnimation != null) {
392a56b2b97872e43c2afe5ee6b09ac05bc90d38508Vladislav Kaznacheev            return;
393a56b2b97872e43c2afe5ee6b09ac05bc90d38508Vladislav Kaznacheev        }
3948b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        if (!mDragResult) {
3958b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev            mAnimation = createReturnAnimationLocked();
3968b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev            mService.scheduleAnimationLocked();
3978b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev            return;  // Will call cleanUpDragLw when the animation is done.
3988b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        }
3998b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        cleanUpDragLw();
4008b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev    }
4018b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev
402ce2aef9f12f18fdc7811ff0de8c1c37177e7f645Vladislav Kaznacheev    void cancelDragLw() {
403ce2aef9f12f18fdc7811ff0de8c1c37177e7f645Vladislav Kaznacheev        if (mAnimation != null) {
404ce2aef9f12f18fdc7811ff0de8c1c37177e7f645Vladislav Kaznacheev            return;
405ce2aef9f12f18fdc7811ff0de8c1c37177e7f645Vladislav Kaznacheev        }
406ce2aef9f12f18fdc7811ff0de8c1c37177e7f645Vladislav Kaznacheev        mAnimation = createCancelAnimationLocked();
407ce2aef9f12f18fdc7811ff0de8c1c37177e7f645Vladislav Kaznacheev        mService.scheduleAnimationLocked();
408ce2aef9f12f18fdc7811ff0de8c1c37177e7f645Vladislav Kaznacheev    }
4098b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev
410a56b2b97872e43c2afe5ee6b09ac05bc90d38508Vladislav Kaznacheev    private void cleanUpDragLw() {
4118b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        broadcastDragEndedLw();
412989b58a633ed6f2192a172855525d86477452884Vladislav Kaznacheev        if (isFromSource(InputDevice.SOURCE_MOUSE)) {
4135d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev            mService.restorePointerIconLocked(mDisplayContent, mCurrentX, mCurrentY);
414989b58a633ed6f2192a172855525d86477452884Vladislav Kaznacheev        }
4156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // stop intercepting input
4178b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        unregister();
4186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // free our resources and drop all the object references
4208b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        reset();
4216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService.mDragState = null;
4226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void notifyMoveLw(float x, float y) {
425a56b2b97872e43c2afe5ee6b09ac05bc90d38508Vladislav Kaznacheev        if (mAnimation != null) {
426a56b2b97872e43c2afe5ee6b09ac05bc90d38508Vladislav Kaznacheev            return;
427a56b2b97872e43c2afe5ee6b09ac05bc90d38508Vladislav Kaznacheev        }
4288b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        mCurrentX = x;
4298b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        mCurrentY = y;
4308b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev
4316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // Move the surface to the given touch
4320bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski        if (SHOW_LIGHT_TRANSACTIONS) Slog.i(
4330bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski                TAG_WM, ">>> OPEN TRANSACTION notifyMoveLw");
43468e5c9e93a8f1542cd988ac01ba1d98381ff4893Robert Carr        mService.openSurfaceTransaction();
4356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        try {
43629479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian            mSurfaceControl.setPosition(x - mThumbOffsetX, y - mThumbOffsetY);
4370bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski            if (SHOW_TRANSACTIONS) Slog.i(TAG_WM, "  DRAG "
43829479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian                    + mSurfaceControl + ": pos=(" +
4396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    (int)(x - mThumbOffsetX) + "," + (int)(y - mThumbOffsetY) + ")");
4406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } finally {
44168e5c9e93a8f1542cd988ac01ba1d98381ff4893Robert Carr            mService.closeSurfaceTransaction();
4420bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski            if (SHOW_LIGHT_TRANSACTIONS) Slog.i(
4430bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski                    TAG_WM, "<<< CLOSE TRANSACTION notifyMoveLw");
4446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
445d0ed8937ce07e7243d8349d6eb859e8bff24f50bVladislav Kaznacheev        notifyLocationLw(x, y);
446d0ed8937ce07e7243d8349d6eb859e8bff24f50bVladislav Kaznacheev    }
4476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
448d0ed8937ce07e7243d8349d6eb859e8bff24f50bVladislav Kaznacheev    void notifyLocationLw(float x, float y) {
4496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // Tell the affected window
4505d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev        WindowState touchedWin = mDisplayContent.getTouchableWinAtPointLocked(x, y);
451598d40d93713470b7a4b02036cbea8ba9ee7ef90Vladislav Kaznacheev        if (touchedWin != null && !isWindowNotified(touchedWin)) {
452da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev            // The drag point is over a window which was not notified about a drag start.
453da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev            // Pretend it's over empty space.
454da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev            touchedWin = null;
4556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
456da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev
4576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        try {
458d0ed8937ce07e7243d8349d6eb859e8bff24f50bVladislav Kaznacheev            final int myPid = Process.myPid();
459d0ed8937ce07e7243d8349d6eb859e8bff24f50bVladislav Kaznacheev
4606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // have we dragged over a new window?
4616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if ((touchedWin != mTargetWindow) && (mTargetWindow != null)) {
4620bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski                if (DEBUG_DRAG) {
4630bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski                    Slog.d(TAG_WM, "sending DRAG_EXITED to " + mTargetWindow);
4646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
4656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // force DRAG_EXITED_EVENT if appropriate
466ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                DragEvent evt = obtainDragEvent(mTargetWindow, DragEvent.ACTION_DRAG_EXITED,
467cc010b2a9865ccef23d85f2b31d680c58ef6aeaaVladislav Kaznacheev                        0, 0, null, null, null, null, false);
4686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mTargetWindow.mClient.dispatchDragEvent(evt);
4696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                if (myPid != mTargetWindow.mSession.mPid) {
4706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    evt.recycle();
4716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
4726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (touchedWin != null) {
4740bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski                if (false && DEBUG_DRAG) {
4750bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski                    Slog.d(TAG_WM, "sending DRAG_LOCATION to " + touchedWin);
4766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
477ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                DragEvent evt = obtainDragEvent(touchedWin, DragEvent.ACTION_DRAG_LOCATION,
478ede5f5480e58dac9f6ddbd36a3085592d79c98efVladislav Kaznacheev                        x, y, null, null, null, null, false);
4796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                touchedWin.mClient.dispatchDragEvent(evt);
4806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                if (myPid != touchedWin.mSession.mPid) {
4816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    evt.recycle();
4826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
4836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } catch (RemoteException e) {
4850bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski            Slog.w(TAG_WM, "can't send drag notification to windows");
4866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mTargetWindow = touchedWin;
4886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4905d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev    // Find the drop target and tell it about the data.  Returns 'true' if we can immediately
4916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // dispatch the global drag-ended message, 'false' if we need to wait for a
4926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // result from the recipient.
4935d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev    boolean notifyDropLw(float x, float y) {
494a56b2b97872e43c2afe5ee6b09ac05bc90d38508Vladislav Kaznacheev        if (mAnimation != null) {
495a56b2b97872e43c2afe5ee6b09ac05bc90d38508Vladislav Kaznacheev            return false;
496a56b2b97872e43c2afe5ee6b09ac05bc90d38508Vladislav Kaznacheev        }
4978b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        mCurrentX = x;
4988b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        mCurrentY = y;
4998b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev
5005d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev        WindowState touchedWin = mDisplayContent.getTouchableWinAtPointLocked(x, y);
5015d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev
502da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev        if (!isWindowNotified(touchedWin)) {
5036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // "drop" outside a valid window -- no recipient to apply a
5046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // timeout to, and we can send the drag-ended message immediately.
5056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mDragResult = false;
5066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return true;
5076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
5086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5090bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski        if (DEBUG_DRAG) {
5100bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski            Slog.d(TAG_WM, "sending DROP to " + touchedWin);
5116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
5125d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev
5135d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev        final int targetUserId = UserHandle.getUserId(touchedWin.getOwningUid());
5145d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev
515377c32845bffaf68d5751d8cdf6fd60b8b3f5dc3Vladislav Kaznacheev        DragAndDropPermissionsHandler dragAndDropPermissions = null;
5165d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev        if ((mFlags & View.DRAG_FLAG_GLOBAL) != 0 &&
5175d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev                (mFlags & DRAG_FLAGS_URI_ACCESS) != 0) {
518377c32845bffaf68d5751d8cdf6fd60b8b3f5dc3Vladislav Kaznacheev            dragAndDropPermissions = new DragAndDropPermissionsHandler(
5195d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev                    mData,
5205d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev                    mUid,
5215d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev                    touchedWin.getOwningPackage(),
5225d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev                    mFlags & DRAG_FLAGS_URI_PERMISSIONS,
5235d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev                    mSourceUserId,
5245d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev                    targetUserId);
5255d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev        }
5265d6bdebfeed73ab5efff03c451b3ff7460935d00Vladislav Kaznacheev        if (mSourceUserId != targetUserId){
527da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev            mData.fixUris(mSourceUserId);
528da2f1943dfb23f080e6cd5f16d55eb958f1d2001Vladislav Kaznacheev        }
5296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final int myPid = Process.myPid();
5306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final IBinder token = touchedWin.mClient.asBinder();
531ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        DragEvent evt = obtainDragEvent(touchedWin, DragEvent.ACTION_DROP, x, y,
532377c32845bffaf68d5751d8cdf6fd60b8b3f5dc3Vladislav Kaznacheev                null, null, mData, dragAndDropPermissions, false);
5336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        try {
5346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            touchedWin.mClient.dispatchDragEvent(evt);
5356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // 5 second timeout for this window to respond to the drop
5376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mH.removeMessages(H.DRAG_END_TIMEOUT, token);
5386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            Message msg = mService.mH.obtainMessage(H.DRAG_END_TIMEOUT, token);
5396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mH.sendMessageDelayed(msg, 5000);
5406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } catch (RemoteException e) {
5410bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski            Slog.w(TAG_WM, "can't send drop notification to win " + touchedWin);
5426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return true;
5436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } finally {
5446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (myPid != touchedWin.mSession.mPid) {
5456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                evt.recycle();
5466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
5476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
5486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mToken = token;
5496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return false;
5506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
552ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn    private static DragEvent obtainDragEvent(WindowState win, int action,
553ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            float x, float y, Object localState,
554ede5f5480e58dac9f6ddbd36a3085592d79c98efVladislav Kaznacheev            ClipDescription description, ClipData data,
555377c32845bffaf68d5751d8cdf6fd60b8b3f5dc3Vladislav Kaznacheev            IDragAndDropPermissions dragAndDropPermissions,
556ede5f5480e58dac9f6ddbd36a3085592d79c98efVladislav Kaznacheev            boolean result) {
557989b58a633ed6f2192a172855525d86477452884Vladislav Kaznacheev        final float winX = win.translateToWindowX(x);
558989b58a633ed6f2192a172855525d86477452884Vladislav Kaznacheev        final float winY = win.translateToWindowY(y);
559ec6a447c86b03f5896fdb717de530c8abf8887f9Vladislav Kaznacheev        return DragEvent.obtain(action, winX, winY, localState, description, data,
560377c32845bffaf68d5751d8cdf6fd60b8b3f5dc3Vladislav Kaznacheev                dragAndDropPermissions, result);
561ec6a447c86b03f5896fdb717de530c8abf8887f9Vladislav Kaznacheev    }
562ec6a447c86b03f5896fdb717de530c8abf8887f9Vladislav Kaznacheev
5638b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev    boolean stepAnimationLocked(long currentTimeMs) {
5648b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        if (mAnimation == null) {
5658b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev            return false;
5668b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        }
5678b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev
5688b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        mTransformation.clear();
5698b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        if (!mAnimation.getTransformation(currentTimeMs, mTransformation)) {
5708b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev            cleanUpDragLw();
5718b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev            return false;
5728b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        }
5738b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev
574ce2aef9f12f18fdc7811ff0de8c1c37177e7f645Vladislav Kaznacheev        mTransformation.getMatrix().postTranslate(
575ce2aef9f12f18fdc7811ff0de8c1c37177e7f645Vladislav Kaznacheev                mCurrentX - mThumbOffsetX, mCurrentY - mThumbOffsetY);
5768b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        final float tmpFloats[] = mService.mTmpFloats;
5778b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        mTransformation.getMatrix().getValues(tmpFloats);
578ce2aef9f12f18fdc7811ff0de8c1c37177e7f645Vladislav Kaznacheev        mSurfaceControl.setPosition(tmpFloats[Matrix.MTRANS_X], tmpFloats[Matrix.MTRANS_Y]);
5798b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        mSurfaceControl.setAlpha(mTransformation.getAlpha());
5808b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        mSurfaceControl.setMatrix(tmpFloats[Matrix.MSCALE_X], tmpFloats[Matrix.MSKEW_Y],
5818b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev                tmpFloats[Matrix.MSKEW_X], tmpFloats[Matrix.MSCALE_Y]);
5828b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        return true;
5838b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev    }
5848b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev
5858b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev    private Animation createReturnAnimationLocked() {
5868b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        final AnimationSet set = new AnimationSet(false);
587b3665f1737630151815b6602879e6bf236d3086fVladislav Kaznacheev        final float translateX = mOriginalX - mCurrentX;
588b3665f1737630151815b6602879e6bf236d3086fVladislav Kaznacheev        final float translateY = mOriginalY - mCurrentY;
589b3665f1737630151815b6602879e6bf236d3086fVladislav Kaznacheev        set.addAnimation(new TranslateAnimation( 0, translateX, 0, translateY));
5908b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        set.addAnimation(new AlphaAnimation(mOriginalAlpha, mOriginalAlpha / 2));
591b3665f1737630151815b6602879e6bf236d3086fVladislav Kaznacheev        // Adjust the duration to the travel distance.
592b3665f1737630151815b6602879e6bf236d3086fVladislav Kaznacheev        final double travelDistance = Math.sqrt(translateX * translateX + translateY * translateY);
593b3665f1737630151815b6602879e6bf236d3086fVladislav Kaznacheev        final double displayDiagonal =
594b3665f1737630151815b6602879e6bf236d3086fVladislav Kaznacheev                Math.sqrt(mDisplaySize.x * mDisplaySize.x + mDisplaySize.y * mDisplaySize.y);
595b3665f1737630151815b6602879e6bf236d3086fVladislav Kaznacheev        final long duration = MIN_ANIMATION_DURATION_MS + (long) (travelDistance / displayDiagonal
596b3665f1737630151815b6602879e6bf236d3086fVladislav Kaznacheev                * (MAX_ANIMATION_DURATION_MS - MIN_ANIMATION_DURATION_MS));
597b3665f1737630151815b6602879e6bf236d3086fVladislav Kaznacheev        set.setDuration(duration);
5988b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        set.setInterpolator(mCubicEaseOutInterpolator);
5998b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        set.initialize(0, 0, 0, 0);
6008b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        set.start();  // Will start on the first call to getTransformation.
6018b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev        return set;
6028b6f38c7c7dee7d0a543bfdb4cfd936b3fd42c07Vladislav Kaznacheev    }
603ce2aef9f12f18fdc7811ff0de8c1c37177e7f645Vladislav Kaznacheev
604ce2aef9f12f18fdc7811ff0de8c1c37177e7f645Vladislav Kaznacheev    private Animation createCancelAnimationLocked() {
605ce2aef9f12f18fdc7811ff0de8c1c37177e7f645Vladislav Kaznacheev        final AnimationSet set = new AnimationSet(false);
606ce2aef9f12f18fdc7811ff0de8c1c37177e7f645Vladislav Kaznacheev        set.addAnimation(new ScaleAnimation(1, 0, 1, 0, mThumbOffsetX, mThumbOffsetY));
607ce2aef9f12f18fdc7811ff0de8c1c37177e7f645Vladislav Kaznacheev        set.addAnimation(new AlphaAnimation(mOriginalAlpha, 0));
608b3665f1737630151815b6602879e6bf236d3086fVladislav Kaznacheev        set.setDuration(MIN_ANIMATION_DURATION_MS);
609ce2aef9f12f18fdc7811ff0de8c1c37177e7f645Vladislav Kaznacheev        set.setInterpolator(mCubicEaseOutInterpolator);
610ce2aef9f12f18fdc7811ff0de8c1c37177e7f645Vladislav Kaznacheev        set.initialize(0, 0, 0, 0);
611ce2aef9f12f18fdc7811ff0de8c1c37177e7f645Vladislav Kaznacheev        set.start();  // Will start on the first call to getTransformation.
612ce2aef9f12f18fdc7811ff0de8c1c37177e7f645Vladislav Kaznacheev        return set;
613ce2aef9f12f18fdc7811ff0de8c1c37177e7f645Vladislav Kaznacheev    }
614ba761124e624ffed2681a9e171cd3f7d8c6ed59eVladislav Kaznacheev
615ba761124e624ffed2681a9e171cd3f7d8c6ed59eVladislav Kaznacheev    private boolean isFromSource(int source) {
616ba761124e624ffed2681a9e171cd3f7d8c6ed59eVladislav Kaznacheev        return (mTouchSource & source) == source;
617ba761124e624ffed2681a9e171cd3f7d8c6ed59eVladislav Kaznacheev    }
618ba761124e624ffed2681a9e171cd3f7d8c6ed59eVladislav Kaznacheev
619ba761124e624ffed2681a9e171cd3f7d8c6ed59eVladislav Kaznacheev    void overridePointerIconLw(int touchSource) {
620ba761124e624ffed2681a9e171cd3f7d8c6ed59eVladislav Kaznacheev        mTouchSource = touchSource;
621ba761124e624ffed2681a9e171cd3f7d8c6ed59eVladislav Kaznacheev        if (isFromSource(InputDevice.SOURCE_MOUSE)) {
622f9d9ce7705475874c82af04eb9b208a7fb556792Michael Wright            InputManager.getInstance().setPointerIconType(PointerIcon.TYPE_GRABBING);
623ba761124e624ffed2681a9e171cd3f7d8c6ed59eVladislav Kaznacheev        }
624ba761124e624ffed2681a9e171cd3f7d8c6ed59eVladislav Kaznacheev    }
6250bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski}
626