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