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