InputMonitor.java revision 037c33eae74bee2774897d969d48947f9abe254f
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,
17195c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski            final WindowState child, int flags, int privateFlags, final int type,
172a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            final boolean isVisible, 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;
18795c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski        inputWindowHandle.layoutParamsPrivateFlags = privateFlags;
188a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.layoutParamsType = type;
189a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.dispatchingTimeoutNanos = child.getInputDispatchingTimeoutNanos();
190a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.visible = isVisible;
191a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.canReceiveKeys = child.canReceiveKeys();
192a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.hasFocus = hasFocus;
193a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.hasWallpaper = hasWallpaper;
194a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.paused = child.mAppToken != null ? child.mAppToken.paused : false;
195a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.layer = child.mLayer;
196a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.ownerPid = child.mSession.mPid;
197a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.ownerUid = child.mSession.mUid;
198a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.inputFeatures = child.mAttrs.inputFeatures;
199a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn
200a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        final Rect frame = child.mFrame;
201a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.frameLeft = frame.left;
202a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.frameTop = frame.top;
203a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.frameRight = frame.right;
204a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.frameBottom = frame.bottom;
205a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn
206a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        if (child.mGlobalScale != 1) {
207a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            // If we are scaling the window, input coordinates need
208a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            // to be inversely scaled to map from what is on screen
209a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            // to what is actually being touched in the UI.
210a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            inputWindowHandle.scaleFactor = 1.0f/child.mGlobalScale;
211a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        } else {
212a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            inputWindowHandle.scaleFactor = 1;
213a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        }
214a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn
215a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn
216a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        addInputWindowHandleLw(inputWindowHandle);
217a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn    }
218a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn
2199302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    private void clearInputWindowHandlesLw() {
2209302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        while (mInputWindowHandleCount != 0) {
2219302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mInputWindowHandles[--mInputWindowHandleCount] = null;
2229302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        }
2236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void setUpdateInputWindowsNeededLw() {
2266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mUpdateInputWindowsNeeded = true;
2276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /* Updates the cached window information provided to the input dispatcher. */
2306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void updateInputWindowsLw(boolean force) {
2316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (!force && !mUpdateInputWindowsNeeded) {
2326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return;
2336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mUpdateInputWindowsNeeded = false;
2356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
236b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn        if (false) Slog.d(WindowManagerService.TAG, ">>>>>> ENTERED updateInputWindowsLw");
2379302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // Populate the input window list with information about all of the windows that
2396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // could potentially receive input.
2406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // As an optimization, we could try to prune the list of windows but this turns
2416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // out to be difficult because only the native code knows for sure which window
2426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // currently has touch focus.
243a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        final WindowStateAnimator universeBackground = mService.mAnimator.mUniverseBackground;
244a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        final int aboveUniverseLayer = mService.mAnimator.mAboveUniverseLayer;
245a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        boolean addedUniverse = 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();
286f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner                final boolean hasWallpaper = (child == mService.mWallpaperTarget)
287f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner                        && (type != WindowManager.LayoutParams.TYPE_KEYGUARD);
288f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner                final boolean onDefaultDisplay = (child.getDisplayId() == Display.DEFAULT_DISPLAY);
2896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
290f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner                // If there's a drag in progress and 'child' is a potential drop target,
291f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner                // make sure it's been told about the drag
292f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner                if (inDrag && isVisible && onDefaultDisplay) {
293f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner                    mService.mDragState.sendDragStartedIfNeededLw(child);
294f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner                }
2956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
296f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner                if (universeBackground != null && !addedUniverse
297f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner                        && child.mBaseLayer < aboveUniverseLayer && onDefaultDisplay) {
298f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner                    final WindowState u = universeBackground.mWin;
299f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner                    if (u.mInputChannel != null && u.mInputWindowHandle != null) {
300f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner                        addInputWindowHandleLw(u.mInputWindowHandle, u, u.mAttrs.flags,
30195c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski                                u.mAttrs.privateFlags, u.mAttrs.type,
30295c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski                                true, u == mInputFocus, false);
303f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner                    }
304f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner                    addedUniverse = true;
305a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                }
306e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn
307f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner                if (child.mWinAnimator != universeBackground) {
30895c42974f719d1fac90fc0438eac778e9795681fAdam Lesinski                    addInputWindowHandleLw(inputWindowHandle, child, flags, privateFlags, type,
309f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner                            isVisible, hasFocus, hasWallpaper);
310f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner                }
311a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            }
3126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // Send windows to native code.
3159302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        mService.mInputManager.setInputWindows(mInputWindowHandles);
3169302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
3176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // Clear the list in preparation for the next round.
3189302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        clearInputWindowHandlesLw();
3199302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
320b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn        if (false) Slog.d(WindowManagerService.TAG, "<<<<<<< EXITED updateInputWindowsLw");
3216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /* Notifies that the input device configuration has changed. */
3240b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown    @Override
3256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void notifyConfigurationChanged() {
3266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService.sendNewConfiguration();
3276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        synchronized (mInputDevicesReadyMonitor) {
3296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (!mInputDevicesReady) {
3306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mInputDevicesReady = true;
3316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mInputDevicesReadyMonitor.notifyAll();
3326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
3336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /* Waits until the built-in input devices have been configured. */
3376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean waitForInputDevicesReady(long timeoutMillis) {
3386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        synchronized (mInputDevicesReadyMonitor) {
3396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (!mInputDevicesReady) {
3406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                try {
3416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    mInputDevicesReadyMonitor.wait(timeoutMillis);
3426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                } catch (InterruptedException ex) {
3436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
3446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
3456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return mInputDevicesReady;
3466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /* Notifies that the lid switch changed state. */
3500b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown    @Override
3516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void notifyLidSwitchChanged(long whenNanos, boolean lidOpen) {
3526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService.mPolicy.notifyLidSwitchChanged(whenNanos, lidOpen);
3536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3545845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner
3556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /* Provides an opportunity for the window manager policy to intercept early key
3566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * processing as soon as the key has been read from the device. */
3570b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown    @Override
358037c33eae74bee2774897d969d48947f9abe254fJeff Brown    public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
359037c33eae74bee2774897d969d48947f9abe254fJeff Brown        return mService.mPolicy.interceptKeyBeforeQueueing(event, policyFlags);
3606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
36156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown
36256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    /* Provides an opportunity for the window manager policy to intercept early
36356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown     * motion event processing when the screen is off since these events are normally
36456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown     * dropped. */
3650b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown    @Override
366037c33eae74bee2774897d969d48947f9abe254fJeff Brown    public int interceptWakeMotionBeforeQueueing(long whenNanos, int policyFlags) {
367037c33eae74bee2774897d969d48947f9abe254fJeff Brown        return mService.mPolicy.interceptWakeMotionBeforeQueueing(whenNanos, policyFlags);
36856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    }
36956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown
3706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /* Provides an opportunity for the window manager policy to process a key before
3716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * ordinary dispatch. */
3720b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown    @Override
373905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    public long interceptKeyBeforeDispatching(
3746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            InputWindowHandle focus, KeyEvent event, int policyFlags) {
3756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        WindowState windowState = focus != null ? (WindowState) focus.windowState : null;
3766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mService.mPolicy.interceptKeyBeforeDispatching(windowState, event, policyFlags);
3776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3785845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner
3796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /* Provides an opportunity for the window manager policy to process a key that
3806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * the application did not handle. */
3810b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown    @Override
3826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public KeyEvent dispatchUnhandledKey(
3836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            InputWindowHandle focus, KeyEvent event, int policyFlags) {
3846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        WindowState windowState = focus != null ? (WindowState) focus.windowState : null;
3856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mService.mPolicy.dispatchUnhandledKey(windowState, event, policyFlags);
3866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3874532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown
3884532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    /* Callback to get pointer layer. */
3890b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown    @Override
3904532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    public int getPointerLayer() {
3914532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        return mService.mPolicy.windowTypeToLayerLw(WindowManager.LayoutParams.TYPE_POINTER)
3924532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown                * WindowManagerService.TYPE_LAYER_MULTIPLIER
3934532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown                + WindowManagerService.TYPE_LAYER_OFFSET;
3944532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    }
3954532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown
3966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /* Called when the current input focus changes.
3976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Layer assignment is assumed to be complete by the time this is called.
3986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
3996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void setInputFocusLw(WindowState newWindow, boolean updateInputWindows) {
4005845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner        if (WindowManagerService.DEBUG_FOCUS_LIGHT || WindowManagerService.DEBUG_INPUT) {
4016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            Slog.d(WindowManagerService.TAG, "Input focus has changed to " + newWindow);
4026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (newWindow != mInputFocus) {
4056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (newWindow != null && newWindow.canReceiveKeys()) {
4066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // Displaying a window implicitly causes dispatching to be unpaused.
4076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // This is to protect against bugs if someone pauses dispatching but
4086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // forgets to resume.
4096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                newWindow.mToken.paused = false;
4106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mInputFocus = newWindow;
4136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            setUpdateInputWindowsNeededLw();
4146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (updateInputWindows) {
4166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                updateInputWindowsLw(false /*force*/);
4176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4205845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner
4216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void setFocusedAppLw(AppWindowToken newApp) {
4226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // Focused app has changed.
4236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (newApp == null) {
4246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mInputManager.setFocusedApplication(null);
4256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } else {
4269302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            final InputApplicationHandle handle = newApp.mInputApplicationHandle;
4279302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            handle.name = newApp.toString();
4289302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            handle.dispatchingTimeoutNanos = newApp.inputDispatchingTimeoutNanos;
4296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4309302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mService.mInputManager.setFocusedApplication(handle);
4316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4335845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner
4346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void pauseDispatchingLw(WindowToken window) {
4356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (! window.paused) {
4366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (WindowManagerService.DEBUG_INPUT) {
4376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Slog.v(WindowManagerService.TAG, "Pausing WindowToken " + window);
4386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            window.paused = true;
4416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            updateInputWindowsLw(true /*force*/);
4426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void resumeDispatchingLw(WindowToken window) {
4466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (window.paused) {
4476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (WindowManagerService.DEBUG_INPUT) {
4486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Slog.v(WindowManagerService.TAG, "Resuming WindowToken " + window);
4496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            window.paused = false;
4526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            updateInputWindowsLw(true /*force*/);
4536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void freezeInputDispatchingLw() {
4576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (! mInputDispatchFrozen) {
4586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (WindowManagerService.DEBUG_INPUT) {
4596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Slog.v(WindowManagerService.TAG, "Freezing input dispatching");
4606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mInputDispatchFrozen = true;
4636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            updateInputDispatchModeLw();
4646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void thawInputDispatchingLw() {
4686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mInputDispatchFrozen) {
4696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (WindowManagerService.DEBUG_INPUT) {
4706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Slog.v(WindowManagerService.TAG, "Thawing input dispatching");
4716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mInputDispatchFrozen = false;
4746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            updateInputDispatchModeLw();
4756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void setEventDispatchingLw(boolean enabled) {
4796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mInputDispatchEnabled != enabled) {
4806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (WindowManagerService.DEBUG_INPUT) {
4816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Slog.v(WindowManagerService.TAG, "Setting event dispatching to " + enabled);
4826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mInputDispatchEnabled = enabled;
4856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            updateInputDispatchModeLw();
4866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    private void updateInputDispatchModeLw() {
4906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService.mInputManager.setInputDispatchMode(mInputDispatchEnabled, mInputDispatchFrozen);
4916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
492ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown}
493