1f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn/* 2f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * Copyright (C) 2010 The Android Open Source Project 3f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * 4f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * you may not use this file except in compliance with the License. 6f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * You may obtain a copy of the License at 7f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * 8f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * 10f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 11f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * See the License for the specific language governing permissions and 14f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * limitations under the License. 156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 16f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn 176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornpackage com.android.server.wm; 186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 194532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownimport com.android.server.input.InputManagerService; 204532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownimport com.android.server.input.InputApplicationHandle; 214532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownimport com.android.server.input.InputWindowHandle; 224532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown 235fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackbornimport android.app.ActivityManagerNative; 246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.Rect; 256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.RemoteException; 266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.util.Log; 276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.util.Slog; 2883d616a9c7b9505153d258511eb5c16b552e268dJeff Brownimport android.view.Display; 29cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brownimport android.view.InputChannel; 306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.KeyEvent; 316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.WindowManager; 326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 339302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownimport java.util.Arrays; 346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 35a9d131c30878cacdaeacb4f43a82a7cc5b872453Jeff Brownfinal class InputMonitor implements InputManagerService.WindowManagerCallbacks { 366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn private final WindowManagerService mService; 376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Current window with input focus for keys and other non-touch events. May be null. 396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn private WindowState mInputFocus; 406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // When true, prevents input dispatch from proceeding until set to false again. 426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn private boolean mInputDispatchFrozen; 436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // When true, input dispatch proceeds normally. Otherwise all events are dropped. 45c042ee2acd8529b95c5dc99240d626e61d2500cdJeff Brown // Initially false, so that input does not get dispatched until boot is finished at 46c042ee2acd8529b95c5dc99240d626e61d2500cdJeff Brown // which point the ActivityManager will enable dispatching. 47c042ee2acd8529b95c5dc99240d626e61d2500cdJeff Brown private boolean mInputDispatchEnabled; 486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // When true, need to call updateInputWindowsLw(). 506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn private boolean mUpdateInputWindowsNeeded = true; 516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 529302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown // Array of window handles to provide to the input dispatcher. 539302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown private InputWindowHandle[] mInputWindowHandles; 549302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown private int mInputWindowHandleCount; 559302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown 566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Set to true when the first input device configuration change notification 576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // is received to indicate that the input devices are ready. 586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn private final Object mInputDevicesReadyMonitor = new Object(); 596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn private boolean mInputDevicesReady; 606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 61bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner Rect mTmpRect = new Rect(); 62bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner 636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public InputMonitor(WindowManagerService service) { 646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService = service; 656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /* Notifies the window manager about a broken input channel. 686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * 696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Called by the InputManager. 706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 714cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner @Override 726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void notifyInputChannelBroken(InputWindowHandle inputWindowHandle) { 736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (inputWindowHandle == null) { 746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return; 756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn synchronized (mService.mWindowMap) { 786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowState windowState = (WindowState) inputWindowHandle.windowState; 799302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown if (windowState != null) { 809302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown Slog.i(WindowManagerService.TAG, "WINDOW DIED " + windowState); 819302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mService.removeWindowLocked(windowState.mSession, windowState); 829302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /* Notifies the window manager about an application that is not responding. 876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Returns a new timeout to continue waiting in nanoseconds, or 0 to abort dispatch. 886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * 896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Called by the InputManager. 906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 914cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner @Override 926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public long notifyANR(InputApplicationHandle inputApplicationHandle, 93bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown InputWindowHandle inputWindowHandle, String reason) { 946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn AppWindowToken appWindowToken = null; 955fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn WindowState windowState = null; 965fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn boolean aboveSystem = false; 97ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown synchronized (mService.mWindowMap) { 98ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown if (inputWindowHandle != null) { 99ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown windowState = (WindowState) inputWindowHandle.windowState; 1006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (windowState != null) { 1016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn appWindowToken = windowState.mAppToken; 1026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 104ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown if (appWindowToken == null && inputApplicationHandle != null) { 105ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown appWindowToken = (AppWindowToken)inputApplicationHandle.appWindowToken; 106ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown } 107ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown 108ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown if (windowState != null) { 109ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown Slog.i(WindowManagerService.TAG, "Input event dispatching timed out " 110bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown + "sending to " + windowState.mAttrs.getTitle() 111bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown + ". Reason: " + reason); 1125fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn // Figure out whether this window is layered above system windows. 1135fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn // We need to do this here to help the activity manager know how to 1145fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn // layer its ANR dialog. 1155fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn int systemAlertLayer = mService.mPolicy.windowTypeToLayerLw( 1165fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 1175fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn aboveSystem = windowState.mBaseLayer > systemAlertLayer; 118ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown } else if (appWindowToken != null) { 119ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown Slog.i(WindowManagerService.TAG, "Input event dispatching timed out " 120bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown + "sending to application " + appWindowToken.stringName 121bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown + ". Reason: " + reason); 122ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown } else { 123bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown Slog.i(WindowManagerService.TAG, "Input event dispatching timed out " 124bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown + ". Reason: " + reason); 1259302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 126ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown 127bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown mService.saveANRStateLocked(appWindowToken, windowState, reason); 1286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (appWindowToken != null && appWindowToken.appToken != null) { 1316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 1326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Notify the activity manager about the timeout and let it decide whether 1336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // to abort dispatching or keep waiting. 134bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown boolean abort = appWindowToken.appToken.keyDispatchingTimedOut(reason); 1356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (! abort) { 1366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // The activity manager declined to abort dispatching. 1376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Wait a bit longer and timeout again later. 1386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return appWindowToken.inputDispatchingTimeoutNanos; 1396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } catch (RemoteException ex) { 1416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1425fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn } else if (windowState != null) { 1435fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn try { 1445fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn // Notify the activity manager about the timeout and let it decide whether 1455fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn // to abort dispatching or keep waiting. 1465fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn long timeout = ActivityManagerNative.getDefault().inputDispatchingTimedOut( 147bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown windowState.mSession.mPid, aboveSystem, reason); 1485fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn if (timeout >= 0) { 1495fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn // The activity manager declined to abort dispatching. 1505fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn // Wait a bit longer and timeout again later. 1515fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn return timeout; 1525fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn } 1535fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn } catch (RemoteException ex) { 1545fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn } 1556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return 0; // abort dispatching 1576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 159a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn private void addInputWindowHandleLw(final InputWindowHandle windowHandle) { 1609302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown if (mInputWindowHandles == null) { 1619302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mInputWindowHandles = new InputWindowHandle[16]; 1629302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 1639302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown if (mInputWindowHandleCount >= mInputWindowHandles.length) { 1649302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mInputWindowHandles = Arrays.copyOf(mInputWindowHandles, 1659302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mInputWindowHandleCount * 2); 1669302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 1679302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mInputWindowHandles[mInputWindowHandleCount++] = windowHandle; 1689302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 1699302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown 170a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn private void addInputWindowHandleLw(final InputWindowHandle inputWindowHandle, 171c08eab81f30a3120ec0929d3508b4a78d498e1ffCraig Mautner final WindowState child, int flags, final int type, final boolean isVisible, 172c08eab81f30a3120ec0929d3508b4a78d498e1ffCraig Mautner final boolean hasFocus, final boolean hasWallpaper) { 173a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // Add a window to our list of input windows. 174a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.name = child.toString(); 1754cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner final boolean modal = (flags & (WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL 1764cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)) == 0; 1774cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner if (modal && child.mAppToken != null) { 1784cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner // Limit the outer touch to the activity stack region. 1794cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; 180bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner child.getStackBounds(mTmpRect); 181bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner inputWindowHandle.touchableRegion.set(mTmpRect); 1824cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner } else { 1834cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner // Not modal or full screen modal 1844cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner child.getTouchableRegion(inputWindowHandle.touchableRegion); 1854cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner } 186a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.layoutParamsFlags = flags; 187a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.layoutParamsType = type; 188a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.dispatchingTimeoutNanos = child.getInputDispatchingTimeoutNanos(); 189a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.visible = isVisible; 190a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.canReceiveKeys = child.canReceiveKeys(); 191a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.hasFocus = hasFocus; 192a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.hasWallpaper = hasWallpaper; 193a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.paused = child.mAppToken != null ? child.mAppToken.paused : false; 194a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.layer = child.mLayer; 195a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.ownerPid = child.mSession.mPid; 196a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.ownerUid = child.mSession.mUid; 197a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.inputFeatures = child.mAttrs.inputFeatures; 198a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn 199a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final Rect frame = child.mFrame; 200a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.frameLeft = frame.left; 201a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.frameTop = frame.top; 202a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.frameRight = frame.right; 203a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.frameBottom = frame.bottom; 204a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn 205a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn if (child.mGlobalScale != 1) { 206a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // If we are scaling the window, input coordinates need 207a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // to be inversely scaled to map from what is on screen 208a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // to what is actually being touched in the UI. 209a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.scaleFactor = 1.0f/child.mGlobalScale; 210a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } else { 211a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.scaleFactor = 1; 212a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 213a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn 214a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn 215a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn addInputWindowHandleLw(inputWindowHandle); 216a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 217a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn 2189302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown private void clearInputWindowHandlesLw() { 2199302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown while (mInputWindowHandleCount != 0) { 2209302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mInputWindowHandles[--mInputWindowHandleCount] = null; 2219302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 2226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void setUpdateInputWindowsNeededLw() { 2256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mUpdateInputWindowsNeeded = true; 2266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /* Updates the cached window information provided to the input dispatcher. */ 2296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void updateInputWindowsLw(boolean force) { 2306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (!force && !mUpdateInputWindowsNeeded) { 2316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return; 2326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mUpdateInputWindowsNeeded = false; 2346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 235b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn if (false) Slog.d(WindowManagerService.TAG, ">>>>>> ENTERED updateInputWindowsLw"); 2369302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown 2376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Populate the input window list with information about all of the windows that 2386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // could potentially receive input. 2396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // As an optimization, we could try to prune the list of windows but this turns 2406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // out to be difficult because only the native code knows for sure which window 2416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // currently has touch focus. 242a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final WindowStateAnimator universeBackground = mService.mAnimator.mUniverseBackground; 243a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final int aboveUniverseLayer = mService.mAnimator.mAboveUniverseLayer; 244a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn boolean addedUniverse = false; 245b8c0694ae883b0e14beab97c947a7c121c64dda6Filip Gruszczynski boolean disableWallpaperTouchEvents = false; 2466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // If there's a drag in flight, provide a pseudowindow to catch drag input 2486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final boolean inDrag = (mService.mDragState != null); 2496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (inDrag) { 2506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_DRAG) { 2516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Log.d(WindowManagerService.TAG, "Inserting drag window"); 2526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 253cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown final InputWindowHandle dragWindowHandle = mService.mDragState.mDragWindowHandle; 254cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown if (dragWindowHandle != null) { 255cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown addInputWindowHandleLw(dragWindowHandle); 256cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown } else { 257cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown Slog.w(WindowManagerService.TAG, "Drag is in progress but there is no " 258cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown + "drag window handle."); 259cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown } 2606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 262df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn final int NFW = mService.mFakeWindows.size(); 263df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn for (int i = 0; i < NFW; i++) { 264df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn addInputWindowHandleLw(mService.mFakeWindows.get(i).mWindowHandle); 265df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 266df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn 26783d616a9c7b9505153d258511eb5c16b552e268dJeff Brown // Add all windows on the default display. 268f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner final int numDisplays = mService.mDisplayContents.size(); 269f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 270f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner WindowList windows = mService.mDisplayContents.valueAt(displayNdx).getWindowList(); 271f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) { 272f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner final WindowState child = windows.get(winNdx); 273f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner final InputChannel inputChannel = child.mInputChannel; 274f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner final InputWindowHandle inputWindowHandle = child.mInputWindowHandle; 275f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner if (inputChannel == null || inputWindowHandle == null || child.mRemoved) { 276f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner // Skip this window because it cannot possibly receive input. 277f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner continue; 278f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner } 2794cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner 280f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner final int flags = child.mAttrs.flags; 28195c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski final int privateFlags = child.mAttrs.privateFlags; 282f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner final int type = child.mAttrs.type; 2834cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner 284f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner final boolean hasFocus = (child == mInputFocus); 285f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner final boolean isVisible = child.isVisibleLw(); 286b8c0694ae883b0e14beab97c947a7c121c64dda6Filip Gruszczynski if ((privateFlags 287b8c0694ae883b0e14beab97c947a7c121c64dda6Filip Gruszczynski & WindowManager.LayoutParams.PRIVATE_FLAG_DISABLE_WALLPAPER_TOUCH_EVENTS) 288b8c0694ae883b0e14beab97c947a7c121c64dda6Filip Gruszczynski != 0) { 289b8c0694ae883b0e14beab97c947a7c121c64dda6Filip Gruszczynski disableWallpaperTouchEvents = true; 290b8c0694ae883b0e14beab97c947a7c121c64dda6Filip Gruszczynski } 291f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner final boolean hasWallpaper = (child == mService.mWallpaperTarget) 292b8c0694ae883b0e14beab97c947a7c121c64dda6Filip Gruszczynski && (privateFlags & WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD) == 0 293b8c0694ae883b0e14beab97c947a7c121c64dda6Filip Gruszczynski && !disableWallpaperTouchEvents; 294f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner final boolean onDefaultDisplay = (child.getDisplayId() == Display.DEFAULT_DISPLAY); 2956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 296f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner // If there's a drag in progress and 'child' is a potential drop target, 297f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner // make sure it's been told about the drag 298f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner if (inDrag && isVisible && onDefaultDisplay) { 299f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner mService.mDragState.sendDragStartedIfNeededLw(child); 300f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner } 3016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 302f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner if (universeBackground != null && !addedUniverse 303f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner && child.mBaseLayer < aboveUniverseLayer && onDefaultDisplay) { 304f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner final WindowState u = universeBackground.mWin; 305f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner if (u.mInputChannel != null && u.mInputWindowHandle != null) { 306f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner addInputWindowHandleLw(u.mInputWindowHandle, u, u.mAttrs.flags, 307c08eab81f30a3120ec0929d3508b4a78d498e1ffCraig Mautner u.mAttrs.type, true, u == mInputFocus, false); 308f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner } 309f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner addedUniverse = true; 310a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 311e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn 312f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner if (child.mWinAnimator != universeBackground) { 313c08eab81f30a3120ec0929d3508b4a78d498e1ffCraig Mautner addInputWindowHandleLw(inputWindowHandle, child, flags, type, isVisible, 314c08eab81f30a3120ec0929d3508b4a78d498e1ffCraig Mautner hasFocus, hasWallpaper); 315f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner } 316a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 3176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Send windows to native code. 3209302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mService.mInputManager.setInputWindows(mInputWindowHandles); 3219302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown 3226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Clear the list in preparation for the next round. 3239302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown clearInputWindowHandlesLw(); 3249302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown 325b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn if (false) Slog.d(WindowManagerService.TAG, "<<<<<<< EXITED updateInputWindowsLw"); 3266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /* Notifies that the input device configuration has changed. */ 3290b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown @Override 3306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void notifyConfigurationChanged() { 3316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.sendNewConfiguration(); 3326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn synchronized (mInputDevicesReadyMonitor) { 3346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (!mInputDevicesReady) { 3356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mInputDevicesReady = true; 3366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mInputDevicesReadyMonitor.notifyAll(); 3376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /* Waits until the built-in input devices have been configured. */ 3426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public boolean waitForInputDevicesReady(long timeoutMillis) { 3436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn synchronized (mInputDevicesReadyMonitor) { 3446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (!mInputDevicesReady) { 3456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 3466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mInputDevicesReadyMonitor.wait(timeoutMillis); 3476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } catch (InterruptedException ex) { 3486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mInputDevicesReady; 3516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /* Notifies that the lid switch changed state. */ 3550b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown @Override 3566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void notifyLidSwitchChanged(long whenNanos, boolean lidOpen) { 3576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mPolicy.notifyLidSwitchChanged(whenNanos, lidOpen); 3586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3595845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner 3603818c9261ceaa3a700ff984fbcd245faeede38d7Michael Wright /* Notifies that the camera lens cover state has changed. */ 3613818c9261ceaa3a700ff984fbcd245faeede38d7Michael Wright @Override 3623818c9261ceaa3a700ff984fbcd245faeede38d7Michael Wright public void notifyCameraLensCoverSwitchChanged(long whenNanos, boolean lensCovered) { 3633818c9261ceaa3a700ff984fbcd245faeede38d7Michael Wright mService.mPolicy.notifyCameraLensCoverSwitchChanged(whenNanos, lensCovered); 3643818c9261ceaa3a700ff984fbcd245faeede38d7Michael Wright } 3653818c9261ceaa3a700ff984fbcd245faeede38d7Michael Wright 3666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /* Provides an opportunity for the window manager policy to intercept early key 3676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * processing as soon as the key has been read from the device. */ 3680b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown @Override 369037c33eae74bee2774897d969d48947f9abe254fJeff Brown public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) { 370037c33eae74bee2774897d969d48947f9abe254fJeff Brown return mService.mPolicy.interceptKeyBeforeQueueing(event, policyFlags); 3716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 37256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 37370af00abf73160235d4efe114fcf4753007a8ff3Michael Wright /* Provides an opportunity for the window manager policy to intercept early motion event 37470af00abf73160235d4efe114fcf4753007a8ff3Michael Wright * processing when the device is in a non-interactive state since these events are normally 37556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown * dropped. */ 3760b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown @Override 37770af00abf73160235d4efe114fcf4753007a8ff3Michael Wright public int interceptMotionBeforeQueueingNonInteractive(long whenNanos, int policyFlags) { 37870af00abf73160235d4efe114fcf4753007a8ff3Michael Wright return mService.mPolicy.interceptMotionBeforeQueueingNonInteractive( 37970af00abf73160235d4efe114fcf4753007a8ff3Michael Wright whenNanos, policyFlags); 38056194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } 38156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 3826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /* Provides an opportunity for the window manager policy to process a key before 3836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * ordinary dispatch. */ 3840b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown @Override 385905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown public long interceptKeyBeforeDispatching( 3866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn InputWindowHandle focus, KeyEvent event, int policyFlags) { 3876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowState windowState = focus != null ? (WindowState) focus.windowState : null; 3886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mService.mPolicy.interceptKeyBeforeDispatching(windowState, event, policyFlags); 3896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3905845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner 3916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /* Provides an opportunity for the window manager policy to process a key that 3926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * the application did not handle. */ 3930b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown @Override 3946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public KeyEvent dispatchUnhandledKey( 3956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn InputWindowHandle focus, KeyEvent event, int policyFlags) { 3966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowState windowState = focus != null ? (WindowState) focus.windowState : null; 3976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mService.mPolicy.dispatchUnhandledKey(windowState, event, policyFlags); 3986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3994532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown 4004532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown /* Callback to get pointer layer. */ 4010b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown @Override 4024532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown public int getPointerLayer() { 4034532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return mService.mPolicy.windowTypeToLayerLw(WindowManager.LayoutParams.TYPE_POINTER) 4044532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown * WindowManagerService.TYPE_LAYER_MULTIPLIER 4054532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown + WindowManagerService.TYPE_LAYER_OFFSET; 4064532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown } 4074532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown 4086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /* Called when the current input focus changes. 4096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Layer assignment is assumed to be complete by the time this is called. 4106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 4116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void setInputFocusLw(WindowState newWindow, boolean updateInputWindows) { 4125845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner if (WindowManagerService.DEBUG_FOCUS_LIGHT || WindowManagerService.DEBUG_INPUT) { 4136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.d(WindowManagerService.TAG, "Input focus has changed to " + newWindow); 4146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (newWindow != mInputFocus) { 4176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (newWindow != null && newWindow.canReceiveKeys()) { 4186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Displaying a window implicitly causes dispatching to be unpaused. 4196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // This is to protect against bugs if someone pauses dispatching but 4206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // forgets to resume. 4216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn newWindow.mToken.paused = false; 4226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mInputFocus = newWindow; 4256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn setUpdateInputWindowsNeededLw(); 4266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (updateInputWindows) { 4286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn updateInputWindowsLw(false /*force*/); 4296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4325845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner 4336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void setFocusedAppLw(AppWindowToken newApp) { 4346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Focused app has changed. 4356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (newApp == null) { 4366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mInputManager.setFocusedApplication(null); 4376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } else { 4389302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown final InputApplicationHandle handle = newApp.mInputApplicationHandle; 4399302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown handle.name = newApp.toString(); 4409302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown handle.dispatchingTimeoutNanos = newApp.inputDispatchingTimeoutNanos; 4416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4429302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mService.mInputManager.setFocusedApplication(handle); 4436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4455845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner 4466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void pauseDispatchingLw(WindowToken window) { 4476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (! window.paused) { 4486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_INPUT) { 4496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.v(WindowManagerService.TAG, "Pausing WindowToken " + window); 4506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn window.paused = true; 4536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn updateInputWindowsLw(true /*force*/); 4546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void resumeDispatchingLw(WindowToken window) { 4586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (window.paused) { 4596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_INPUT) { 4606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.v(WindowManagerService.TAG, "Resuming WindowToken " + window); 4616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn window.paused = false; 4646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn updateInputWindowsLw(true /*force*/); 4656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void freezeInputDispatchingLw() { 4696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (! mInputDispatchFrozen) { 4706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_INPUT) { 4716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.v(WindowManagerService.TAG, "Freezing input dispatching"); 4726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mInputDispatchFrozen = true; 4756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn updateInputDispatchModeLw(); 4766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void thawInputDispatchingLw() { 4806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mInputDispatchFrozen) { 4816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_INPUT) { 4826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.v(WindowManagerService.TAG, "Thawing input dispatching"); 4836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mInputDispatchFrozen = false; 4866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn updateInputDispatchModeLw(); 4876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void setEventDispatchingLw(boolean enabled) { 4916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mInputDispatchEnabled != enabled) { 4926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_INPUT) { 4936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.v(WindowManagerService.TAG, "Setting event dispatching to " + enabled); 4946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mInputDispatchEnabled = enabled; 4976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn updateInputDispatchModeLw(); 4986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 5006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 5016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn private void updateInputDispatchModeLw() { 5026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mInputManager.setInputDispatchMode(mInputDispatchEnabled, mInputDispatchFrozen); 5036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 504ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown} 505