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 194532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownimport com.android.server.input.InputApplicationHandle; 204532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownimport com.android.server.input.InputWindowHandle; 2132cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brownimport com.android.server.wm.WindowManagerService.DragInputEventReceiver; 226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport com.android.server.wm.WindowManagerService.H; 236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.content.ClipData; 256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.content.ClipDescription; 26398341927f3dca68d71024483aa276d10af4c080Craig Mautnerimport android.graphics.Point; 276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.Region; 286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.IBinder; 296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.Message; 306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.Process; 316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.RemoteException; 326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.util.Slog; 33398341927f3dca68d71024483aa276d10af4c080Craig Mautnerimport android.view.Display; 346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.DragEvent; 356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.InputChannel; 366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.Surface; 376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.View; 386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.WindowManager; 396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport java.util.ArrayList; 416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn/** 436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Drag/drop state 446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornclass DragState { 466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final WindowManagerService mService; 476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn IBinder mToken; 486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Surface mSurface; 496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int mFlags; 506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn IBinder mLocalWin; 516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn ClipData mData; 526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn ClipDescription mDataDescription; 536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mDragResult; 546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn float mCurrentX, mCurrentY; 556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn float mThumbOffsetX, mThumbOffsetY; 566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn InputChannel mServerChannel, mClientChannel; 5732cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown DragInputEventReceiver mInputEventReceiver; 58ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown InputApplicationHandle mDragApplicationHandle; 59ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown InputWindowHandle mDragWindowHandle; 606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowState mTargetWindow; 616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn ArrayList<WindowState> mNotifiedWindows; 626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean mDragInProgress; 63398341927f3dca68d71024483aa276d10af4c080Craig Mautner Display mDisplay; 646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn private final Region mTmpRegion = new Region(); 666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn DragState(WindowManagerService service, IBinder token, Surface surface, 686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int flags, IBinder localWin) { 696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService = service; 706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mToken = token; 716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurface = surface; 726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mFlags = flags; 736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mLocalWin = localWin; 746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mNotifiedWindows = new ArrayList<WindowState>(); 756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn void reset() { 786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mSurface != null) { 796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurface.destroy(); 806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mSurface = null; 826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mFlags = 0; 836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mLocalWin = null; 846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mToken = null; 856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mData = null; 866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mThumbOffsetX = mThumbOffsetY = 0; 876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mNotifiedWindows = null; 886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 903486b9696d81da8873ef595daa35b2d39fc83146Craig Mautner /** 91398341927f3dca68d71024483aa276d10af4c080Craig Mautner * @param display The Display that the window being dragged is on. 923486b9696d81da8873ef595daa35b2d39fc83146Craig Mautner */ 93398341927f3dca68d71024483aa276d10af4c080Craig Mautner void register(Display display) { 94398341927f3dca68d71024483aa276d10af4c080Craig Mautner mDisplay = display; 956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_DRAG) Slog.d(WindowManagerService.TAG, "registering drag input channel"); 966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mClientChannel != null) { 976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.e(WindowManagerService.TAG, "Duplicate register of drag input channel"); 986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } else { 996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn InputChannel[] channels = InputChannel.openInputChannelPair("drag"); 1006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mServerChannel = channels[0]; 1016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mClientChannel = channels[1]; 1026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mInputManager.registerInputChannel(mServerChannel, null); 10332cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown mInputEventReceiver = mService.new DragInputEventReceiver(mClientChannel, 10432cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown mService.mH.getLooper()); 105ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown 106ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown mDragApplicationHandle = new InputApplicationHandle(null); 107ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown mDragApplicationHandle.name = "drag"; 108ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown mDragApplicationHandle.dispatchingTimeoutNanos = 109ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS; 110ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown 11159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner mDragWindowHandle = new InputWindowHandle(mDragApplicationHandle, null, 112398341927f3dca68d71024483aa276d10af4c080Craig Mautner mDisplay.getDisplayId()); 113ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown mDragWindowHandle.name = "drag"; 114ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown mDragWindowHandle.inputChannel = mServerChannel; 115ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown mDragWindowHandle.layer = getDragLayerLw(); 116ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown mDragWindowHandle.layoutParamsFlags = 0; 117ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown mDragWindowHandle.layoutParamsType = WindowManager.LayoutParams.TYPE_DRAG; 118ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown mDragWindowHandle.dispatchingTimeoutNanos = 119ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS; 120ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown mDragWindowHandle.visible = true; 121ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown mDragWindowHandle.canReceiveKeys = false; 122ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown mDragWindowHandle.hasFocus = true; 123ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown mDragWindowHandle.hasWallpaper = false; 124ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown mDragWindowHandle.paused = false; 125ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown mDragWindowHandle.ownerPid = Process.myPid(); 126ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown mDragWindowHandle.ownerUid = Process.myUid(); 127ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown mDragWindowHandle.inputFeatures = 0; 128ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown mDragWindowHandle.scaleFactor = 1.0f; 129ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown 130ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown // The drag window cannot receive new touches. 131ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown mDragWindowHandle.touchableRegion.setEmpty(); 132ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown 133ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown // The drag window covers the entire display 134ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown mDragWindowHandle.frameLeft = 0; 135ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown mDragWindowHandle.frameTop = 0; 136398341927f3dca68d71024483aa276d10af4c080Craig Mautner Point p = new Point(); 137398341927f3dca68d71024483aa276d10af4c080Craig Mautner mDisplay.getRealSize(p); 138398341927f3dca68d71024483aa276d10af4c080Craig Mautner mDragWindowHandle.frameRight = p.x; 139398341927f3dca68d71024483aa276d10af4c080Craig Mautner mDragWindowHandle.frameBottom = p.y; 14001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown 14101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown // Pause rotations before a drag. 14201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown if (WindowManagerService.DEBUG_ORIENTATION) { 14301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown Slog.d(WindowManagerService.TAG, "Pausing rotation during drag"); 14401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown } 14501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown mService.pauseRotationLocked(); 1466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn void unregister() { 1506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_DRAG) Slog.d(WindowManagerService.TAG, "unregistering drag input channel"); 1516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mClientChannel == null) { 1526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.e(WindowManagerService.TAG, "Unregister of nonexistent drag input channel"); 1536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } else { 1546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mInputManager.unregisterInputChannel(mServerChannel); 15532cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown mInputEventReceiver.dispose(); 15632cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown mInputEventReceiver = null; 1576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mClientChannel.dispose(); 1586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mServerChannel.dispose(); 1596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mClientChannel = null; 1606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mServerChannel = null; 161cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown 162cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown mDragWindowHandle = null; 163cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown mDragApplicationHandle = null; 16401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown 16501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown // Resume rotations after a drag. 16601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown if (WindowManagerService.DEBUG_ORIENTATION) { 16701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown Slog.d(WindowManagerService.TAG, "Resuming rotation after drag"); 16801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown } 16901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown mService.resumeRotationLocked(); 1706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn int getDragLayerLw() { 1746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mService.mPolicy.windowTypeToLayerLw(WindowManager.LayoutParams.TYPE_DRAG) 1756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * WindowManagerService.TYPE_LAYER_MULTIPLIER 1766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + WindowManagerService.TYPE_LAYER_OFFSET; 1776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /* call out to each visible window/session informing it about the drag 1806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 1816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn void broadcastDragStartedLw(final float touchX, final float touchY) { 1826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Cache a base-class instance of the clip metadata so that parceling 1836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // works correctly in calling out to the apps. 1846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mDataDescription = (mData != null) ? mData.getDescription() : null; 1856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mNotifiedWindows.clear(); 1866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mDragInProgress = true; 1876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_DRAG) { 1896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.d(WindowManagerService.TAG, "broadcasting DRAG_STARTED at (" + touchX + ", " + touchY + ")"); 1906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1925c0e78c445ed4b12fec295f1c7f0799d1e79bf72Craig Mautner final WindowList windows = mService.getWindowListLocked(mDisplay); 1932d5618c22101cfc4d6478cfe1d846798389540c1Craig Mautner if (windows != null) { 1942d5618c22101cfc4d6478cfe1d846798389540c1Craig Mautner final int N = windows.size(); 1952d5618c22101cfc4d6478cfe1d846798389540c1Craig Mautner for (int i = 0; i < N; i++) { 1962d5618c22101cfc4d6478cfe1d846798389540c1Craig Mautner sendDragStartedLw(windows.get(i), touchX, touchY, mDataDescription); 1972d5618c22101cfc4d6478cfe1d846798389540c1Craig Mautner } 1986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /* helper - send a caller-provided event, presumed to be DRAG_STARTED, if the 2026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * designated window is potentially a drop recipient. There are race situations 2036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * around DRAG_ENDED broadcast, so we make sure that once we've declared that 2046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * the drag has ended, we never send out another DRAG_STARTED for this drag action. 2056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * 2066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * This method clones the 'event' parameter if it's being delivered to the same 2076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * process, so it's safe for the caller to call recycle() on the event afterwards. 2086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 2096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn private void sendDragStartedLw(WindowState newWin, float touchX, float touchY, 2106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn ClipDescription desc) { 2116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Don't actually send the event if the drag is supposed to be pinned 2126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // to the originating window but 'newWin' is not that window. 2136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if ((mFlags & View.DRAG_FLAG_GLOBAL) == 0) { 2146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final IBinder winBinder = newWin.mClient.asBinder(); 2156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (winBinder != mLocalWin) { 2166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_DRAG) { 2176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.d(WindowManagerService.TAG, "Not dispatching local DRAG_STARTED to " + newWin); 2186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return; 2206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mDragInProgress && newWin.isPotentialDragTarget()) { 224ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn DragEvent event = obtainDragEvent(newWin, DragEvent.ACTION_DRAG_STARTED, 225ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn touchX, touchY, null, desc, null, false); 2266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 2276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn newWin.mClient.dispatchDragEvent(event); 2286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // track each window that we've notified that the drag is starting 2296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mNotifiedWindows.add(newWin); 2306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } catch (RemoteException e) { 2316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.w(WindowManagerService.TAG, "Unable to drag-start window " + newWin); 2326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } finally { 2336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // if the callee was local, the dispatch has already recycled the event 2346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (Process.myPid() != newWin.mSession.mPid) { 2356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn event.recycle(); 2366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /* helper - construct and send a DRAG_STARTED event only if the window has not 2426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * previously been notified, i.e. it became visible after the drag operation 2436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * was begun. This is a rare case. 2446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 2456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn void sendDragStartedIfNeededLw(WindowState newWin) { 2466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mDragInProgress) { 2476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // If we have sent the drag-started, we needn't do so again 2486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn for (WindowState ws : mNotifiedWindows) { 2496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (ws == newWin) { 2506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return; 2516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_DRAG) { 2546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.d(WindowManagerService.TAG, "need to send DRAG_STARTED to new window " + newWin); 2556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn sendDragStartedLw(newWin, mCurrentX, mCurrentY, mDataDescription); 2576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn void broadcastDragEndedLw() { 2616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_DRAG) { 2626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.d(WindowManagerService.TAG, "broadcasting DRAG_ENDED"); 2636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn DragEvent evt = DragEvent.obtain(DragEvent.ACTION_DRAG_ENDED, 2656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 0, 0, null, null, null, mDragResult); 2666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn for (WindowState ws: mNotifiedWindows) { 2676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 2686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn ws.mClient.dispatchDragEvent(evt); 2696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } catch (RemoteException e) { 2706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.w(WindowManagerService.TAG, "Unable to drag-end window " + ws); 2716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mNotifiedWindows.clear(); 2746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mDragInProgress = false; 2756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn evt.recycle(); 2766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn void endDragLw() { 2796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mDragState.broadcastDragEndedLw(); 2806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // stop intercepting input 2826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mDragState.unregister(); 2836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mInputMonitor.updateInputWindowsLw(true /*force*/); 2846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // free our resources and drop all the object references 2866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mDragState.reset(); 2876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mDragState = null; 2886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn void notifyMoveLw(float x, float y) { 2916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final int myPid = Process.myPid(); 2926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Move the surface to the given touch 29436991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS) Slog.i( 29536991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn WindowManagerService.TAG, ">>> OPEN TRANSACTION notifyMoveLw"); 2966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Surface.openTransaction(); 2976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 298d040edbae968d826aa2c82d382345811a45c646bDianne Hackborn mSurface.setPosition(x - mThumbOffsetX, y - mThumbOffsetY); 2996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(WindowManagerService.TAG, " DRAG " 3006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn + mSurface + ": pos=(" + 3016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn (int)(x - mThumbOffsetX) + "," + (int)(y - mThumbOffsetY) + ")"); 3026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } finally { 3036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Surface.closeTransaction(); 30436991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS) Slog.i( 30536991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn WindowManagerService.TAG, "<<< CLOSE TRANSACTION notifyMoveLw"); 3066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Tell the affected window 3096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowState touchedWin = getTouchedWinAtPointLw(x, y); 3106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (touchedWin == null) { 3116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_DRAG) Slog.d(WindowManagerService.TAG, "No touched win at x=" + x + " y=" + y); 3126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return; 3136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if ((mFlags & View.DRAG_FLAG_GLOBAL) == 0) { 3156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final IBinder touchedBinder = touchedWin.mClient.asBinder(); 3166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (touchedBinder != mLocalWin) { 3176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // This drag is pinned only to the originating window, but the drag 3186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // point is outside that window. Pretend it's over empty space. 3196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn touchedWin = null; 3206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 3236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // have we dragged over a new window? 3246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if ((touchedWin != mTargetWindow) && (mTargetWindow != null)) { 3256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_DRAG) { 3266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.d(WindowManagerService.TAG, "sending DRAG_EXITED to " + mTargetWindow); 3276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // force DRAG_EXITED_EVENT if appropriate 329ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn DragEvent evt = obtainDragEvent(mTargetWindow, DragEvent.ACTION_DRAG_EXITED, 330ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn x, y, null, null, null, false); 3316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mTargetWindow.mClient.dispatchDragEvent(evt); 3326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (myPid != mTargetWindow.mSession.mPid) { 3336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn evt.recycle(); 3346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (touchedWin != null) { 3376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (false && WindowManagerService.DEBUG_DRAG) { 3386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.d(WindowManagerService.TAG, "sending DRAG_LOCATION to " + touchedWin); 3396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 340ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn DragEvent evt = obtainDragEvent(touchedWin, DragEvent.ACTION_DRAG_LOCATION, 341ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn x, y, null, null, null, false); 3426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn touchedWin.mClient.dispatchDragEvent(evt); 3436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (myPid != touchedWin.mSession.mPid) { 3446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn evt.recycle(); 3456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } catch (RemoteException e) { 3486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.w(WindowManagerService.TAG, "can't send drag notification to windows"); 3496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mTargetWindow = touchedWin; 3516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Tell the drop target about the data. Returns 'true' if we can immediately 3546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // dispatch the global drag-ended message, 'false' if we need to wait for a 3556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // result from the recipient. 3566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean notifyDropLw(float x, float y) { 3576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowState touchedWin = getTouchedWinAtPointLw(x, y); 3586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (touchedWin == null) { 3596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // "drop" outside a valid window -- no recipient to apply a 3606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // timeout to, and we can send the drag-ended message immediately. 3616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mDragResult = false; 3626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return true; 3636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_DRAG) { 3666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.d(WindowManagerService.TAG, "sending DROP to " + touchedWin); 3676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final int myPid = Process.myPid(); 3696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final IBinder token = touchedWin.mClient.asBinder(); 370ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn DragEvent evt = obtainDragEvent(touchedWin, DragEvent.ACTION_DROP, x, y, 3716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn null, null, mData, false); 3726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 3736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn touchedWin.mClient.dispatchDragEvent(evt); 3746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // 5 second timeout for this window to respond to the drop 3766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mH.removeMessages(H.DRAG_END_TIMEOUT, token); 3776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Message msg = mService.mH.obtainMessage(H.DRAG_END_TIMEOUT, token); 3786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mH.sendMessageDelayed(msg, 5000); 3796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } catch (RemoteException e) { 3806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.w(WindowManagerService.TAG, "can't send drop notification to win " + touchedWin); 3816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return true; 3826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } finally { 3836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (myPid != touchedWin.mSession.mPid) { 3846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn evt.recycle(); 3856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mToken = token; 3886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return false; 3896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Find the visible, touch-deliverable window under the given point 3926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn private WindowState getTouchedWinAtPointLw(float xf, float yf) { 3936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowState touchedWin = null; 3946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final int x = (int) xf; 3956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final int y = (int) yf; 39659c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 3975c0e78c445ed4b12fec295f1c7f0799d1e79bf72Craig Mautner final WindowList windows = mService.getWindowListLocked(mDisplay); 3982d5618c22101cfc4d6478cfe1d846798389540c1Craig Mautner if (windows == null) { 3992d5618c22101cfc4d6478cfe1d846798389540c1Craig Mautner return null; 4002d5618c22101cfc4d6478cfe1d846798389540c1Craig Mautner } 4016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final int N = windows.size(); 4026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn for (int i = N - 1; i >= 0; i--) { 4036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowState child = windows.get(i); 4046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final int flags = child.mAttrs.flags; 4056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (!child.isVisibleLw()) { 4066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // not visible == don't tell about drags 4076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn continue; 4086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if ((flags & WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE) != 0) { 4106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // not touchable == don't tell about drags 4116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn continue; 4126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn child.getTouchableRegion(mTmpRegion); 4156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final int touchFlags = flags & 4176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn (WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 4186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); 4196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mTmpRegion.contains(x, y) || touchFlags == 0) { 4206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Found it 4216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn touchedWin = child; 4226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn break; 4236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return touchedWin; 4276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 428ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn 429ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn private static DragEvent obtainDragEvent(WindowState win, int action, 430ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn float x, float y, Object localState, 431ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn ClipDescription description, ClipData data, boolean result) { 432ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn float winX = x - win.mFrame.left; 433ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn float winY = y - win.mFrame.top; 434ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn if (win.mEnforceSizeCompat) { 435ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn winX *= win.mGlobalScale; 436ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn winY *= win.mGlobalScale; 437ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn } 438ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn return DragEvent.obtain(action, winX, winY, localState, description, data, result); 439ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn } 4406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn}