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 616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public InputMonitor(WindowManagerService service) { 626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService = service; 636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /* Notifies the window manager about a broken input channel. 666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * 676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Called by the InputManager. 686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 694cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner @Override 706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void notifyInputChannelBroken(InputWindowHandle inputWindowHandle) { 716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (inputWindowHandle == null) { 726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return; 736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn synchronized (mService.mWindowMap) { 766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowState windowState = (WindowState) inputWindowHandle.windowState; 779302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown if (windowState != null) { 789302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown Slog.i(WindowManagerService.TAG, "WINDOW DIED " + windowState); 799302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mService.removeWindowLocked(windowState.mSession, windowState); 809302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /* Notifies the window manager about an application that is not responding. 856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Returns a new timeout to continue waiting in nanoseconds, or 0 to abort dispatch. 866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * 876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Called by the InputManager. 886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 894cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner @Override 906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public long notifyANR(InputApplicationHandle inputApplicationHandle, 91bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown InputWindowHandle inputWindowHandle, String reason) { 926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn AppWindowToken appWindowToken = null; 935fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn WindowState windowState = null; 945fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn boolean aboveSystem = false; 95ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown synchronized (mService.mWindowMap) { 96ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown if (inputWindowHandle != null) { 97ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown windowState = (WindowState) inputWindowHandle.windowState; 986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (windowState != null) { 996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn appWindowToken = windowState.mAppToken; 1006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 102ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown if (appWindowToken == null && inputApplicationHandle != null) { 103ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown appWindowToken = (AppWindowToken)inputApplicationHandle.appWindowToken; 104ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown } 105ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown 106ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown if (windowState != null) { 107ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown Slog.i(WindowManagerService.TAG, "Input event dispatching timed out " 108bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown + "sending to " + windowState.mAttrs.getTitle() 109bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown + ". Reason: " + reason); 1105fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn // Figure out whether this window is layered above system windows. 1115fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn // We need to do this here to help the activity manager know how to 1125fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn // layer its ANR dialog. 1135fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn int systemAlertLayer = mService.mPolicy.windowTypeToLayerLw( 1145fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 1155fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn aboveSystem = windowState.mBaseLayer > systemAlertLayer; 116ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown } else if (appWindowToken != null) { 117ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown Slog.i(WindowManagerService.TAG, "Input event dispatching timed out " 118bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown + "sending to application " + appWindowToken.stringName 119bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown + ". Reason: " + reason); 120ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown } else { 121bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown Slog.i(WindowManagerService.TAG, "Input event dispatching timed out " 122bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown + ". Reason: " + reason); 1239302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 124ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown 125bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown mService.saveANRStateLocked(appWindowToken, windowState, reason); 1266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (appWindowToken != null && appWindowToken.appToken != null) { 1296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 1306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Notify the activity manager about the timeout and let it decide whether 1316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // to abort dispatching or keep waiting. 132bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown boolean abort = appWindowToken.appToken.keyDispatchingTimedOut(reason); 1336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (! abort) { 1346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // The activity manager declined to abort dispatching. 1356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Wait a bit longer and timeout again later. 1366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return appWindowToken.inputDispatchingTimeoutNanos; 1376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } catch (RemoteException ex) { 1396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1405fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn } else if (windowState != null) { 1415fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn try { 1425fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn // Notify the activity manager about the timeout and let it decide whether 1435fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn // to abort dispatching or keep waiting. 1445fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn long timeout = ActivityManagerNative.getDefault().inputDispatchingTimedOut( 145bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown windowState.mSession.mPid, aboveSystem, reason); 1465fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn if (timeout >= 0) { 1475fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn // The activity manager declined to abort dispatching. 1485fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn // Wait a bit longer and timeout again later. 1495fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn return timeout; 1505fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn } 1515fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn } catch (RemoteException ex) { 1525fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn } 1536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return 0; // abort dispatching 1556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 157a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn private void addInputWindowHandleLw(final InputWindowHandle windowHandle) { 1589302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown if (mInputWindowHandles == null) { 1599302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mInputWindowHandles = new InputWindowHandle[16]; 1609302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 1619302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown if (mInputWindowHandleCount >= mInputWindowHandles.length) { 1629302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mInputWindowHandles = Arrays.copyOf(mInputWindowHandles, 1639302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mInputWindowHandleCount * 2); 1649302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 1659302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mInputWindowHandles[mInputWindowHandleCount++] = windowHandle; 1669302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 1679302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown 168a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn private void addInputWindowHandleLw(final InputWindowHandle inputWindowHandle, 16995c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski final WindowState child, int flags, int privateFlags, final int type, 170a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final boolean isVisible, final boolean hasFocus, final boolean hasWallpaper) { 171a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // Add a window to our list of input windows. 172a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.name = child.toString(); 1734cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner final boolean modal = (flags & (WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL 1744cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)) == 0; 1754cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner if (modal && child.mAppToken != null) { 1764cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner // Limit the outer touch to the activity stack region. 1774cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; 1784cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner inputWindowHandle.touchableRegion.set(child.getStackBounds()); 1794cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner } else { 1804cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner // Not modal or full screen modal 1814cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner child.getTouchableRegion(inputWindowHandle.touchableRegion); 1824cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner } 183a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.layoutParamsFlags = flags; 18495c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski inputWindowHandle.layoutParamsPrivateFlags = privateFlags; 185a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.layoutParamsType = type; 186a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.dispatchingTimeoutNanos = child.getInputDispatchingTimeoutNanos(); 187a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.visible = isVisible; 188a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.canReceiveKeys = child.canReceiveKeys(); 189a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.hasFocus = hasFocus; 190a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.hasWallpaper = hasWallpaper; 191a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.paused = child.mAppToken != null ? child.mAppToken.paused : false; 192a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.layer = child.mLayer; 193a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.ownerPid = child.mSession.mPid; 194a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.ownerUid = child.mSession.mUid; 195a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.inputFeatures = child.mAttrs.inputFeatures; 196a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn 197a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final Rect frame = child.mFrame; 198a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.frameLeft = frame.left; 199a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.frameTop = frame.top; 200a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.frameRight = frame.right; 201a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.frameBottom = frame.bottom; 202a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn 203a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn if (child.mGlobalScale != 1) { 204a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // If we are scaling the window, input coordinates need 205a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // to be inversely scaled to map from what is on screen 206a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn // to what is actually being touched in the UI. 207a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.scaleFactor = 1.0f/child.mGlobalScale; 208a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } else { 209a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn inputWindowHandle.scaleFactor = 1; 210a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 211a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn 212a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn 213a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn addInputWindowHandleLw(inputWindowHandle); 214a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 215a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn 2169302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown private void clearInputWindowHandlesLw() { 2179302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown while (mInputWindowHandleCount != 0) { 2189302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mInputWindowHandles[--mInputWindowHandleCount] = null; 2199302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown } 2206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void setUpdateInputWindowsNeededLw() { 2236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mUpdateInputWindowsNeeded = true; 2246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /* Updates the cached window information provided to the input dispatcher. */ 2276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void updateInputWindowsLw(boolean force) { 2286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (!force && !mUpdateInputWindowsNeeded) { 2296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return; 2306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mUpdateInputWindowsNeeded = false; 2326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 233b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn if (false) Slog.d(WindowManagerService.TAG, ">>>>>> ENTERED updateInputWindowsLw"); 2349302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown 2356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Populate the input window list with information about all of the windows that 2366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // could potentially receive input. 2376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // As an optimization, we could try to prune the list of windows but this turns 2386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // out to be difficult because only the native code knows for sure which window 2396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // currently has touch focus. 240a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final WindowStateAnimator universeBackground = mService.mAnimator.mUniverseBackground; 241a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn final int aboveUniverseLayer = mService.mAnimator.mAboveUniverseLayer; 242a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn boolean addedUniverse = false; 2436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 2446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // If there's a drag in flight, provide a pseudowindow to catch drag input 2456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final boolean inDrag = (mService.mDragState != null); 2466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (inDrag) { 2476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_DRAG) { 2486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Log.d(WindowManagerService.TAG, "Inserting drag window"); 2496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 250cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown final InputWindowHandle dragWindowHandle = mService.mDragState.mDragWindowHandle; 251cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown if (dragWindowHandle != null) { 252cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown addInputWindowHandleLw(dragWindowHandle); 253cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown } else { 254cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown Slog.w(WindowManagerService.TAG, "Drag is in progress but there is no " 255cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown + "drag window handle."); 256cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown } 2576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 2586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 259df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn final int NFW = mService.mFakeWindows.size(); 260df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn for (int i = 0; i < NFW; i++) { 261df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn addInputWindowHandleLw(mService.mFakeWindows.get(i).mWindowHandle); 262df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 263df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn 26483d616a9c7b9505153d258511eb5c16b552e268dJeff Brown // Add all windows on the default display. 265f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner final int numDisplays = mService.mDisplayContents.size(); 266f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 267f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner WindowList windows = mService.mDisplayContents.valueAt(displayNdx).getWindowList(); 268f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) { 269f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner final WindowState child = windows.get(winNdx); 270f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner final InputChannel inputChannel = child.mInputChannel; 271f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner final InputWindowHandle inputWindowHandle = child.mInputWindowHandle; 272f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner if (inputChannel == null || inputWindowHandle == null || child.mRemoved) { 273f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner // Skip this window because it cannot possibly receive input. 274f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner continue; 275f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner } 2764cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner 277f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner final int flags = child.mAttrs.flags; 27895c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski final int privateFlags = child.mAttrs.privateFlags; 279f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner final int type = child.mAttrs.type; 2804cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner 281f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner final boolean hasFocus = (child == mInputFocus); 282f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner final boolean isVisible = child.isVisibleLw(); 283f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner final boolean hasWallpaper = (child == mService.mWallpaperTarget) 284f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner && (type != WindowManager.LayoutParams.TYPE_KEYGUARD); 285f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner final boolean onDefaultDisplay = (child.getDisplayId() == Display.DEFAULT_DISPLAY); 2866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 287f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner // If there's a drag in progress and 'child' is a potential drop target, 288f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner // make sure it's been told about the drag 289f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner if (inDrag && isVisible && onDefaultDisplay) { 290f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner mService.mDragState.sendDragStartedIfNeededLw(child); 291f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner } 2926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 293f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner if (universeBackground != null && !addedUniverse 294f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner && child.mBaseLayer < aboveUniverseLayer && onDefaultDisplay) { 295f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner final WindowState u = universeBackground.mWin; 296f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner if (u.mInputChannel != null && u.mInputWindowHandle != null) { 297f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner addInputWindowHandleLw(u.mInputWindowHandle, u, u.mAttrs.flags, 29895c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski u.mAttrs.privateFlags, u.mAttrs.type, 29995c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski true, u == mInputFocus, false); 300f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner } 301f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner addedUniverse = true; 302a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 303e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn 304f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner if (child.mWinAnimator != universeBackground) { 30595c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski addInputWindowHandleLw(inputWindowHandle, child, flags, privateFlags, type, 306f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner isVisible, hasFocus, hasWallpaper); 307f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner } 308a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn } 3096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Send windows to native code. 3129302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mService.mInputManager.setInputWindows(mInputWindowHandles); 3139302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown 3146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Clear the list in preparation for the next round. 3159302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown clearInputWindowHandlesLw(); 3169302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown 317b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn if (false) Slog.d(WindowManagerService.TAG, "<<<<<<< EXITED updateInputWindowsLw"); 3186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /* Notifies that the input device configuration has changed. */ 3210b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown @Override 3226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void notifyConfigurationChanged() { 3236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.sendNewConfiguration(); 3246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn synchronized (mInputDevicesReadyMonitor) { 3266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (!mInputDevicesReady) { 3276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mInputDevicesReady = true; 3286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mInputDevicesReadyMonitor.notifyAll(); 3296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /* Waits until the built-in input devices have been configured. */ 3346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public boolean waitForInputDevicesReady(long timeoutMillis) { 3356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn synchronized (mInputDevicesReadyMonitor) { 3366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (!mInputDevicesReady) { 3376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn try { 3386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mInputDevicesReadyMonitor.wait(timeoutMillis); 3396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } catch (InterruptedException ex) { 3406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mInputDevicesReady; 3436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 3466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /* Notifies that the lid switch changed state. */ 3470b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown @Override 3486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void notifyLidSwitchChanged(long whenNanos, boolean lidOpen) { 3496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mPolicy.notifyLidSwitchChanged(whenNanos, lidOpen); 3506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3515845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner 3526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /* Provides an opportunity for the window manager policy to intercept early key 3536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * processing as soon as the key has been read from the device. */ 3540b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown @Override 3556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public int interceptKeyBeforeQueueing( 3566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn KeyEvent event, int policyFlags, boolean isScreenOn) { 3576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mService.mPolicy.interceptKeyBeforeQueueing(event, policyFlags, isScreenOn); 3586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 35956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 36056194ebec6212e229f4ccdaa4b187166d20013efJeff Brown /* Provides an opportunity for the window manager policy to intercept early 36156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown * motion event processing when the screen is off since these events are normally 36256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown * dropped. */ 3630b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown @Override 36456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown public int interceptMotionBeforeQueueingWhenScreenOff(int policyFlags) { 36556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown return mService.mPolicy.interceptMotionBeforeQueueingWhenScreenOff(policyFlags); 36656194ebec6212e229f4ccdaa4b187166d20013efJeff Brown } 36756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown 3686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /* Provides an opportunity for the window manager policy to process a key before 3696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * ordinary dispatch. */ 3700b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown @Override 371905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown public long interceptKeyBeforeDispatching( 3726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn InputWindowHandle focus, KeyEvent event, int policyFlags) { 3736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowState windowState = focus != null ? (WindowState) focus.windowState : null; 3746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mService.mPolicy.interceptKeyBeforeDispatching(windowState, event, policyFlags); 3756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3765845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner 3776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /* Provides an opportunity for the window manager policy to process a key that 3786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * the application did not handle. */ 3790b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown @Override 3806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public KeyEvent dispatchUnhandledKey( 3816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn InputWindowHandle focus, KeyEvent event, int policyFlags) { 3826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowState windowState = focus != null ? (WindowState) focus.windowState : null; 3836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return mService.mPolicy.dispatchUnhandledKey(windowState, event, policyFlags); 3846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 3854532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown 3864532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown /* Callback to get pointer layer. */ 3870b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown @Override 3884532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown public int getPointerLayer() { 3894532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown return mService.mPolicy.windowTypeToLayerLw(WindowManager.LayoutParams.TYPE_POINTER) 3904532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown * WindowManagerService.TYPE_LAYER_MULTIPLIER 3914532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown + WindowManagerService.TYPE_LAYER_OFFSET; 3924532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown } 3934532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown 3946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn /* Called when the current input focus changes. 3956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Layer assignment is assumed to be complete by the time this is called. 3966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 3976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void setInputFocusLw(WindowState newWindow, boolean updateInputWindows) { 3985845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner if (WindowManagerService.DEBUG_FOCUS_LIGHT || WindowManagerService.DEBUG_INPUT) { 3996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.d(WindowManagerService.TAG, "Input focus has changed to " + newWindow); 4006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (newWindow != mInputFocus) { 4036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (newWindow != null && newWindow.canReceiveKeys()) { 4046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Displaying a window implicitly causes dispatching to be unpaused. 4056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // This is to protect against bugs if someone pauses dispatching but 4066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // forgets to resume. 4076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn newWindow.mToken.paused = false; 4086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mInputFocus = newWindow; 4116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn setUpdateInputWindowsNeededLw(); 4126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (updateInputWindows) { 4146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn updateInputWindowsLw(false /*force*/); 4156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4185845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner 4196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void setFocusedAppLw(AppWindowToken newApp) { 4206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Focused app has changed. 4216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (newApp == null) { 4226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mInputManager.setFocusedApplication(null); 4236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } else { 4249302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown final InputApplicationHandle handle = newApp.mInputApplicationHandle; 4259302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown handle.name = newApp.toString(); 4269302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown handle.dispatchingTimeoutNanos = newApp.inputDispatchingTimeoutNanos; 4276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4289302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown mService.mInputManager.setFocusedApplication(handle); 4296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4315845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner 4326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void pauseDispatchingLw(WindowToken window) { 4336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (! window.paused) { 4346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_INPUT) { 4356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.v(WindowManagerService.TAG, "Pausing WindowToken " + window); 4366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn window.paused = true; 4396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn updateInputWindowsLw(true /*force*/); 4406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void resumeDispatchingLw(WindowToken window) { 4446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (window.paused) { 4456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_INPUT) { 4466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.v(WindowManagerService.TAG, "Resuming WindowToken " + window); 4476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn window.paused = false; 4506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn updateInputWindowsLw(true /*force*/); 4516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void freezeInputDispatchingLw() { 4556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (! mInputDispatchFrozen) { 4566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_INPUT) { 4576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.v(WindowManagerService.TAG, "Freezing input dispatching"); 4586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mInputDispatchFrozen = true; 4616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn updateInputDispatchModeLw(); 4626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void thawInputDispatchingLw() { 4666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mInputDispatchFrozen) { 4676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_INPUT) { 4686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.v(WindowManagerService.TAG, "Thawing input dispatching"); 4696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mInputDispatchFrozen = false; 4726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn updateInputDispatchModeLw(); 4736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public void setEventDispatchingLw(boolean enabled) { 4776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (mInputDispatchEnabled != enabled) { 4786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (WindowManagerService.DEBUG_INPUT) { 4796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Slog.v(WindowManagerService.TAG, "Setting event dispatching to " + enabled); 4806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mInputDispatchEnabled = enabled; 4836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn updateInputDispatchModeLw(); 4846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 4866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 4876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn private void updateInputDispatchModeLw() { 4886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mService.mInputManager.setInputDispatchMode(mInputDispatchEnabled, mInputDispatchFrozen); 4896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 490ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown} 491