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;
2283d616a9c7b9505153d258511eb5c16b552e268dJeff Brownimport com.android.server.wm.WindowManagerService.AllWindowsIterator;
234532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown
245fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackbornimport android.app.ActivityManagerNative;
256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.graphics.Rect;
266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.RemoteException;
276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.util.Log;
286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.util.Slog;
2983d616a9c7b9505153d258511eb5c16b552e268dJeff Brownimport android.view.Display;
30cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brownimport android.view.InputChannel;
316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.KeyEvent;
326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.WindowManager;
336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport java.util.ArrayList;
359302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownimport java.util.Arrays;
366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
37a9d131c30878cacdaeacb4f43a82a7cc5b872453Jeff Brownfinal class InputMonitor implements InputManagerService.WindowManagerCallbacks {
386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    private final WindowManagerService mService;
396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Current window with input focus for keys and other non-touch events.  May be null.
416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    private WindowState mInputFocus;
426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // When true, prevents input dispatch from proceeding until set to false again.
446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    private boolean mInputDispatchFrozen;
456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // When true, input dispatch proceeds normally.  Otherwise all events are dropped.
47c042ee2acd8529b95c5dc99240d626e61d2500cdJeff Brown    // Initially false, so that input does not get dispatched until boot is finished at
48c042ee2acd8529b95c5dc99240d626e61d2500cdJeff Brown    // which point the ActivityManager will enable dispatching.
49c042ee2acd8529b95c5dc99240d626e61d2500cdJeff Brown    private boolean mInputDispatchEnabled;
506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // When true, need to call updateInputWindowsLw().
526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    private boolean mUpdateInputWindowsNeeded = true;
536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
549302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    // Array of window handles to provide to the input dispatcher.
559302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    private InputWindowHandle[] mInputWindowHandles;
569302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    private int mInputWindowHandleCount;
579302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Set to true when the first input device configuration change notification
596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // is received to indicate that the input devices are ready.
606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    private final Object mInputDevicesReadyMonitor = new Object();
616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    private boolean mInputDevicesReady;
626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
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     */
716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void notifyInputChannelBroken(InputWindowHandle inputWindowHandle) {
726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (inputWindowHandle == null) {
736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return;
746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        synchronized (mService.mWindowMap) {
776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            WindowState windowState = (WindowState) inputWindowHandle.windowState;
789302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (windowState != null) {
799302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                Slog.i(WindowManagerService.TAG, "WINDOW DIED " + windowState);
809302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                mService.removeWindowLocked(windowState.mSession, windowState);
819302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            }
826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /* Notifies the window manager about an application that is not responding.
866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Returns a new timeout to continue waiting in nanoseconds, or 0 to abort dispatch.
876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     *
886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Called by the InputManager.
896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public long notifyANR(InputApplicationHandle inputApplicationHandle,
916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            InputWindowHandle inputWindowHandle) {
926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        AppWindowToken appWindowToken = null;
935fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn        WindowState windowState = null;
945fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn        boolean aboveSystem = false;
95ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown        synchronized (mService.mWindowMap) {
96ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown            if (inputWindowHandle != null) {
97ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown                windowState = (WindowState) inputWindowHandle.windowState;
986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                if (windowState != null) {
996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    appWindowToken = windowState.mAppToken;
1006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
1016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
102ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown            if (appWindowToken == null && inputApplicationHandle != null) {
103ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown                appWindowToken = (AppWindowToken)inputApplicationHandle.appWindowToken;
104ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown            }
105ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown
106ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown            if (windowState != null) {
107ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown                Slog.i(WindowManagerService.TAG, "Input event dispatching timed out "
108ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown                        + "sending to " + windowState.mAttrs.getTitle());
1095fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                // Figure out whether this window is layered above system windows.
1105fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                // We need to do this here to help the activity manager know how to
1115fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                // layer its ANR dialog.
1125fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                int systemAlertLayer = mService.mPolicy.windowTypeToLayerLw(
1135fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                        WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
1145fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                aboveSystem = windowState.mBaseLayer > systemAlertLayer;
115ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown            } else if (appWindowToken != null) {
116ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown                Slog.i(WindowManagerService.TAG, "Input event dispatching timed out "
117ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown                        + "sending to application " + appWindowToken.stringName);
118ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown            } else {
119ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown                Slog.i(WindowManagerService.TAG, "Input event dispatching timed out.");
1209302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            }
121ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown
122ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown            mService.saveANRStateLocked(appWindowToken, windowState);
1236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (appWindowToken != null && appWindowToken.appToken != null) {
1266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            try {
1276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // Notify the activity manager about the timeout and let it decide whether
1286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // to abort dispatching or keep waiting.
1296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                boolean abort = appWindowToken.appToken.keyDispatchingTimedOut();
1306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                if (! abort) {
1316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    // The activity manager declined to abort dispatching.
1326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    // Wait a bit longer and timeout again later.
1336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    return appWindowToken.inputDispatchingTimeoutNanos;
1346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
1356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            } catch (RemoteException ex) {
1366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
1375fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn        } else if (windowState != null) {
1385fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn            try {
1395fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                // Notify the activity manager about the timeout and let it decide whether
1405fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                // to abort dispatching or keep waiting.
1415fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                long timeout = ActivityManagerNative.getDefault().inputDispatchingTimedOut(
1425fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                        windowState.mSession.mPid, aboveSystem);
1435fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                if (timeout >= 0) {
1445fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                    // The activity manager declined to abort dispatching.
1455fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                    // Wait a bit longer and timeout again later.
1465fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                    return timeout;
1475fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                }
1485fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn            } catch (RemoteException ex) {
1495fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn            }
1506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return 0; // abort dispatching
1526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
154a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn    private void addInputWindowHandleLw(final InputWindowHandle windowHandle) {
1559302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (mInputWindowHandles == null) {
1569302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mInputWindowHandles = new InputWindowHandle[16];
1579302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        }
1589302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (mInputWindowHandleCount >= mInputWindowHandles.length) {
1599302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mInputWindowHandles = Arrays.copyOf(mInputWindowHandles,
1609302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    mInputWindowHandleCount * 2);
1619302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        }
1629302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        mInputWindowHandles[mInputWindowHandleCount++] = windowHandle;
1639302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    }
1649302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
165a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn    private void addInputWindowHandleLw(final InputWindowHandle inputWindowHandle,
166a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            final WindowState child, final int flags, final int type,
167a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            final boolean isVisible, final boolean hasFocus, final boolean hasWallpaper) {
168a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        // Add a window to our list of input windows.
169a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.name = child.toString();
170a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.layoutParamsFlags = flags;
171a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.layoutParamsType = type;
172a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.dispatchingTimeoutNanos = child.getInputDispatchingTimeoutNanos();
173a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.visible = isVisible;
174a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.canReceiveKeys = child.canReceiveKeys();
175a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.hasFocus = hasFocus;
176a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.hasWallpaper = hasWallpaper;
177a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.paused = child.mAppToken != null ? child.mAppToken.paused : false;
178a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.layer = child.mLayer;
179a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.ownerPid = child.mSession.mPid;
180a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.ownerUid = child.mSession.mUid;
181a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.inputFeatures = child.mAttrs.inputFeatures;
182a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn
183a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        final Rect frame = child.mFrame;
184a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.frameLeft = frame.left;
185a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.frameTop = frame.top;
186a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.frameRight = frame.right;
187a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        inputWindowHandle.frameBottom = frame.bottom;
188a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn
189a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        if (child.mGlobalScale != 1) {
190a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            // If we are scaling the window, input coordinates need
191a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            // to be inversely scaled to map from what is on screen
192a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            // to what is actually being touched in the UI.
193a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            inputWindowHandle.scaleFactor = 1.0f/child.mGlobalScale;
194a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        } else {
195a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            inputWindowHandle.scaleFactor = 1;
196a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        }
197a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn
198a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        child.getTouchableRegion(inputWindowHandle.touchableRegion);
199a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn
200a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        addInputWindowHandleLw(inputWindowHandle);
201a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn    }
202a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn
2039302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    private void clearInputWindowHandlesLw() {
2049302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        while (mInputWindowHandleCount != 0) {
2059302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mInputWindowHandles[--mInputWindowHandleCount] = null;
2069302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        }
2076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void setUpdateInputWindowsNeededLw() {
2106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mUpdateInputWindowsNeeded = true;
2116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /* Updates the cached window information provided to the input dispatcher. */
2146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void updateInputWindowsLw(boolean force) {
2156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (!force && !mUpdateInputWindowsNeeded) {
2166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return;
2176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mUpdateInputWindowsNeeded = false;
2196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
220b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn        if (false) Slog.d(WindowManagerService.TAG, ">>>>>> ENTERED updateInputWindowsLw");
2219302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // Populate the input window list with information about all of the windows that
2236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // could potentially receive input.
2246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // As an optimization, we could try to prune the list of windows but this turns
2256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // out to be difficult because only the native code knows for sure which window
2266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // currently has touch focus.
227a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        final WindowStateAnimator universeBackground = mService.mAnimator.mUniverseBackground;
228a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        final int aboveUniverseLayer = mService.mAnimator.mAboveUniverseLayer;
229a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn        boolean addedUniverse = false;
2306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // If there's a drag in flight, provide a pseudowindow to catch drag input
2326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final boolean inDrag = (mService.mDragState != null);
2336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (inDrag) {
2346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (WindowManagerService.DEBUG_DRAG) {
2356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Log.d(WindowManagerService.TAG, "Inserting drag window");
2366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
237cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            final InputWindowHandle dragWindowHandle = mService.mDragState.mDragWindowHandle;
238cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            if (dragWindowHandle != null) {
239cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                addInputWindowHandleLw(dragWindowHandle);
240cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            } else {
241cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                Slog.w(WindowManagerService.TAG, "Drag is in progress but there is no "
242cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        + "drag window handle.");
243cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            }
2446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
246df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn        final int NFW = mService.mFakeWindows.size();
247df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn        for (int i = 0; i < NFW; i++) {
248df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            addInputWindowHandleLw(mService.mFakeWindows.get(i).mWindowHandle);
249df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn        }
250df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn
25183d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        // Add all windows on the default display.
25283d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        final AllWindowsIterator iterator = mService.new AllWindowsIterator(
25383d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                WindowManagerService.REVERSE_ITERATOR);
25483d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        while (iterator.hasNext()) {
25583d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            final WindowState child = iterator.next();
256cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            final InputChannel inputChannel = child.mInputChannel;
257cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            final InputWindowHandle inputWindowHandle = child.mInputWindowHandle;
258cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            if (inputChannel == null || inputWindowHandle == null || child.mRemoved) {
2596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // Skip this window because it cannot possibly receive input.
2606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                continue;
2616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
2626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            final int flags = child.mAttrs.flags;
2646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            final int type = child.mAttrs.type;
2656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            final boolean hasFocus = (child == mInputFocus);
2676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            final boolean isVisible = child.isVisibleLw();
2686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            final boolean hasWallpaper = (child == mService.mWallpaperTarget)
2696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    && (type != WindowManager.LayoutParams.TYPE_KEYGUARD);
27083d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            final boolean onDefaultDisplay = (child.getDisplayId() == Display.DEFAULT_DISPLAY);
2716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // If there's a drag in progress and 'child' is a potential drop target,
2736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // make sure it's been told about the drag
27483d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            if (inDrag && isVisible && onDefaultDisplay) {
2756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mService.mDragState.sendDragStartedIfNeededLw(child);
2766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
2776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
278a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            if (universeBackground != null && !addedUniverse
27983d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                    && child.mBaseLayer < aboveUniverseLayer && onDefaultDisplay) {
280a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                final WindowState u = universeBackground.mWin;
281a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                if (u.mInputChannel != null && u.mInputWindowHandle != null) {
282a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                    addInputWindowHandleLw(u.mInputWindowHandle, u, u.mAttrs.flags,
283a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                            u.mAttrs.type, true, u == mInputFocus, false);
284a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                }
285a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                addedUniverse = true;
286e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            }
287e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn
288a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            if (child.mWinAnimator != universeBackground) {
289a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                addInputWindowHandleLw(inputWindowHandle, child, flags, type,
290a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                        isVisible, hasFocus, hasWallpaper);
291a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            }
2926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // Send windows to native code.
2959302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        mService.mInputManager.setInputWindows(mInputWindowHandles);
2969302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // Clear the list in preparation for the next round.
2989302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        clearInputWindowHandlesLw();
2999302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
300b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn        if (false) Slog.d(WindowManagerService.TAG, "<<<<<<< EXITED updateInputWindowsLw");
3016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /* Notifies that the input device configuration has changed. */
3046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void notifyConfigurationChanged() {
3056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService.sendNewConfiguration();
3066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        synchronized (mInputDevicesReadyMonitor) {
3086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (!mInputDevicesReady) {
3096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mInputDevicesReady = true;
3106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                mInputDevicesReadyMonitor.notifyAll();
3116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
3126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /* Waits until the built-in input devices have been configured. */
3166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public boolean waitForInputDevicesReady(long timeoutMillis) {
3176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        synchronized (mInputDevicesReadyMonitor) {
3186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (!mInputDevicesReady) {
3196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                try {
3206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    mInputDevicesReadyMonitor.wait(timeoutMillis);
3216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                } catch (InterruptedException ex) {
3226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
3236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
3246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return mInputDevicesReady;
3256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /* Notifies that the lid switch changed state. */
3296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void notifyLidSwitchChanged(long whenNanos, boolean lidOpen) {
3306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService.mPolicy.notifyLidSwitchChanged(whenNanos, lidOpen);
3316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /* Provides an opportunity for the window manager policy to intercept early key
3346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * processing as soon as the key has been read from the device. */
3356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public int interceptKeyBeforeQueueing(
3366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            KeyEvent event, int policyFlags, boolean isScreenOn) {
3376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mService.mPolicy.interceptKeyBeforeQueueing(event, policyFlags, isScreenOn);
3386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
33956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown
34056194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    /* Provides an opportunity for the window manager policy to intercept early
34156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown     * motion event processing when the screen is off since these events are normally
34256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown     * dropped. */
34356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    public int interceptMotionBeforeQueueingWhenScreenOff(int policyFlags) {
34456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown        return mService.mPolicy.interceptMotionBeforeQueueingWhenScreenOff(policyFlags);
34556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    }
34656194ebec6212e229f4ccdaa4b187166d20013efJeff Brown
3476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /* Provides an opportunity for the window manager policy to process a key before
3486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * ordinary dispatch. */
349905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    public long interceptKeyBeforeDispatching(
3506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            InputWindowHandle focus, KeyEvent event, int policyFlags) {
3516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        WindowState windowState = focus != null ? (WindowState) focus.windowState : null;
3526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mService.mPolicy.interceptKeyBeforeDispatching(windowState, event, policyFlags);
3536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /* Provides an opportunity for the window manager policy to process a key that
3566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * the application did not handle. */
3576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public KeyEvent dispatchUnhandledKey(
3586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            InputWindowHandle focus, KeyEvent event, int policyFlags) {
3596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        WindowState windowState = focus != null ? (WindowState) focus.windowState : null;
3606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return mService.mPolicy.dispatchUnhandledKey(windowState, event, policyFlags);
3616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3624532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown
3634532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    /* Callback to get pointer layer. */
3644532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    public int getPointerLayer() {
3654532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        return mService.mPolicy.windowTypeToLayerLw(WindowManager.LayoutParams.TYPE_POINTER)
3664532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown                * WindowManagerService.TYPE_LAYER_MULTIPLIER
3674532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown                + WindowManagerService.TYPE_LAYER_OFFSET;
3684532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    }
3694532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown
3706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    /* Called when the current input focus changes.
3716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     * Layer assignment is assumed to be complete by the time this is called.
3726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn     */
3736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void setInputFocusLw(WindowState newWindow, boolean updateInputWindows) {
3746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (WindowManagerService.DEBUG_INPUT) {
3756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            Slog.d(WindowManagerService.TAG, "Input focus has changed to " + newWindow);
3766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (newWindow != mInputFocus) {
3796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (newWindow != null && newWindow.canReceiveKeys()) {
3806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // Displaying a window implicitly causes dispatching to be unpaused.
3816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // This is to protect against bugs if someone pauses dispatching but
3826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // forgets to resume.
3836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                newWindow.mToken.paused = false;
3846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
3856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mInputFocus = newWindow;
3876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            setUpdateInputWindowsNeededLw();
3886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (updateInputWindows) {
3906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                updateInputWindowsLw(false /*force*/);
3916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
3926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void setFocusedAppLw(AppWindowToken newApp) {
3966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        // Focused app has changed.
3976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (newApp == null) {
3986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mService.mInputManager.setFocusedApplication(null);
3996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } else {
4009302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            final InputApplicationHandle handle = newApp.mInputApplicationHandle;
4019302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            handle.name = newApp.toString();
4029302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            handle.dispatchingTimeoutNanos = newApp.inputDispatchingTimeoutNanos;
4036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4049302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            mService.mInputManager.setFocusedApplication(handle);
4056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void pauseDispatchingLw(WindowToken window) {
4096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (! window.paused) {
4106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (WindowManagerService.DEBUG_INPUT) {
4116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Slog.v(WindowManagerService.TAG, "Pausing WindowToken " + window);
4126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            window.paused = true;
4156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            updateInputWindowsLw(true /*force*/);
4166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void resumeDispatchingLw(WindowToken window) {
4206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (window.paused) {
4216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (WindowManagerService.DEBUG_INPUT) {
4226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Slog.v(WindowManagerService.TAG, "Resuming WindowToken " + window);
4236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            window.paused = false;
4266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            updateInputWindowsLw(true /*force*/);
4276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void freezeInputDispatchingLw() {
4316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (! mInputDispatchFrozen) {
4326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (WindowManagerService.DEBUG_INPUT) {
4336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Slog.v(WindowManagerService.TAG, "Freezing input dispatching");
4346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mInputDispatchFrozen = true;
4376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            updateInputDispatchModeLw();
4386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void thawInputDispatchingLw() {
4426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mInputDispatchFrozen) {
4436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (WindowManagerService.DEBUG_INPUT) {
4446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Slog.v(WindowManagerService.TAG, "Thawing input dispatching");
4456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mInputDispatchFrozen = false;
4486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            updateInputDispatchModeLw();
4496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void setEventDispatchingLw(boolean enabled) {
4536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (mInputDispatchEnabled != enabled) {
4546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (WindowManagerService.DEBUG_INPUT) {
4556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Slog.v(WindowManagerService.TAG, "Setting event dispatching to " + enabled);
4566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mInputDispatchEnabled = enabled;
4596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            updateInputDispatchModeLw();
4606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    private void updateInputDispatchModeLw() {
4646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mService.mInputManager.setInputDispatchMode(mInputDispatchEnabled, mInputDispatchFrozen);
4656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
466ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown}
467