WindowManagerService.java revision e99adc70c8e0a64cb8d13a2ec4c125adaf18904d
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackbornpackage com.android.server.wm;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FLAG_BLUR_BEHIND;
225fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackbornimport static android.view.WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG;
344c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.app.IBatteryStats;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.policy.PolicyManager;
38b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackbornimport com.android.internal.policy.impl.PhoneWindowManager;
39a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tateimport com.android.internal.view.BaseInputHandler;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.view.IInputContext;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.view.IInputMethodClient;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.view.IInputMethodManager;
43ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackbornimport com.android.internal.view.WindowManagerPolicyThread;
44a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackbornimport com.android.server.AttributeCache;
45a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackbornimport com.android.server.EventLogTags;
46a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackbornimport com.android.server.PowerManagerService;
47a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackbornimport com.android.server.Watchdog;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.server.am.BatteryStatsService;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.Manifest;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.ActivityManagerNative;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.IActivityManager;
53ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onoratoimport android.app.StatusBarManager;
54d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Millerimport android.app.admin.DevicePolicyManager;
55284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Millerimport android.content.BroadcastReceiver;
56a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackbornimport android.content.ComponentName;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
58284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Millerimport android.content.Intent;
59284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Millerimport android.content.IntentFilter;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ActivityInfo;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager;
621ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshimaimport android.content.res.CompatibilityInfo;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Configuration;
640aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackbornimport android.graphics.Bitmap;
65fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackbornimport android.graphics.Canvas;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Matrix;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PixelFormat;
6844bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackbornimport android.graphics.Point;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Region;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.BatteryStats;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
737580493b014a2c7ea883cd291255798dc72ebbffDianne Hackbornimport android.os.Bundle;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Debug;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.LocalPowerManager;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Looper;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFileDescriptor;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Power;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PowerManager;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
87ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrickimport android.os.StrictMode;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemProperties;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.TokenWatcher;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Settings;
92723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackbornimport android.util.DisplayMetrics;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.EventLog;
94d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Millerimport android.util.Log;
958a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseIntArray;
97fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackbornimport android.util.TypedValue;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Display;
99dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powellimport android.view.Gravity;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IApplicationToken;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IOnKeyguardExitResult;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IRotationWatcher;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindow;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindowManager;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindowSession;
10646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport android.view.InputChannel;
107c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brownimport android.view.InputDevice;
108bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brownimport android.view.InputEvent;
109a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tateimport android.view.InputHandler;
110a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tateimport android.view.InputQueue;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Surface;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SurfaceSession;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerImpl;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerPolicy;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager.LayoutParams;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Animation;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.AnimationUtils;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Transformation;
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.BufferedWriter;
125b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackbornimport java.io.DataInputStream;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
128b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackbornimport java.io.FileInputStream;
129b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackbornimport java.io.FileNotFoundException;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStream;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStreamWriter;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.StringWriter;
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.Socket;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashSet;
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator;
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List;
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** {@hide} */
143ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackbornpublic class WindowManagerService extends IWindowManager.Stub
14400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        implements Watchdog.Monitor {
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final String TAG = "WindowManager";
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG = false;
147f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn    static final boolean DEBUG_ADD_REMOVE = false;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_FOCUS = false;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_ANIM = false;
1509b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn    static final boolean DEBUG_LAYOUT = false;
151ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn    static final boolean DEBUG_RESIZE = false;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_LAYERS = false;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_INPUT = false;
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_INPUT_METHOD = false;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_VISIBILITY = false;
156bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn    static final boolean DEBUG_WINDOW_MOVEMENT = false;
157f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn    static final boolean DEBUG_TOKEN_MOVEMENT = false;
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_ORIENTATION = false;
159bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn    static final boolean DEBUG_APP_ORIENTATION = false;
160694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn    static final boolean DEBUG_CONFIGURATION = false;
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_APP_TRANSITIONS = false;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_STARTING_WINDOW = false;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_REORDER = false;
1647341d7a104b47996445d069a695e155a07184606Dianne Hackborn    static final boolean DEBUG_WALLPAPER = false;
165994ef9296a00523de1df424b4b760b4416ead58bChristopher Tate    static final boolean DEBUG_DRAG = false;
1665fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    static final boolean SHOW_SURFACE_ALLOC = false;
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean SHOW_TRANSACTIONS = false;
1689bfb707597898f54722460b48588007b682f3e2aDianne Hackborn    static final boolean HIDE_STACK_CRAWLS = true;
16953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean PROFILE_ORIENTATION = false;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean BLUR = true;
172cfe6524071624b6679e5fa4db847328e8d0317c8Dave Bort    static final boolean localLOGV = DEBUG;
17306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** How much to multiply the policy's type layer, to reserve room
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for multiple windows of the same type and Z-ordering adjustment
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with TYPE_LAYER_OFFSET. */
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int TYPE_LAYER_MULTIPLIER = 10000;
17806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Offset from TYPE_LAYER_MULTIPLIER for moving a group of windows above
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or below others in the same layer. */
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int TYPE_LAYER_OFFSET = 1000;
18206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** How much to increment the layer for each window, to reserve room
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for effect surfaces between them.
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int WINDOW_LAYER_MULTIPLIER = 5;
18706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
188de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn    /**
189de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn     * Dim surface layer is immediately below target window.
190de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn     */
191de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn    static final int LAYER_OFFSET_DIM = 1;
192de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn
193de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn    /**
194de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn     * Blur surface layer is immediately below dim layer.
195de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn     */
196de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn    static final int LAYER_OFFSET_BLUR = 2;
197de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn
1987916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    /**
1997916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn     * Layer at which to put the rotation freeze snapshot.
2007916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn     */
2017916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    static final int FREEZE_LAYER = (TYPE_LAYER_MULTIPLIER * 200) + 1;
2027916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
2037916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    /**
2047916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn     * Layer at which to put the mask for emulated screen sizes.
2057916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn     */
2067916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    static final int MASK_LAYER = TYPE_LAYER_MULTIPLIER * 200;
2077916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** The maximum length we will accept for a loaded animation duration:
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this is 10 seconds.
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int MAX_ANIMATION_DURATION = 10*1000;
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Amount of time (in milliseconds) to animate the dim surface from one
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value to another, when no window animation is driving it.
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int DEFAULT_DIM_DURATION = 200;
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2180a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima    /** Amount of time (in milliseconds) to animate the fade-in-out transition for
2190a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima     * compatible windows.
2200a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima     */
2210a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima    static final int DEFAULT_FADE_IN_OUT_DURATION = 400;
2220a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima
223a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn    /**
224a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * If true, the window manager will do its own custom freezing and general
225a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * management of the screen during rotation.
226a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     */
227a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn    static final boolean CUSTOM_SCREEN_ROTATION = true;
228a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn
2297fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    // Maximum number of milliseconds to wait for input event injection.
2307fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    // FIXME is this value reasonable?
2317fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    private static final int INJECTION_TIMEOUT_MILLIS = 30 * 1000;
232b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown
233b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown    // Maximum number of milliseconds to wait for input devices to be enumerated before
234b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown    // proceding with safe mode detection.
235b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown    private static final int INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS = 1000;
23628637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller
237349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    // Default input dispatching timeout in nanoseconds.
2386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    static final long DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS = 5000 * 1000000L;
23906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int UPDATE_FOCUS_NORMAL = 0;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int UPDATE_FOCUS_WILL_ASSIGN_LAYERS = 1;
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int UPDATE_FOCUS_PLACING_SURFACES = 2;
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int UPDATE_FOCUS_WILL_PLACE_SURFACES = 3;
24406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String SYSTEM_SECURE = "ro.secure";
24606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy    private static final String SYSTEM_DEBUGGABLE = "ro.debuggable";
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Condition waited on by {@link #reenableKeyguard} to know the call to
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the window policy has finished.
251983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood     * This is set to true only if mKeyguardTokenWatcher.acquired() has
252983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood     * actually disabled the keyguard.
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
254983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood    private boolean mKeyguardDisabled = false;
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
256284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    private static final int ALLOW_DISABLE_YES = 1;
257284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    private static final int ALLOW_DISABLE_NO = 0;
258284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    private static final int ALLOW_DISABLE_UNKNOWN = -1; // check with DevicePolicyManager
259284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    private int mAllowDisableKeyguard = ALLOW_DISABLE_UNKNOWN; // sync'd by mKeyguardTokenWatcher
260284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller
261983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood    final TokenWatcher mKeyguardTokenWatcher = new TokenWatcher(
262983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood            new Handler(), "WindowManagerService.mKeyguardTokenWatcher") {
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void acquired() {
264284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            if (shouldAllowDisableKeyguard()) {
265284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                mPolicy.enableKeyguard(false);
266284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                mKeyguardDisabled = true;
267284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            } else {
268284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                Log.v(TAG, "Not disabling keyguard since device policy is enforced");
269284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            }
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void released() {
272a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn            mPolicy.enableKeyguard(true);
273983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood            synchronized (mKeyguardTokenWatcher) {
274983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood                mKeyguardDisabled = false;
275983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood                mKeyguardTokenWatcher.notifyAll();
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
280284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
281284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        @Override
282284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        public void onReceive(Context context, Intent intent) {
283284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            mPolicy.enableKeyguard(true);
284284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            synchronized(mKeyguardTokenWatcher) {
285284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // lazily evaluate this next time we're asked to disable keyguard
286284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                mAllowDisableKeyguard = ALLOW_DISABLE_UNKNOWN;
287284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                mKeyguardDisabled = false;
288284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            }
289284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        }
290284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    };
291284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Context mContext;
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final boolean mHaveInputMethods;
29506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final boolean mLimitedAlphaCompositing;
29706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final WindowManagerPolicy mPolicy = PolicyManager.makeNewWindowManager();
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final IActivityManager mActivityManager;
30106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final IBatteryStats mBatteryStats;
30306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * All currently active sessions with clients.
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final HashSet<Session> mSessions = new HashSet<Session>();
30806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Mapping from an IWindow IBinder to the server's Window object.
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is also used as the lock for all of our state.
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final HashMap<IBinder, WindowState> mWindowMap = new HashMap<IBinder, WindowState>();
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Mapping from a token IBinder to a WindowToken object.
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final HashMap<IBinder, WindowToken> mTokenMap =
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            new HashMap<IBinder, WindowToken>();
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Window tokens that are in the process of exiting, but still
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on screen for animations.
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<WindowToken> mExitingTokens = new ArrayList<WindowToken>();
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Z-ordered (bottom-most first) list of all application tokens, for
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * controlling the ordering of windows in different applications.  This
330f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn     * contains AppWindowToken objects.
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<AppWindowToken> mAppTokens = new ArrayList<AppWindowToken>();
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Application tokens that are in the process of exiting, but still
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on screen for animations.
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<AppWindowToken> mExitingAppTokens = new ArrayList<AppWindowToken>();
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * List of window tokens that have finished starting their application,
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and now need to have the policy remove their windows.
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<AppWindowToken> mFinishedStarting = new ArrayList<AppWindowToken>();
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Z-ordered (bottom-most first) list of all Window objects.
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
349e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    final ArrayList<WindowState> mWindows = new ArrayList<WindowState>();
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Windows that are being resized.  Used so we can tell the client about
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the resize after closing the transaction in which we resized the
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * underlying surface.
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<WindowState> mResizingWindows = new ArrayList<WindowState>();
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Windows whose animations have ended and now must be removed.
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<WindowState> mPendingRemove = new ArrayList<WindowState>();
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
364f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn     * Used when processing mPendingRemove to avoid working on the original array.
365f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn     */
366f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn    WindowState[] mPendingRemoveTmp = new WindowState[20];
367f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn
368f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn    /**
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Windows whose surface should be destroyed.
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<WindowState> mDestroySurface = new ArrayList<WindowState>();
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Windows that have lost input focus and are waiting for the new
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focus window to be displayed before they are told about this.
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ArrayList<WindowState> mLosingFocus = new ArrayList<WindowState>();
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is set when we have run out of memory, and will either be an empty
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * list or contain windows that need to be force removed.
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ArrayList<WindowState> mForceRemoves;
38406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
385f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn    /**
386f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn     * Used when rebuilding window list to keep track of windows that have
387f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn     * been removed.
388f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn     */
389f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn    WindowState[] mRebuildTmp = new WindowState[20];
390f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    IInputMethodManager mInputMethodManager;
39206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SurfaceSession mFxSession;
3940a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima    private DimAnimator mDimAnimator = null;
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Surface mBlurSurface;
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mBlurShown;
397fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn    Watermark mWatermark;
3986804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    StrictModeFlash mStrictModeFlash;
399a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn    ScreenRotationAnimation mScreenRotationAnimation;
40006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4017916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    BlackFrame mBlackFrame;
4027916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mTransactionSequence = 0;
40406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final float[] mTmpFloats = new float[9];
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mSafeMode;
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mDisplayEnabled = false;
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mSystemBooted = false;
410b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate    int mInitialDisplayWidth = 0;
411b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate    int mInitialDisplayHeight = 0;
4127916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    int mBaseDisplayWidth = 0;
4137916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    int mBaseDisplayHeight = 0;
41444bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn    int mCurDisplayWidth = 0;
41544bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn    int mCurDisplayHeight = 0;
41681e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn    int mAppDisplayWidth = 0;
41781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn    int mAppDisplayHeight = 0;
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mRotation = 0;
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mRequestedRotation = 0;
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mForcedAppOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
421dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn    boolean mAltOrientation = false;
422321ae681cad03d00ad1efc6f06f74268e00172a9Dianne Hackborn    int mLastRotationFlags;
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ArrayList<IRotationWatcher> mRotationWatchers
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new ArrayList<IRotationWatcher>();
42589ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn    int mDeferredRotation;
42689ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn    int mDeferredRotationAnimFlags;
42706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mLayoutNeeded = true;
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAnimationPending = false;
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mDisplayFrozen = false;
431e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    boolean mWaitingForConfig = false;
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mWindowsFreezingScreen = false;
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mAppsFreezingScreen = 0;
434bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn    int mLastWindowForcedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
436e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    int mLayoutSeq = 0;
437e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
438b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn    // State while inside of layoutAndPlaceSurfacesLocked().
439b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn    boolean mFocusMayChange;
440b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn
441e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    Configuration mCurConfiguration = new Configuration();
442e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // This is held as long as we have the screen frozen, to give us time to
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // perform a rotation animation when turning off shows the lock screen which
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // changes the orientation.
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PowerManager.WakeLock mScreenFrozenLock;
44706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // State management of app transitions.  When we are preparing for a
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // transition, mNextAppTransition will be the kind of transition to
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // perform or TRANSIT_NONE if we are not waiting.  If we are waiting,
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // mOpeningApps and mClosingApps are the lists of tokens that will be
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // made visible or hidden at the next transition.
453bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn    int mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET;
4543b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    String mNextAppTransitionPackage;
4553b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    int mNextAppTransitionEnter;
4563b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    int mNextAppTransitionExit;
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAppTransitionReady = false;
458a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    boolean mAppTransitionRunning = false;
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAppTransitionTimeout = false;
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mStartingIconInTransition = false;
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mSkipAppTransitionAnimation = false;
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<AppWindowToken> mOpeningApps = new ArrayList<AppWindowToken>();
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<AppWindowToken> mClosingApps = new ArrayList<AppWindowToken>();
464a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    final ArrayList<AppWindowToken> mToTopApps = new ArrayList<AppWindowToken>();
465a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    final ArrayList<AppWindowToken> mToBottomApps = new ArrayList<AppWindowToken>();
46606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Display mDisplay;
46806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4695fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    final DisplayMetrics mDisplayMetrics = new DisplayMetrics();
470bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    final DisplayMetrics mRealDisplayMetrics = new DisplayMetrics();
47148a7651823030ed3c0f4c084b423430044425feaDianne Hackborn    final DisplayMetrics mTmpDisplayMetrics = new DisplayMetrics();
4725fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    final DisplayMetrics mCompatDisplayMetrics = new DisplayMetrics();
4735fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    H mH = new H();
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    WindowState mCurrentFocus = null;
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    WindowState mLastFocus = null;
47806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // This just indicates the window the input method is on top of, not
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // necessarily the window its input is going to.
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    WindowState mInputMethodTarget = null;
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mInputMethodTargetWaitingAnim;
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mInputMethodAnimLayerAdjustment;
48406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    WindowState mInputMethodWindow = null;
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<WindowState> mInputMethodDialogs = new ArrayList<WindowState>();
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4882992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    boolean mHardKeyboardAvailable;
4892992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    boolean mHardKeyboardEnabled;
4902992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    OnHardKeyboardStatusChangeListener mHardKeyboardStatusChangeListener;
4912992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
4924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    final ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>();
493ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
494759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn    // If non-null, this is the currently visible window that is associated
495759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn    // with the wallpaper.
496759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn    WindowState mWallpaperTarget = null;
4973be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    // If non-null, we are in the middle of animating from one wallpaper target
4983be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    // to another, and this is the lower one in Z-order.
4993be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    WindowState mLowerWallpaperTarget = null;
5003be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    // If non-null, we are in the middle of animating from one wallpaper target
5013be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    // to another, and this is the higher one in Z-order.
5023be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    WindowState mUpperWallpaperTarget = null;
5036c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn    // Window currently running an animation that has requested it be detached
5046c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn    // from the wallpaper.  This means we need to ensure the wallpaper is
5056c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn    // visible behind it in case it animates in a way that would allow it to be
5066c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn    // seen.
5076c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn    WindowState mWindowDetachedWallpaper = null;
508de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn    DimSurface mWindowAnimationBackgroundSurface = null;
509759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn    int mWallpaperAnimLayerAdjustment;
51073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn    float mLastWallpaperX = -1;
51173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn    float mLastWallpaperY = -1;
512bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen    float mLastWallpaperXStep = -1;
513bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen    float mLastWallpaperYStep = -1;
51419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    // This is set when we are waiting for a wallpaper to tell us it is done
51519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    // changing its scroll position.
51619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    WindowState mWaitingOnWallpaper;
51719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    // The last time we had a timeout when waiting for a wallpaper.
51819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    long mLastWallpaperTimeoutTime;
51919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    // We give a wallpaper up to 150ms to finish scrolling.
52019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    static final long WALLPAPER_TIMEOUT = 150;
52119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    // Time we wait after a timeout before trying to wait again.
52219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    static final long WALLPAPER_TIMEOUT_RECOVERY = 10000;
523ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AppWindowToken mFocusedApp = null;
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PowerManagerService mPowerManager;
52706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float mWindowAnimationScale = 1.0f;
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float mTransitionAnimationScale = 1.0f;
53006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
53146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    final InputManager mInputManager;
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Who is holding the screen on.
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Session mHoldingScreenOn;
53546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    PowerManager.WakeLock mHoldingScreenWakeLock;
53606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
53793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    boolean mTurnOnScreen;
538ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
539a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    DragState mDragState = null;
5406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final InputHandler mDragInputHandler = new BaseInputHandler() {
541a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        @Override
5423915bb845b032dc184dba5e60970b803390ca3edJeff Brown        public void handleMotion(MotionEvent event, InputQueue.FinishedCallback finishedCallback) {
5433915bb845b032dc184dba5e60970b803390ca3edJeff Brown            boolean handled = false;
544a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            try {
5453915bb845b032dc184dba5e60970b803390ca3edJeff Brown                if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0
5463915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        && mDragState != null) {
5473915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    boolean endDrag = false;
5483915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    final float newX = event.getRawX();
5493915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    final float newY = event.getRawY();
5503915bb845b032dc184dba5e60970b803390ca3edJeff Brown
551a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    switch (event.getAction()) {
552a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    case MotionEvent.ACTION_DOWN: {
553a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (DEBUG_DRAG) {
554a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                            Slog.w(TAG, "Unexpected ACTION_DOWN in drag layer");
555a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        }
556a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    } break;
557a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
558a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    case MotionEvent.ACTION_MOVE: {
559a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        synchronized (mWindowMap) {
5602c095f367779ef32130c72849936a2e3013c8492Christopher Tate                            // move the surface and tell the involved window(s) where we are
561a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                            mDragState.notifyMoveLw(newX, newY);
562a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        }
563a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    } break;
564a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
565a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    case MotionEvent.ACTION_UP: {
566a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (DEBUG_DRAG) Slog.d(TAG, "Got UP on move channel; dropping at "
567a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                                + newX + "," + newY);
568a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        synchronized (mWindowMap) {
569d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                            endDrag = mDragState.notifyDropLw(newX, newY);
570a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        }
571a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    } break;
572a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
573a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    case MotionEvent.ACTION_CANCEL: {
574a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (DEBUG_DRAG) Slog.d(TAG, "Drag cancelled!");
575a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        endDrag = true;
576a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    } break;
577a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
578a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
579a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    if (endDrag) {
580a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (DEBUG_DRAG) Slog.d(TAG, "Drag ended; tearing down state");
581a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        // tell all the windows that the drag has ended
5825994359f3009a3ebfbd37d82bb9a665e9b947851Chris Tate                        synchronized (mWindowMap) {
583d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                            mDragState.endDragLw();
5845994359f3009a3ebfbd37d82bb9a665e9b947851Chris Tate                        }
585a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
5863915bb845b032dc184dba5e60970b803390ca3edJeff Brown
5873915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    handled = true;
588a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                }
589a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            } catch (Exception e) {
590a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                Slog.e(TAG, "Exception caught by drag handleMotion", e);
591a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            } finally {
5923915bb845b032dc184dba5e60970b803390ca3edJeff Brown                finishedCallback.finished(handled);
593a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            }
594a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        }
595a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    };
596a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
597a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    /**
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Whether the UI is currently running in touch mode (not showing
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * navigational focus because the user is directly pressing the screen).
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
601e99adc70c8e0a64cb8d13a2ec4c125adaf18904dMichael Jurka    boolean mInTouchMode = true;
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ViewServer mViewServer;
604dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    private ArrayList<WindowChangeListener> mWindowChangeListeners =
605dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        new ArrayList<WindowChangeListener>();
606dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    private boolean mWindowsChanged = false;
607dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev
608dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    public interface WindowChangeListener {
609dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        public void windowsChanged();
6106e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        public void focusChanged();
611dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    }
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
613c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn    final Configuration mTempConfiguration = new Configuration();
6141ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
6152f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn    // The desired scaling factor for compatible apps.
616e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    float mCompatibleScreenScale;
6171ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static WindowManagerService main(Context context,
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            PowerManagerService pm, boolean haveInputMethods) {
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WMThread thr = new WMThread(context, pm, haveInputMethods);
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thr.start();
62206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (thr) {
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (thr.mService == null) {
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    thr.wait();
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (InterruptedException e) {
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
63006e57b5d46c87e9dd7bca1386b63b3a8522f51efJozef BABJAK            return thr.mService;
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
63306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class WMThread extends Thread {
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowManagerService mService;
63606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Context mContext;
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final PowerManagerService mPM;
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final boolean mHaveInputMethods;
64006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public WMThread(Context context, PowerManagerService pm,
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean haveInputMethods) {
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super("WindowManager");
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mContext = context;
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPM = pm;
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHaveInputMethods = haveInputMethods;
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
64806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void run() {
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Looper.prepare();
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowManagerService s = new WindowManagerService(mContext, mPM,
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mHaveInputMethods);
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            android.os.Process.setThreadPriority(
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    android.os.Process.THREAD_PRIORITY_DISPLAY);
655160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate            android.os.Process.setCanSelfBackground(false);
65606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mService = s;
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifyAll();
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
66106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
662ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // For debug builds, log event loop stalls to dropbox for analysis.
663ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            if (StrictMode.conditionallyEnableDebugLogging()) {
664ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick                Slog.i(TAG, "Enabled StrictMode logging for WMThread's Looper");
665ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            }
666ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Looper.loop();
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class PolicyThread extends Thread {
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final WindowManagerPolicy mPolicy;
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final WindowManagerService mService;
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Context mContext;
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final PowerManagerService mPM;
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean mRunning = false;
67706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PolicyThread(WindowManagerPolicy policy,
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowManagerService service, Context context,
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PowerManagerService pm) {
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super("WindowManagerPolicy");
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPolicy = policy;
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mService = service;
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mContext = context;
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPM = pm;
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
68706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void run() {
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Looper.prepare();
690ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn            WindowManagerPolicyThread.set(this, Looper.myLooper());
691ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Looper.myLooper().setMessageLogging(new LogPrinter(
6938a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            //        Log.VERBOSE, "WindowManagerPolicy", Log.LOG_ID_SYSTEM));
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            android.os.Process.setThreadPriority(
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    android.os.Process.THREAD_PRIORITY_FOREGROUND);
696160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate            android.os.Process.setCanSelfBackground(false);
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPolicy.init(mContext, mService, mPM);
69806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRunning = true;
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifyAll();
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
70306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
704ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // For debug builds, log event loop stalls to dropbox for analysis.
705ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            if (StrictMode.conditionallyEnableDebugLogging()) {
706ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick                Slog.i(TAG, "Enabled StrictMode for PolicyThread's Looper");
707ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            }
708ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Looper.loop();
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowManagerService(Context context, PowerManagerService pm,
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean haveInputMethods) {
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHaveInputMethods = haveInputMethods;
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLimitedAlphaCompositing = context.getResources().getBoolean(
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.bool.config_sf_limitedAlpha);
71906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPowerManager = pm;
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPowerManager.setPolicy(mPolicy);
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PowerManager pmc = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenFrozenLock = pmc.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SCREEN_FROZEN");
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenFrozenLock.setReferenceCounted(false);
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mActivityManager = ActivityManagerNative.getDefault();
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryStats = BatteryStatsService.getService();
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Get persisted window scale setting
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowAnimationScale = Settings.System.getFloat(context.getContentResolver(),
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Settings.System.WINDOW_ANIMATION_SCALE, mWindowAnimationScale);
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTransitionAnimationScale = Settings.System.getFloat(context.getContentResolver(),
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Settings.System.TRANSITION_ANIMATION_SCALE, mTransitionAnimationScale);
73506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
736284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        // Track changes to DevicePolicyManager state so we can enable/disable keyguard.
737284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        IntentFilter filter = new IntentFilter();
738284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
739284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        mContext.registerReceiver(mBroadcastReceiver, filter);
740284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller
74146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mHoldingScreenWakeLock = pmc.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK,
74246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                "KEEP_SCREEN_ON_FLAG");
74346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mHoldingScreenWakeLock.setReferenceCounted(false);
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
745e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        mInputManager = new InputManager(context, this);
74606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PolicyThread thr = new PolicyThread(mPolicy, this, context, pm);
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thr.start();
74906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (thr) {
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (!thr.mRunning) {
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    thr.wait();
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (InterruptedException e) {
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
75806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
75900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        mInputManager.start();
76006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Add ourself to the Watchdog monitors.
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Watchdog.getInstance().addMonitor(this);
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws RemoteException {
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return super.onTransact(code, data, reply, flags);
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // The window manager only throws security exceptions, so let's
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // log all others.
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!(e instanceof SecurityException)) {
7748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.e(TAG, "Window Manager Crash", e);
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw e;
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
780e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    private void placeWindowAfter(WindowState pos, WindowState window) {
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int i = mWindows.indexOf(pos);
782f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Adding window " + window + " at "
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + (i+1) + " of " + mWindows.size() + " (after " + pos + ")");
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindows.add(i+1, window);
786dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        mWindowsChanged = true;
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    private void placeWindowBefore(WindowState pos, WindowState window) {
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int i = mWindows.indexOf(pos);
791f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Adding window " + window + " at "
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + i + " of " + mWindows.size() + " (before " + pos + ")");
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindows.add(i, window);
795dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        mWindowsChanged = true;
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //This method finds out the index of a window that has the same app token as
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //win. used for z ordering the windows in mWindows
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int findIdxBasedOnAppTokens(WindowState win) {
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //use a local variable to cache mWindows
802e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        ArrayList<WindowState> localmWindows = mWindows;
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int jmax = localmWindows.size();
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(jmax == 0) {
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return -1;
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int j = (jmax-1); j >= 0; j--) {
808e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState wentry = localmWindows.get(j);
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(wentry.mAppToken == win.mAppToken) {
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return j;
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
81506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void addWindowToListInOrderLocked(WindowState win, boolean addToToken) {
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final IWindow client = win.mClient;
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final WindowToken token = win.mToken;
819e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        final ArrayList<WindowState> localmWindows = mWindows;
82006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = localmWindows.size();
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final WindowState attached = win.mAttachedWindow;
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i;
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (attached == null) {
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int tokenWindowsPos = token.windows.size();
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token.appWindowToken != null) {
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int index = tokenWindowsPos-1;
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (index >= 0) {
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If this application has existing windows, we
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // simply place the new window on top of them... but
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // keep the starting window on top.
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (win.mAttrs.type == TYPE_BASE_APPLICATION) {
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Base windows go behind everything else.
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        placeWindowBefore(token.windows.get(0), win);
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        tokenWindowsPos = 0;
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        AppWindowToken atoken = win.mAppToken;
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (atoken != null &&
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                token.windows.get(index) == atoken.startingWindow) {
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            placeWindowBefore(token.windows.get(index), win);
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            tokenWindowsPos--;
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int newIdx =  findIdxBasedOnAppTokens(win);
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if(newIdx != -1) {
84506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                                //there is a window above this one associated with the same
84606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                                //apptoken note that the window could be a floating window
84706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                                //that was created later or a window at the top of the list of
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                //windows associated with this token.
849f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) {
850f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                    Slog.v(TAG, "Adding window " + win + " at "
851f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                            + (newIdx+1) + " of " + N);
852f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                }
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                localmWindows.add(newIdx+1, win);
854dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                                mWindowsChanged = true;
85506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                            }
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
8598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (localLOGV) Slog.v(
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        TAG, "Figuring out where to add app window "
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + client.asBinder() + " (token=" + token + ")");
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Figure out where the window should go, based on the
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // order of applications.
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int NA = mAppTokens.size();
865e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    WindowState pos = null;
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (i=NA-1; i>=0; i--) {
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        AppWindowToken t = mAppTokens.get(i);
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (t == token) {
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            i--;
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            break;
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
872ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
873a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // We haven't reached the token yet; if this token
874a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // is not going to the bottom and has windows, we can
875a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // use it as an anchor for when we do reach the token.
876a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        if (!t.sendingToBottom && t.windows.size() > 0) {
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            pos = t.windows.get(0);
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // We now know the index into the apps.  If we found
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // an app window above, that gives us the position; else
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // we need to look some more.
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (pos != null) {
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Move behind any windows attached to this one.
885e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                        WindowToken atoken = mTokenMap.get(pos.mClient.asBinder());
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (atoken != null) {
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            final int NC = atoken.windows.size();
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (NC > 0) {
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                WindowState bottom = atoken.windows.get(0);
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (bottom.mSubLayer < 0) {
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    pos = bottom;
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        placeWindowBefore(pos, win);
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
897a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // Continue looking down until we find the first
898a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // token that has windows.
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        while (i >= 0) {
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AppWindowToken t = mAppTokens.get(i);
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            final int NW = t.windows.size();
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (NW > 0) {
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pos = t.windows.get(NW-1);
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                break;
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            i--;
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (pos != null) {
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Move in front of any windows attached to this
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // one.
911e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                            WindowToken atoken = mTokenMap.get(pos.mClient.asBinder());
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (atoken != null) {
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                final int NC = atoken.windows.size();
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (NC > 0) {
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    WindowState top = atoken.windows.get(NC-1);
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    if (top.mSubLayer >= 0) {
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        pos = top;
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    }
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            placeWindowAfter(pos, win);
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Just search for the start of this layer.
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            final int myLayer = win.mBaseLayer;
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            for (i=0; i<N; i++) {
926e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                                WindowState w = localmWindows.get(i);
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (w.mBaseLayer > myLayer) {
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    break;
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
931f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) {
932f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                Slog.v(TAG, "Adding window " + win + " at "
933f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                        + i + " of " + N);
934f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            }
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            localmWindows.add(i, win);
936dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                            mWindowsChanged = true;
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Figure out where window should go, based on layer.
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int myLayer = win.mBaseLayer;
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (i=N-1; i>=0; i--) {
944e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    if (localmWindows.get(i).mBaseLayer <= myLayer) {
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        i++;
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (i < 0) i = 0;
950f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(
9519bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                        TAG, "Adding window " + win + " at "
9529bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                        + i + " of " + N);
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                localmWindows.add(i, win);
954dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                mWindowsChanged = true;
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (addToToken) {
957f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token);
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                token.windows.add(tokenWindowsPos, win);
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Figure out this window's ordering relative to the window
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // it is attached to.
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int NA = token.windows.size();
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int sublayer = win.mSubLayer;
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int largestSublayer = Integer.MIN_VALUE;
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowState windowWithLargestSublayer = null;
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (i=0; i<NA; i++) {
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState w = token.windows.get(i);
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int wSublayer = w.mSubLayer;
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wSublayer >= largestSublayer) {
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    largestSublayer = wSublayer;
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    windowWithLargestSublayer = w;
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sublayer < 0) {
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // For negative sublayers, we go below all windows
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // in the same sublayer.
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wSublayer >= sublayer) {
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (addToToken) {
980f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token);
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            token.windows.add(i, win);
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        placeWindowBefore(
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wSublayer >= 0 ? attached : w, win);
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // For positive sublayers, we go above all windows
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // in the same sublayer.
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wSublayer > sublayer) {
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (addToToken) {
992f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token);
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            token.windows.add(i, win);
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        placeWindowBefore(w, win);
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (i >= NA) {
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (addToToken) {
1002f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token);
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    token.windows.add(win);
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sublayer < 0) {
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    placeWindowBefore(attached, win);
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    placeWindowAfter(largestSublayer >= 0
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     ? windowWithLargestSublayer
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     : attached,
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     win);
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
101506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (win.mAppToken != null && addToToken) {
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mAppToken.allAppWindows.add(win);
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
102006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static boolean canBeImeTarget(WindowState w) {
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int fl = w.mAttrs.flags
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                & (FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM);
1024e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn        if (fl == 0 || fl == (FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM)
1025e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                || w.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) {
1026e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn            if (DEBUG_INPUT_METHOD) {
1027e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                Slog.i(TAG, "isVisibleOrAdding " + w + ": " + w.isVisibleOrAdding());
1028e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                if (!w.isVisibleOrAdding()) {
1029e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    Slog.i(TAG, "  mSurface=" + w.mSurface + " reportDestroy=" + w.mReportDestroySurface
1030e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            + " relayoutCalled=" + w.mRelayoutCalled + " viewVis=" + w.mViewVisibility
1031e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            + " policyVis=" + w.mPolicyVisibility + " attachHid=" + w.mAttachedHidden
1032e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            + " exiting=" + w.mExiting + " destroying=" + w.mDestroying);
1033e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    if (w.mAppToken != null) {
1034e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        Slog.i(TAG, "  mAppToken.hiddenRequested=" + w.mAppToken.hiddenRequested);
1035e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    }
1036e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                }
1037e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn            }
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return w.isVisibleOrAdding();
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
104206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int findDesiredInputMethodWindowIndexLocked(boolean willMove) {
1044e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        final ArrayList<WindowState> localmWindows = mWindows;
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = localmWindows.size();
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState w = null;
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i = N;
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (i > 0) {
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            i--;
1050e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            w = localmWindows.get(i);
105106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1052e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn            if (DEBUG_INPUT_METHOD && willMove) Slog.i(TAG, "Checking window @" + i
1053e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    + " " + w + " fl=0x" + Integer.toHexString(w.mAttrs.flags));
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (canBeImeTarget(w)) {
10558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                //Slog.i(TAG, "Putting input method here!");
105606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Yet more tricksyness!  If this window is a "starting"
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // window, we do actually want to be on top of it, but
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // it is not -really- where input will go.  So if the caller
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // is not actually looking to move the IME, look down below
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // for a real window to target...
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!willMove
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && w.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && i > 0) {
1065e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    WindowState wb = localmWindows.get(i-1);
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wb.mAppToken == w.mAppToken && canBeImeTarget(wb)) {
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        i--;
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w = wb;
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
107406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1075e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn        if (DEBUG_INPUT_METHOD && willMove) Slog.v(TAG, "Proposed new IME target: " + w);
1076e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn
10777eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        // Now, a special case -- if the last target's window is in the
10787eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        // process of exiting, and is above the new target, keep on the
10797eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        // last target to avoid flicker.  Consider for example a Dialog with
10807eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        // the IME shown: when the Dialog is dismissed, we want to keep
10817eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        // the IME above it until it is completely gone so it doesn't drop
10827eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        // behind the dialog or its full-screen scrim.
10837eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        if (mInputMethodTarget != null && w != null
10847eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn                && mInputMethodTarget.isDisplayedLw()
10857eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn                && mInputMethodTarget.mExiting) {
10867eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn            if (mInputMethodTarget.mAnimLayer > w.mAnimLayer) {
10877eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn                w = mInputMethodTarget;
10887eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn                i = localmWindows.indexOf(w);
1089e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Current target higher, switching to: " + w);
10907eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn            }
10917eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        }
109206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
10938a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Desired input method target="
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + w + " willMove=" + willMove);
109506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (willMove && w != null) {
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final WindowState curTarget = mInputMethodTarget;
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (curTarget != null && curTarget.mAppToken != null) {
109906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Now some fun for dealing with window animations that
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // modify the Z order.  We need to look at all windows below
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // the current target that are in this app, finding the highest
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // visible one in layering.
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AppWindowToken token = curTarget.mAppToken;
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState highestTarget = null;
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int highestPos = 0;
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (token.animating || token.animation != null) {
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int pos = 0;
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pos = localmWindows.indexOf(curTarget);
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    while (pos >= 0) {
1111e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                        WindowState win = localmWindows.get(pos);
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (win.mAppToken != token) {
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            break;
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!win.mRemoved) {
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (highestTarget == null || win.mAnimLayer >
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    highestTarget.mAnimLayer) {
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                highestTarget = win;
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                highestPos = pos;
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pos--;
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
112506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (highestTarget != null) {
11278a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_INPUT_METHOD) Slog.v(TAG, "mNextAppTransition="
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mNextAppTransition + " " + highestTarget
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " animating=" + highestTarget.isAnimating()
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " layer=" + highestTarget.mAnimLayer
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " new layer=" + w.mAnimLayer);
113206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1133bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                    if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // If we are currently setting up for an animation,
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // hold everything until we can find out what will happen.
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mInputMethodTargetWaitingAnim = true;
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mInputMethodTarget = highestTarget;
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return highestPos + 1;
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (highestTarget.isAnimating() &&
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            highestTarget.mAnimLayer > w.mAnimLayer) {
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // If the window we are currently targeting is involved
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // with an animation, and it is on top of the next target
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // we will be over, then hold off on moving until
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // that is done.
1145e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        mInputMethodTargetWaitingAnim = true;
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mInputMethodTarget = highestTarget;
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return highestPos + 1;
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
115206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
11538a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //Slog.i(TAG, "Placing input method @" + (i+1));
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (w != null) {
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (willMove) {
1156b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (DEBUG_INPUT_METHOD) {
1157b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    RuntimeException e = null;
1158b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (!HIDE_STACK_CRAWLS) {
1159b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        e = new RuntimeException();
1160b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        e.fillInStackTrace();
1161b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
1162b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    Slog.w(TAG, "Moving IM target from "
1163b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + mInputMethodTarget + " to " + w, e);
1164b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                }
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInputMethodTarget = w;
1166e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                mInputMethodTargetWaitingAnim = false;
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (w.mAppToken != null) {
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    setInputMethodAnimLayerAdjustment(w.mAppToken.animLayerAdjustment);
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    setInputMethodAnimLayerAdjustment(0);
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return i+1;
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (willMove) {
1176b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            if (DEBUG_INPUT_METHOD) {
1177b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                RuntimeException e = null;
1178b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (!HIDE_STACK_CRAWLS) {
1179b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    e = new RuntimeException();
1180b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    e.fillInStackTrace();
1181b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                }
1182b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                Slog.w(TAG, "Moving IM target from "
1183b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + mInputMethodTarget + " to null", e);
1184b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            }
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInputMethodTarget = null;
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setInputMethodAnimLayerAdjustment(0);
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
119006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void addInputMethodWindowToListLocked(WindowState win) {
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = findDesiredInputMethodWindowIndexLocked(true);
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pos >= 0) {
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mTargetAppToken = mInputMethodTarget.mAppToken;
1195f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            if (DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(
11969bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    TAG, "Adding input method window " + win + " at " + pos);
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindows.add(pos, win);
1198dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            mWindowsChanged = true;
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            moveInputMethodDialogsLocked(pos+1);
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        win.mTargetAppToken = null;
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        addWindowToListInOrderLocked(win, true);
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        moveInputMethodDialogsLocked(pos);
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
120606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setInputMethodAnimLayerAdjustment(int adj) {
12088a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_LAYERS) Slog.v(TAG, "Setting im layer adj to " + adj);
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInputMethodAnimLayerAdjustment = adj;
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState imw = mInputMethodWindow;
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (imw != null) {
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            imw.mAnimLayer = imw.mLayer + adj;
12138a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + imw
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " anim layer: " + imw.mAnimLayer);
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int wi = imw.mChildWindows.size();
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (wi > 0) {
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wi--;
1218e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState cw = imw.mChildWindows.get(wi);
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cw.mAnimLayer = cw.mLayer + adj;
12208a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + cw
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " anim layer: " + cw.mAnimLayer);
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int di = mInputMethodDialogs.size();
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (di > 0) {
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            di --;
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            imw = mInputMethodDialogs.get(di);
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            imw.mAnimLayer = imw.mLayer + adj;
12298a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + imw
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " anim layer: " + imw.mAnimLayer);
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
123306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int tmpRemoveWindowLocked(int interestingPos, WindowState win) {
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int wpos = mWindows.indexOf(win);
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wpos >= 0) {
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wpos < interestingPos) interestingPos--;
12388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Temp removing at " + wpos + ": " + win);
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindows.remove(wpos);
1240dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            mWindowsChanged = true;
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NC = win.mChildWindows.size();
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (NC > 0) {
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                NC--;
1244e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState cw = win.mChildWindows.get(NC);
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int cpos = mWindows.indexOf(cw);
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (cpos >= 0) {
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (cpos < interestingPos) interestingPos--;
12488a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Temp removing child at "
12499bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                            + cpos + ": " + cw);
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mWindows.remove(cpos);
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return interestingPos;
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
125606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void reAddWindowToListInOrderLocked(WindowState win) {
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        addWindowToListInOrderLocked(win, false);
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // This is a hack to get all of the child windows added as well
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // at the right position.  Child windows should be rare and
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this case should be rare, so it shouldn't be that big a deal.
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int wpos = mWindows.indexOf(win);
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wpos >= 0) {
12648a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "ReAdd removing from " + wpos
12659bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    + ": " + win);
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindows.remove(wpos);
1267dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            mWindowsChanged = true;
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reAddWindowLocked(wpos, win);
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
127106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void logWindowList(String prefix) {
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int N = mWindows.size();
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (N > 0) {
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            N--;
12768a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.v(TAG, prefix + "#" + N + ": " + mWindows.get(N));
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
127906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void moveInputMethodDialogsLocked(int pos) {
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ArrayList<WindowState> dialogs = mInputMethodDialogs;
128206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = dialogs.size();
12848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Removing " + N + " dialogs w/pos=" + pos);
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos = tmpRemoveWindowLocked(pos, dialogs.get(i));
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_INPUT_METHOD) {
12898a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.v(TAG, "Window list w/pos=" + pos);
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            logWindowList("  ");
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
129206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pos >= 0) {
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final AppWindowToken targetAppToken = mInputMethodTarget.mAppToken;
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (pos < mWindows.size()) {
1296e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState wp = mWindows.get(pos);
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wp == mInputMethodWindow) {
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pos++;
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Adding " + N + " dialogs at pos=" + pos);
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState win = dialogs.get(i);
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mTargetAppToken = targetAppToken;
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pos = reAddWindowLocked(pos, win);
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_INPUT_METHOD) {
13088a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.v(TAG, "Final window list:");
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                logWindowList("  ");
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowState win = dialogs.get(i);
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mTargetAppToken = null;
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reAddWindowToListInOrderLocked(win);
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_INPUT_METHOD) {
13188a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.v(TAG, "No IM target, final list:");
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                logWindowList("  ");
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
132306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean moveInputMethodWindowsIfNeededLocked(boolean needAssignLayers) {
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final WindowState imWin = mInputMethodWindow;
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int DN = mInputMethodDialogs.size();
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (imWin == null && DN == 0) {
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
133006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int imPos = findDesiredInputMethodWindowIndexLocked(true);
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (imPos >= 0) {
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // In this case, the input method windows are to be placed
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // immediately above the window they are targeting.
133506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // First check to see if the input method windows are already
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // located here, and contiguous.
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = mWindows.size();
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowState firstImWin = imPos < N
1340e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    ? mWindows.get(imPos) : null;
134106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Figure out the actual input method window that should be
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // at the bottom of their stack.
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowState baseImWin = imWin != null
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? imWin : mInputMethodDialogs.get(0);
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (baseImWin.mChildWindows.size() > 0) {
1347e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState cw = baseImWin.mChildWindows.get(0);
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (cw.mSubLayer < 0) baseImWin = cw;
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
135006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (firstImWin == baseImWin) {
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // The windows haven't moved...  but are they still contiguous?
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // First find the top IM window.
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int pos = imPos+1;
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (pos < N) {
1356e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    if (!(mWindows.get(pos)).mIsImWindow) {
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pos++;
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pos++;
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Now there should be no more input method windows above.
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (pos < N) {
1364e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    if ((mWindows.get(pos)).mIsImWindow) {
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pos++;
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pos >= N) {
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // All is good!
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
137406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imWin != null) {
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_INPUT_METHOD) {
13778a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "Moving IM from " + imPos);
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    logWindowList("  ");
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imPos = tmpRemoveWindowLocked(imPos, imWin);
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_INPUT_METHOD) {
13827eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn                    Slog.v(TAG, "List after removing with new pos " + imPos + ":");
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    logWindowList("  ");
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imWin.mTargetAppToken = mInputMethodTarget.mAppToken;
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reAddWindowLocked(imPos, imWin);
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_INPUT_METHOD) {
13888a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "List after moving IM to " + imPos + ":");
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    logWindowList("  ");
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DN > 0) moveInputMethodDialogsLocked(imPos+1);
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                moveInputMethodDialogsLocked(imPos);
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
139506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // In this case, the input method windows go in a fixed layer,
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // because they aren't currently associated with a focus window.
139906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imWin != null) {
14018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Moving IM from " + imPos);
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                tmpRemoveWindowLocked(0, imWin);
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imWin.mTargetAppToken = null;
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reAddWindowToListInOrderLocked(imWin);
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_INPUT_METHOD) {
14068a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "List with no IM target:");
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    logWindowList("  ");
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DN > 0) moveInputMethodDialogsLocked(-1);;
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                moveInputMethodDialogsLocked(-1);;
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
141306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
141506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (needAssignLayers) {
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assignLayersLocked();
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
141906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
142206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void adjustInputMethodDialogsLocked() {
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        moveInputMethodDialogsLocked(findDesiredInputMethodWindowIndexLocked(true));
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
142606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
142725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn    final boolean isWallpaperVisible(WindowState wallpaperTarget) {
14288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper vis: target obscured="
142925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                + (wallpaperTarget != null ? Boolean.toString(wallpaperTarget.mObscured) : "??")
143025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                + " anim=" + ((wallpaperTarget != null && wallpaperTarget.mAppToken != null)
143125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        ? wallpaperTarget.mAppToken.animation : null)
143225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                + " upper=" + mUpperWallpaperTarget
143325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                + " lower=" + mLowerWallpaperTarget);
143425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn        return (wallpaperTarget != null
143525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        && (!wallpaperTarget.mObscured || (wallpaperTarget.mAppToken != null
143625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                && wallpaperTarget.mAppToken.animation != null)))
143725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                || mUpperWallpaperTarget != null
143825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                || mLowerWallpaperTarget != null;
143925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn    }
1440ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
14410586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    static final int ADJUST_WALLPAPER_LAYERS_CHANGED = 1<<1;
14420586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    static final int ADJUST_WALLPAPER_VISIBILITY_CHANGED = 1<<2;
1443ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
14440586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    int adjustWallpaperWindowsLocked() {
14450586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn        int changed = 0;
1446ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
144781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        final int dw = mAppDisplayWidth;
144881e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        final int dh = mAppDisplayHeight;
1449ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
14504c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // First find top-most window that has asked to be on top of the
14514c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // wallpaper; all wallpapers go behind it.
1452e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        final ArrayList<WindowState> localmWindows = mWindows;
14534c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        int N = localmWindows.size();
14544c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        WindowState w = null;
1455f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn        WindowState foundW = null;
1456f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn        int foundI = 0;
14573b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        WindowState topCurW = null;
14583b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        int topCurI = 0;
14596c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn        int windowDetachedI = -1;
14604c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        int i = N;
14614c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        while (i > 0) {
14624c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            i--;
1463e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            w = localmWindows.get(i);
14643b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if ((w.mAttrs.type == WindowManager.LayoutParams.TYPE_WALLPAPER)) {
14653b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                if (topCurW == null) {
14663b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    topCurW = w;
14673b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    topCurI = i;
14683b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                }
14693b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                continue;
14703b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            }
14713b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            topCurW = null;
14726c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            if (w != mWindowDetachedWallpaper && w.mAppToken != null) {
14733be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                // If this window's app token is hidden and not animating,
14743be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                // it is of no interest to us.
14753be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                if (w.mAppToken.hidden && w.mAppToken.animation == null) {
14768a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WALLPAPER) Slog.v(TAG,
14776c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                            "Skipping not hidden or animating token: " + w);
14783be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    continue;
1479f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                }
1480f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            }
14818a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WALLPAPER) Slog.v(TAG, "Win " + w + ": readyfordisplay="
14823be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    + w.isReadyForDisplay() + " drawpending=" + w.mDrawPending
14833be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    + " commitdrawpending=" + w.mCommitDrawPending);
14847341d7a104b47996445d069a695e155a07184606Dianne Hackborn            if ((w.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0 && w.isReadyForDisplay()
14856c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                    && (mWallpaperTarget == w
14866c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                            || (!w.mDrawPending && !w.mCommitDrawPending))) {
14878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WALLPAPER) Slog.v(TAG,
14883be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        "Found wallpaper activity: #" + i + "=" + w);
1489f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                foundW = w;
1490f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                foundI = i;
14913b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                if (w == mWallpaperTarget && ((w.mAppToken != null
14923b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        && w.mAppToken.animation != null)
14933b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        || w.mAnimation != null)) {
14943be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    // The current wallpaper target is animating, so we'll
14953be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    // look behind it for another possible target and figure
14963be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    // out what is going on below.
14978a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WALLPAPER) Slog.v(TAG, "Win " + w
14983be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            + ": token animating, looking behind.");
1499f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                    continue;
1500f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                }
15014c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                break;
15026c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            } else if (w == mWindowDetachedWallpaper) {
15036c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                windowDetachedI = i;
15044c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
15054c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
15064c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
15076c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn        if (foundW == null && windowDetachedI >= 0) {
15086c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            if (DEBUG_WALLPAPER) Slog.v(TAG,
15096c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                    "Found animating detached wallpaper activity: #" + i + "=" + w);
15106c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            foundW = w;
15116c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            foundI = windowDetachedI;
15126c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn        }
15136c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn
1514bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn        if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
1515f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // If we are currently waiting for an app transition, and either
1516f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // the current target or the next target are involved with it,
1517f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // then hold off on doing anything with the wallpaper.
1518f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // Note that we are checking here for just whether the target
1519f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // is part of an app token...  which is potentially overly aggressive
1520f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // (the app token may not be involved in the transition), but good
1521f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // enough (we'll just wait until whatever transition is pending
1522f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // executes).
1523f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            if (mWallpaperTarget != null && mWallpaperTarget.mAppToken != null) {
15248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WALLPAPER) Slog.v(TAG,
15253be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        "Wallpaper not changing: waiting for app anim in current target");
15260586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                return 0;
1527f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            }
1528f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            if (foundW != null && foundW.mAppToken != null) {
15298a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WALLPAPER) Slog.v(TAG,
15303be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        "Wallpaper not changing: waiting for app anim in found target");
15310586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                return 0;
1532f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            }
15337341d7a104b47996445d069a695e155a07184606Dianne Hackborn        }
1534ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1535f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn        if (mWallpaperTarget != foundW) {
1536f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            if (DEBUG_WALLPAPER) {
15378a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.v(TAG, "New wallpaper target: " + foundW
15383be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        + " oldTarget: " + mWallpaperTarget);
15393be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            }
1540ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
15413be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            mLowerWallpaperTarget = null;
15423be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            mUpperWallpaperTarget = null;
1543ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
15443be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            WindowState oldW = mWallpaperTarget;
15453be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            mWallpaperTarget = foundW;
1546ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
15473be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            // Now what is happening...  if the current and new targets are
15483be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            // animating, then we are in our super special mode!
15493b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if (foundW != null && oldW != null) {
15503b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                boolean oldAnim = oldW.mAnimation != null
15513b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        || (oldW.mAppToken != null && oldW.mAppToken.animation != null);
15523b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                boolean foundAnim = foundW.mAnimation != null
15533b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        || (foundW.mAppToken != null && foundW.mAppToken.animation != null);
15543be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                if (DEBUG_WALLPAPER) {
15558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "New animation: " + foundAnim
15563b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            + " old animation: " + oldAnim);
15573be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                }
15583b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                if (foundAnim && oldAnim) {
15593be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    int oldI = localmWindows.indexOf(oldW);
15603be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    if (DEBUG_WALLPAPER) {
15618a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.v(TAG, "New i: " + foundI + " old i: " + oldI);
15623be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    }
15633be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    if (oldI >= 0) {
15643be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        if (DEBUG_WALLPAPER) {
15658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            Slog.v(TAG, "Animating wallpapers: old#" + oldI
15663be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                                    + "=" + oldW + "; new#" + foundI
15673be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                                    + "=" + foundW);
15683be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        }
1569ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
15703be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        // Set the new target correctly.
15713b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        if (foundW.mAppToken != null && foundW.mAppToken.hiddenRequested) {
15723be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            if (DEBUG_WALLPAPER) {
15738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.v(TAG, "Old wallpaper still the target.");
15743be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            }
15753be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            mWallpaperTarget = oldW;
15763be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        }
1577ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
15783be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        // Now set the upper and lower wallpaper targets
15793be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        // correctly, and make sure that we are positioning
15803be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        // the wallpaper below the lower.
15813be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        if (foundI > oldI) {
15823be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            // The new target is on top of the old one.
15833be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            if (DEBUG_WALLPAPER) {
15848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.v(TAG, "Found target above old target.");
15853be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            }
15863be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            mUpperWallpaperTarget = foundW;
15873be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            mLowerWallpaperTarget = oldW;
15883be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            foundW = oldW;
15893be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            foundI = oldI;
15903be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        } else {
15913be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            // The new target is below the old one.
15923be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            if (DEBUG_WALLPAPER) {
15938a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.v(TAG, "Found target below old target.");
15943be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            }
15953be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            mUpperWallpaperTarget = oldW;
15963be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            mLowerWallpaperTarget = foundW;
15973be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        }
15983be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    }
15993be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                }
16003be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            }
1601ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16026b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn        } else if (mLowerWallpaperTarget != null) {
16033be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            // Is it time to stop animating?
16046b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn            boolean lowerAnimating = mLowerWallpaperTarget.mAnimation != null
16056b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn                    || (mLowerWallpaperTarget.mAppToken != null
16066b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn                            && mLowerWallpaperTarget.mAppToken.animation != null);
16076b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn            boolean upperAnimating = mUpperWallpaperTarget.mAnimation != null
16086b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn                    || (mUpperWallpaperTarget.mAppToken != null
16096b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn                            && mUpperWallpaperTarget.mAppToken.animation != null);
16106b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn            if (!lowerAnimating || !upperAnimating) {
16113be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                if (DEBUG_WALLPAPER) {
16128a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "No longer animating wallpaper targets!");
16133be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                }
16143be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                mLowerWallpaperTarget = null;
16153be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                mUpperWallpaperTarget = null;
1616f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            }
1617f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn        }
1618ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1619f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn        boolean visible = foundW != null;
1620759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        if (visible) {
16217341d7a104b47996445d069a695e155a07184606Dianne Hackborn            // The window is visible to the compositor...  but is it visible
16227341d7a104b47996445d069a695e155a07184606Dianne Hackborn            // to the user?  That is what the wallpaper cares about.
162325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn            visible = isWallpaperVisible(foundW);
16248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper visibility: " + visible);
1625ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16267341d7a104b47996445d069a695e155a07184606Dianne Hackborn            // If the wallpaper target is animating, we may need to copy
1627f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // its layer adjustment.  Only do this if we are not transfering
1628f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // between two wallpaper targets.
1629f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            mWallpaperAnimLayerAdjustment =
16303be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    (mLowerWallpaperTarget == null && foundW.mAppToken != null)
1631f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                    ? foundW.mAppToken.animLayerAdjustment : 0;
1632ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16336136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn            final int maxLayer = mPolicy.getMaxWallpaperLayer()
16346136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                    * TYPE_LAYER_MULTIPLIER
16356136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                    + TYPE_LAYER_OFFSET;
1636ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16374c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            // Now w is the window we are supposed to be behind...  but we
16384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            // need to be sure to also be behind any of its attached windows,
16396136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn            // AND any starting window associated with it, AND below the
16406136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn            // maximum layer the policy allows for wallpapers.
1641f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            while (foundI > 0) {
1642e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState wb = localmWindows.get(foundI-1);
16436136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                if (wb.mBaseLayer < maxLayer &&
16446136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                        wb.mAttachedWindow != foundW &&
1645428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        (foundW.mAttachedWindow == null ||
1646428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                                wb.mAttachedWindow != foundW.mAttachedWindow) &&
16474c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                        (wb.mAttrs.type != TYPE_APPLICATION_STARTING ||
1648428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                                foundW.mToken == null || wb.mToken != foundW.mToken)) {
16494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    // This window is not related to the previous one in any
16504c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    // interesting way, so stop here.
16514c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    break;
16524c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
1653f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                foundW = wb;
1654f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                foundI--;
16554c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
165625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn        } else {
16578a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WALLPAPER) Slog.v(TAG, "No wallpaper target");
16584c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
1659ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16603b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        if (foundW == null && topCurW != null) {
16613b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            // There is no wallpaper target, so it goes at the bottom.
16623b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            // We will assume it is the same place as last time, if known.
16633b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            foundW = topCurW;
16643b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            foundI = topCurI+1;
16653b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        } else {
16663b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            // Okay i is the position immediately above the wallpaper.  Look at
16673b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            // what is below it for later.
1668e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            foundW = foundI > 0 ? localmWindows.get(foundI-1) : null;
16693b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        }
1670ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1671284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        if (visible) {
167273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            if (mWallpaperTarget.mWallpaperX >= 0) {
167373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                mLastWallpaperX = mWallpaperTarget.mWallpaperX;
1674bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                mLastWallpaperXStep = mWallpaperTarget.mWallpaperXStep;
167573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            }
167673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            if (mWallpaperTarget.mWallpaperY >= 0) {
167773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                mLastWallpaperY = mWallpaperTarget.mWallpaperY;
1678bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                mLastWallpaperYStep = mWallpaperTarget.mWallpaperYStep;
167973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            }
1680284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        }
1681ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // Start stepping backwards from here, ensuring that our wallpaper windows
16834c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // are correctly placed.
16844c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        int curTokenIndex = mWallpaperTokens.size();
16854c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        while (curTokenIndex > 0) {
16864c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            curTokenIndex--;
16874c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            WindowToken token = mWallpaperTokens.get(curTokenIndex);
16880586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn            if (token.hidden == visible) {
16890586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                changed |= ADJUST_WALLPAPER_VISIBILITY_CHANGED;
16900586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                token.hidden = !visible;
16910586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                // Need to do a layout to ensure the wallpaper now has the
16920586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                // correct size.
16930586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                mLayoutNeeded = true;
16940586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn            }
1695ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16964c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            int curWallpaperIndex = token.windows.size();
16974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            while (curWallpaperIndex > 0) {
16984c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                curWallpaperIndex--;
16994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                WindowState wallpaper = token.windows.get(curWallpaperIndex);
1700ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
170172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                if (visible) {
170219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    updateWallpaperOffsetLocked(wallpaper, dw, dh, false);
170372c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                }
1704ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1705759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                // First, make sure the client has the current visibility
1706759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                // state.
1707759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                if (wallpaper.mWallpaperVisible != visible) {
1708759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    wallpaper.mWallpaperVisible = visible;
1709759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    try {
17108a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_VISIBILITY || DEBUG_WALLPAPER) Slog.v(TAG,
1711759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                                "Setting visibility of wallpaper " + wallpaper
1712759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                                + ": " + visible);
1713759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                        wallpaper.mClient.dispatchAppVisibility(visible);
1714759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    } catch (RemoteException e) {
1715759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    }
1716759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                }
1717ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1718759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                wallpaper.mAnimLayer = wallpaper.mLayer + mWallpaperAnimLayerAdjustment;
17198a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper win "
17207341d7a104b47996445d069a695e155a07184606Dianne Hackborn                        + wallpaper + " anim layer: " + wallpaper.mAnimLayer);
1721ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
17224c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // First, if this window is at the current index, then all
17234c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // is well.
1724f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                if (wallpaper == foundW) {
1725f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                    foundI--;
1726f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                    foundW = foundI > 0
1727e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                            ? localmWindows.get(foundI-1) : null;
17284c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    continue;
17294c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
1730ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
17314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // The window didn't match...  the current wallpaper window,
17324c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // wherever it is, is in the wrong place, so make sure it is
17334c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // not in the list.
17344c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                int oldIndex = localmWindows.indexOf(wallpaper);
17354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                if (oldIndex >= 0) {
17368a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Wallpaper removing at "
17379bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                            + oldIndex + ": " + wallpaper);
17384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    localmWindows.remove(oldIndex);
1739dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                    mWindowsChanged = true;
1740f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                    if (oldIndex < foundI) {
1741f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                        foundI--;
17424c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    }
17434c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
1744ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
17454c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // Now stick it in.
1746f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (DEBUG_WALLPAPER || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) {
1747f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    Slog.v(TAG, "Moving wallpaper " + wallpaper
1748f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            + " from " + oldIndex + " to " + foundI);
1749f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                }
1750ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1751f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                localmWindows.add(foundI, wallpaper);
1752dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                mWindowsChanged = true;
17530586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                changed |= ADJUST_WALLPAPER_LAYERS_CHANGED;
17544c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
17554c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
1756ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
17574c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return changed;
17584c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
17594c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
1760c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn    void setWallpaperAnimLayerAdjustmentLocked(int adj) {
17618a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG,
17627341d7a104b47996445d069a695e155a07184606Dianne Hackborn                "Setting wallpaper layer adj to " + adj);
1763759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        mWallpaperAnimLayerAdjustment = adj;
1764759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        int curTokenIndex = mWallpaperTokens.size();
1765759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        while (curTokenIndex > 0) {
1766759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            curTokenIndex--;
1767759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            WindowToken token = mWallpaperTokens.get(curTokenIndex);
1768759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            int curWallpaperIndex = token.windows.size();
1769759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            while (curWallpaperIndex > 0) {
1770759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                curWallpaperIndex--;
1771759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                WindowState wallpaper = token.windows.get(curWallpaperIndex);
1772759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                wallpaper.mAnimLayer = wallpaper.mLayer + adj;
17738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper win "
17747341d7a104b47996445d069a695e155a07184606Dianne Hackborn                        + wallpaper + " anim layer: " + wallpaper.mAnimLayer);
1775759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            }
1776759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        }
1777759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn    }
1778759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn
177919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    boolean updateWallpaperOffsetLocked(WindowState wallpaperWin, int dw, int dh,
178019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            boolean sync) {
178172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn        boolean changed = false;
17827341d7a104b47996445d069a695e155a07184606Dianne Hackborn        boolean rawChanged = false;
178373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        float wpx = mLastWallpaperX >= 0 ? mLastWallpaperX : 0.5f;
1784bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen        float wpxs = mLastWallpaperXStep >= 0 ? mLastWallpaperXStep : -1.0f;
1785ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        int availw = wallpaperWin.mFrame.right-wallpaperWin.mFrame.left-dw;
178673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        int offset = availw > 0 ? -(int)(availw*wpx+.5f) : 0;
178773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        changed = wallpaperWin.mXOffset != offset;
178873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        if (changed) {
17898a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WALLPAPER) Slog.v(TAG, "Update wallpaper "
179073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                    + wallpaperWin + " x: " + offset);
179173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            wallpaperWin.mXOffset = offset;
179273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        }
1793bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen        if (wallpaperWin.mWallpaperX != wpx || wallpaperWin.mWallpaperXStep != wpxs) {
179473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            wallpaperWin.mWallpaperX = wpx;
1795bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen            wallpaperWin.mWallpaperXStep = wpxs;
179673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            rawChanged = true;
1797c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        }
1798ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
179973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        float wpy = mLastWallpaperY >= 0 ? mLastWallpaperY : 0.5f;
1800bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen        float wpys = mLastWallpaperYStep >= 0 ? mLastWallpaperYStep : -1.0f;
180173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        int availh = wallpaperWin.mFrame.bottom-wallpaperWin.mFrame.top-dh;
180273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        offset = availh > 0 ? -(int)(availh*wpy+.5f) : 0;
180373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        if (wallpaperWin.mYOffset != offset) {
18048a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WALLPAPER) Slog.v(TAG, "Update wallpaper "
180573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                    + wallpaperWin + " y: " + offset);
180673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            changed = true;
180773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            wallpaperWin.mYOffset = offset;
180873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        }
1809bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen        if (wallpaperWin.mWallpaperY != wpy || wallpaperWin.mWallpaperYStep != wpys) {
181073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            wallpaperWin.mWallpaperY = wpy;
1811bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen            wallpaperWin.mWallpaperYStep = wpys;
181273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            rawChanged = true;
181372c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn        }
1814ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
18157341d7a104b47996445d069a695e155a07184606Dianne Hackborn        if (rawChanged) {
181672c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn            try {
18178a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WALLPAPER) Slog.v(TAG, "Report new wp offset "
1818e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                        + wallpaperWin + " x=" + wallpaperWin.mWallpaperX
1819e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                        + " y=" + wallpaperWin.mWallpaperY);
182019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                if (sync) {
18217580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    mWaitingOnWallpaper = wallpaperWin;
182219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                }
182372c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                wallpaperWin.mClient.dispatchWallpaperOffsets(
1824bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                        wallpaperWin.mWallpaperX, wallpaperWin.mWallpaperY,
1825bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                        wallpaperWin.mWallpaperXStep, wallpaperWin.mWallpaperYStep, sync);
182619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                if (sync) {
18277580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    if (mWaitingOnWallpaper != null) {
18287580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        long start = SystemClock.uptimeMillis();
18297580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        if ((mLastWallpaperTimeoutTime+WALLPAPER_TIMEOUT_RECOVERY)
18307580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                < start) {
18317580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                            try {
18328a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_WALLPAPER) Slog.v(TAG,
18337580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                        "Waiting for offset complete...");
18347580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                mWindowMap.wait(WALLPAPER_TIMEOUT);
18357580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                            } catch (InterruptedException e) {
18367580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                            }
18378a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_WALLPAPER) Slog.v(TAG, "Offset complete!");
18387580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                            if ((start+WALLPAPER_TIMEOUT)
18397580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                    < SystemClock.uptimeMillis()) {
18408a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.i(TAG, "Timeout waiting for wallpaper to offset: "
18417580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                        + wallpaperWin);
18427580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                mLastWallpaperTimeoutTime = start;
184319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                            }
184419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                        }
18457580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        mWaitingOnWallpaper = null;
184619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    }
184719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                }
184872c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn            } catch (RemoteException e) {
184972c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn            }
1850c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        }
1851ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1852c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        return changed;
1853c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn    }
1854ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
185519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    void wallpaperOffsetsComplete(IBinder window) {
18567580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        synchronized (mWindowMap) {
185719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            if (mWaitingOnWallpaper != null &&
185819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    mWaitingOnWallpaper.mClient.asBinder() == window) {
185919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                mWaitingOnWallpaper = null;
18607580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                mWindowMap.notifyAll();
186119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            }
186219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn        }
186319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    }
1864ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
186573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn    boolean updateWallpaperOffsetLocked(WindowState changingTarget, boolean sync) {
186681e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        final int dw = mAppDisplayWidth;
186781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        final int dh = mAppDisplayHeight;
1868ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1869c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        boolean changed = false;
1870ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1871c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        WindowState target = mWallpaperTarget;
1872c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        if (target != null) {
187373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            if (target.mWallpaperX >= 0) {
187473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                mLastWallpaperX = target.mWallpaperX;
187573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            } else if (changingTarget.mWallpaperX >= 0) {
187673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                mLastWallpaperX = changingTarget.mWallpaperX;
187773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            }
187873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            if (target.mWallpaperY >= 0) {
187973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                mLastWallpaperY = target.mWallpaperY;
188073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            } else if (changingTarget.mWallpaperY >= 0) {
188173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                mLastWallpaperY = changingTarget.mWallpaperY;
188273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            }
188373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        }
1884ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
188573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        int curTokenIndex = mWallpaperTokens.size();
188673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        while (curTokenIndex > 0) {
188773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            curTokenIndex--;
188873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            WindowToken token = mWallpaperTokens.get(curTokenIndex);
188973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            int curWallpaperIndex = token.windows.size();
189073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            while (curWallpaperIndex > 0) {
189173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                curWallpaperIndex--;
189273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                WindowState wallpaper = token.windows.get(curWallpaperIndex);
189373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                if (updateWallpaperOffsetLocked(wallpaper, dw, dh, sync)) {
189473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                    wallpaper.computeShownFrameLocked();
189573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                    changed = true;
189673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                    // We only want to be synchronous with one wallpaper.
189773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                    sync = false;
1898c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn                }
1899c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn            }
1900c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        }
1901ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1902c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        return changed;
1903c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn    }
1904ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1905e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn    void updateWallpaperVisibilityLocked() {
190625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn        final boolean visible = isWallpaperVisible(mWallpaperTarget);
190781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        final int dw = mAppDisplayWidth;
190881e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        final int dh = mAppDisplayHeight;
1909ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1910e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn        int curTokenIndex = mWallpaperTokens.size();
1911e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn        while (curTokenIndex > 0) {
1912e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            curTokenIndex--;
1913e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            WindowToken token = mWallpaperTokens.get(curTokenIndex);
19140586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn            if (token.hidden == visible) {
19150586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                token.hidden = !visible;
19160586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                // Need to do a layout to ensure the wallpaper now has the
19170586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                // correct size.
19180586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                mLayoutNeeded = true;
19190586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn            }
1920ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1921e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            int curWallpaperIndex = token.windows.size();
1922e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            while (curWallpaperIndex > 0) {
1923e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                curWallpaperIndex--;
1924e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                WindowState wallpaper = token.windows.get(curWallpaperIndex);
1925e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                if (visible) {
192619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    updateWallpaperOffsetLocked(wallpaper, dw, dh, false);
1927e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                }
1928ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1929e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                if (wallpaper.mWallpaperVisible != visible) {
1930e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    wallpaper.mWallpaperVisible = visible;
1931e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    try {
19328a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_VISIBILITY || DEBUG_WALLPAPER) Slog.v(TAG,
193325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                "Updating visibility of wallpaper " + wallpaper
1934e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                                + ": " + visible);
1935e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                        wallpaper.mClient.dispatchAppVisibility(visible);
1936e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    } catch (RemoteException e) {
1937e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    }
1938e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                }
1939e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            }
1940e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn        }
1941e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn    }
194290d2db3d21d07c2a4b4cbbc558f5ec59d20098c3Dianne Hackborn
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int addWindow(Session session, IWindow client,
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowManager.LayoutParams attrs, int viewVisibility,
194546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            Rect outContentInsets, InputChannel outInputChannel) {
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int res = mPolicy.checkAddPermission(attrs);
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (res != WindowManagerImpl.ADD_OKAY) {
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return res;
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
195006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean reportNewConfig = false;
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState attachedWindow = null;
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState win = null;
19545132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn        long origId;
195506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDisplay == null) {
19585132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn                throw new IllegalStateException("Display has not been initialialized");
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
196006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mWindowMap.containsKey(client.asBinder())) {
19628a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Window " + client + " is already added");
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return WindowManagerImpl.ADD_DUPLICATE_ADD;
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (attrs.type >= FIRST_SUB_WINDOW && attrs.type <= LAST_SUB_WINDOW) {
1967e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                attachedWindow = windowForClientLocked(null, attrs.token, false);
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attachedWindow == null) {
19698a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add window with token that is not a window: "
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          + attrs.token + ".  Aborting.");
19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN;
19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attachedWindow.mAttrs.type >= FIRST_SUB_WINDOW
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && attachedWindow.mAttrs.type <= LAST_SUB_WINDOW) {
19758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add window with token that is a sub-window: "
19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + attrs.token + ".  Aborting.");
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN;
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean addToken = false;
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken token = mTokenMap.get(attrs.token);
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token == null) {
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attrs.type >= FIRST_APPLICATION_WINDOW
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && attrs.type <= LAST_APPLICATION_WINDOW) {
19868a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add application window with unknown token "
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          + attrs.token + ".  Aborting.");
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_BAD_APP_TOKEN;
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attrs.type == TYPE_INPUT_METHOD) {
19918a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add input method window with unknown token "
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          + attrs.token + ".  Aborting.");
19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_BAD_APP_TOKEN;
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                if (attrs.type == TYPE_WALLPAPER) {
19968a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add wallpaper window with unknown token "
19974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                          + attrs.token + ".  Aborting.");
19984c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    return WindowManagerImpl.ADD_BAD_APP_TOKEN;
19994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
20006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                token = new WindowToken(this, attrs.token, -1, false);
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                addToken = true;
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (attrs.type >= FIRST_APPLICATION_WINDOW
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && attrs.type <= LAST_APPLICATION_WINDOW) {
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AppWindowToken atoken = token.appWindowToken;
20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (atoken == null) {
20068a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add window with non-application token "
20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          + token + ".  Aborting.");
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_NOT_APP_TOKEN;
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (atoken.removed) {
20108a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add window with exiting application token "
20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          + token + ".  Aborting.");
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_APP_EXITING;
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attrs.type == TYPE_APPLICATION_STARTING && atoken.firstWindowDrawn) {
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // No need for this guy!
20168a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (localLOGV) Slog.v(
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            TAG, "**** NO NEED TO START: " + attrs.getTitle());
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_STARTING_NOT_NEEDED;
20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (attrs.type == TYPE_INPUT_METHOD) {
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (token.windowType != TYPE_INPUT_METHOD) {
20228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add input method window with bad token "
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + attrs.token + ".  Aborting.");
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      return WindowManagerImpl.ADD_BAD_APP_TOKEN;
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20264c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            } else if (attrs.type == TYPE_WALLPAPER) {
20274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                if (token.windowType != TYPE_WALLPAPER) {
20288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add wallpaper window with bad token "
20294c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                            + attrs.token + ".  Aborting.");
20304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                      return WindowManagerImpl.ADD_BAD_APP_TOKEN;
20314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            win = new WindowState(this, session, client, token,
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    attachedWindow, attrs, viewVisibility);
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.mDeathRecipient == null) {
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Client has apparently died, so there is no reason to
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // continue.
20398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Adding window client " + client.asBinder()
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " that is dead, aborting.");
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return WindowManagerImpl.ADD_APP_EXITING;
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPolicy.adjustWindowParamsLw(win.mAttrs);
204506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            res = mPolicy.prepareAddWindowLw(win, attrs);
20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res != WindowManagerImpl.ADD_OKAY) {
20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return res;
20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
205046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
205100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            if (outInputChannel != null) {
205200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                String name = win.makeInputChannelName();
205300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                InputChannel[] inputChannels = InputChannel.openInputChannelPair(name);
205400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                win.mInputChannel = inputChannels[0];
205500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                inputChannels[1].transferToBinderOutParameter(outInputChannel);
205600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown
2057928e054931d357326613c78e62f4d850b7c442ffJeff Brown                mInputManager.registerInputChannel(win.mInputChannel, win.mInputWindowHandle);
205846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            }
20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // From now on, no exceptions or errors allowed!
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            res = WindowManagerImpl.ADD_OKAY;
206306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20645132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            origId = Binder.clearCallingIdentity();
206506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (addToken) {
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTokenMap.put(attrs.token, token);
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.attach();
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowMap.put(client.asBinder(), win);
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (attrs.type == TYPE_APPLICATION_STARTING &&
20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    token.appWindowToken != null) {
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                token.appWindowToken.startingWindow = win;
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean imMayMove = true;
207806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (attrs.type == TYPE_INPUT_METHOD) {
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInputMethodWindow = win;
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                addInputMethodWindowToListLocked(win);
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imMayMove = false;
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (attrs.type == TYPE_INPUT_METHOD_DIALOG) {
20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInputMethodDialogs.add(win);
20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                addWindowToListInOrderLocked(win, true);
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                adjustInputMethodDialogsLocked();
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imMayMove = false;
20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                addWindowToListInOrderLocked(win, true);
209019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                if (attrs.type == TYPE_WALLPAPER) {
209119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    mLastWallpaperTimeoutTime = 0;
209219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    adjustWallpaperWindowsLocked();
209319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                } else if ((attrs.flags&FLAG_SHOW_WALLPAPER) != 0) {
20944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    adjustWallpaperWindowsLocked();
20954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
209706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mEnterAnimationPending = true;
209906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPolicy.getContentInsetHintLw(attrs, outContentInsets);
210106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mInTouchMode) {
21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                res |= WindowManagerImpl.ADD_FLAG_IN_TOUCH_MODE;
21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win == null || win.mAppToken == null || !win.mAppToken.clientHidden) {
21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                res |= WindowManagerImpl.ADD_FLAG_APP_VISIBLE;
21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
210806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21092e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown            mInputMonitor.setUpdateInputWindowsNeededLw();
21102e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown
2111c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            boolean focusChanged = false;
21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.canReceiveKeys()) {
21133a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                focusChanged = updateFocusedWindowLocked(UPDATE_FOCUS_WILL_ASSIGN_LAYERS,
21143a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        false /*updateInputWindows*/);
2115349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown                if (focusChanged) {
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    imMayMove = false;
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
211906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imMayMove) {
212106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                moveInputMethodWindowsIfNeededLocked(false);
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
212306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assignLayersLocked();
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Don't do layout here, the window must call
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // relayout to be displayed, so we'll do it there.
212706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //dump();
21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2130c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            if (focusChanged) {
21313a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                finishUpdateFocusedWindowAfterAssignLayersLocked(false /*updateInputWindows*/);
2132c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            }
21332e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown            mInputMonitor.updateInputWindowsLw(false /*force*/);
21343a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown
21358a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (localLOGV) Slog.v(
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "New client " + client.asBinder()
21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ": window=" + win);
2138e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
213994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            if (win.isVisibleOrAdding() && updateOrientationFromAppTokensLocked(false)) {
2140e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                reportNewConfig = true;
2141e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (reportNewConfig) {
21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendNewConfiguration();
21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21475132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn
21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
214906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return res;
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
215206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeWindow(Session session, IWindow client) {
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
2155e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            WindowState win = windowForClientLocked(session, client, false);
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win == null) {
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            removeWindowLocked(session, win);
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
216206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeWindowLocked(Session session, WindowState win) {
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (localLOGV || DEBUG_FOCUS) Slog.v(
21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Remove " + win + " client="
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + Integer.toHexString(System.identityHashCode(
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mClient.asBinder()))
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + ", surface=" + win.mSurface);
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long origId = Binder.clearCallingIdentity();
2172c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
2173c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        win.disposeInputChannel();
217406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_APP_TRANSITIONS) Slog.v(
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Remove " + win + ": mSurface=" + win.mSurface
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " mExiting=" + win.mExiting
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " isAnimating=" + win.isAnimating()
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " app-animation="
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + (win.mAppToken != null ? win.mAppToken.animation : null)
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " inPendingTransaction="
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + (win.mAppToken != null ? win.mAppToken.inPendingTransaction : false)
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " mDisplayFrozen=" + mDisplayFrozen);
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Visibility of the removed window. Will be used later to update orientation later on.
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean wasVisible = false;
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // First, see if we need to run an animation.  If we do, we have
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // to hold off on removing the window until the animation is done.
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // If the display is frozen, just remove immediately, since the
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // animation wouldn't be seen.
2190de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn        if (win.mSurface != null && !mDisplayFrozen && mPolicy.isScreenOn()) {
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If we are not currently running the exit animation, we
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // need to see about starting one.
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wasVisible=win.isWinVisibleLw()) {
219406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int transit = WindowManagerPolicy.TRANSIT_EXIT;
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.getAttrs().type == TYPE_APPLICATION_STARTING) {
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    transit = WindowManagerPolicy.TRANSIT_PREVIEW_DONE;
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Try starting an animation.
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (applyAnimationLocked(win, transit, false)) {
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mExiting = true;
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.mExiting || win.isAnimating()) {
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // The exit animation is running... wait for it!
22068a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                //Slog.i(TAG, "*** Running exit animation...");
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mExiting = true;
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mRemoveOnExit = true;
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutNeeded = true;
22103a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
22113a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        false /*updateInputWindows*/);
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                performLayoutAndPlaceSurfacesLocked();
22132e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                mInputMonitor.updateInputWindowsLw(false /*force*/);
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.mAppToken != null) {
22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mAppToken.updateReportedVisibilityLocked();
22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //dump();
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.restoreCallingIdentity(origId);
22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        removeWindowInnerLocked(session, win);
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Removing a visible window will effect the computed orientation
22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // So just update orientation if needed.
2226c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        if (wasVisible && computeForcedAppOrientationLocked()
2227e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                != mForcedAppOrientation
222894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                && updateOrientationFromAppTokensLocked(false)) {
2229e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22313a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/);
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
223406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void removeWindowInnerLocked(Session session, WindowState win) {
2236f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        if (win.mRemoved) {
2237f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            // Nothing to do.
2238f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            return;
2239f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        }
2240f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn
2241f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        for (int i=win.mChildWindows.size()-1; i>=0; i--) {
2242f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            WindowState cwin = win.mChildWindows.get(i);
2243f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            Slog.w(TAG, "Force-removing child win " + cwin + " from container "
2244f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    + win);
2245f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            removeWindowInnerLocked(cwin.mSession, cwin);
2246f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        }
2247f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        win.mRemoved = true;
224906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mInputMethodTarget == win) {
22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            moveInputMethodWindowsIfNeededLocked(false);
22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
225306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
2254bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        if (false) {
2255bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn            RuntimeException e = new RuntimeException("here");
2256bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn            e.fillInStackTrace();
22578a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Removing window " + win, e);
2258bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        }
2259ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPolicy.removeWindowLw(win);
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        win.removeLocked();
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2263f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        if (DEBUG_ADD_REMOVE) Slog.v(TAG, "removeWindowInnerLocked: " + win);
22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowMap.remove(win.mClient.asBinder());
22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindows.remove(win);
2266f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        mPendingRemove.remove(win);
2267dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        mWindowsChanged = true;
22688a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Final remove of window: " + win);
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mInputMethodWindow == win) {
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInputMethodWindow = null;
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (win.mAttrs.type == TYPE_INPUT_METHOD_DIALOG) {
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInputMethodDialogs.remove(win);
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
227506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final WindowToken token = win.mToken;
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final AppWindowToken atoken = win.mAppToken;
2278f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Removing " + win + " from " + token);
22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        token.windows.remove(win);
22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (atoken != null) {
22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            atoken.allAppWindows.remove(win);
22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22838a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (localLOGV) Slog.v(
22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "**** Removing window " + win + ": count="
22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + token.windows.size());
22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (token.windows.size() == 0) {
22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!token.explicit) {
22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTokenMap.remove(token.token);
22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (atoken != null) {
22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                atoken.firstWindowDrawn = false;
22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (atoken != null) {
22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (atoken.startingWindow == win) {
22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                atoken.startingWindow = null;
22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (atoken.allAppWindows.size() == 0 && atoken.startingData != null) {
22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this is the last window and we had requested a starting
22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // transition window, well there is no point now.
23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                atoken.startingData = null;
23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (atoken.allAppWindows.size() == 1 && atoken.startingView != null) {
23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this is the last window except for a starting transition
23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // window, we need to get rid of the starting transition.
23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_STARTING_WINDOW) {
23058a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "Schedule remove starting " + token
23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + ": no more real windows");
23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Message m = mH.obtainMessage(H.REMOVE_STARTING, atoken);
23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mH.sendMessage(m);
23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
231206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
231319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn        if (win.mAttrs.type == TYPE_WALLPAPER) {
231419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            mLastWallpaperTimeoutTime = 0;
231519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            adjustWallpaperWindowsLocked();
231619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn        } else if ((win.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0) {
2317e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            adjustWallpaperWindowsLocked();
2318e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn        }
2319ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mInLayout) {
23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assignLayersLocked();
23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLayoutNeeded = true;
23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            performLayoutAndPlaceSurfacesLocked();
23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.mAppToken != null) {
23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mAppToken.updateReportedVisibilityLocked();
23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2328c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
23292e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown        mInputMonitor.updateInputWindowsLw(true /*force*/);
23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    static void logSurface(WindowState w, String msg, RuntimeException where) {
2333b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        String str = "  SURFACE " + Integer.toHexString(w.hashCode())
2334b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                + ": " + msg + " / " + w.mAttrs.getTitle();
2335b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        if (where != null) {
2336b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            Slog.i(TAG, str, where);
2337b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        } else {
2338b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            Slog.i(TAG, str);
2339b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        }
2340b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn    }
2341b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
23426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void setTransparentRegionWindow(Session session, IWindow client, Region region) {
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long origId = Binder.clearCallingIdentity();
23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mWindowMap) {
2346e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                WindowState w = windowForClientLocked(session, client, false);
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((w != null) && (w.mSurface != null)) {
234894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    if (SHOW_TRANSACTIONS) Slog.i(TAG,
234994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                            ">>> OPEN TRANSACTION setTransparentRegion");
23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Surface.openTransaction();
23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
2352b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        if (SHOW_TRANSACTIONS) logSurface(w,
2353b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                "transparentRegionHint=" + region, null);
23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mSurface.setTransparentRegionHint(region);
23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } finally {
23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Surface.closeTransaction();
235794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        if (SHOW_TRANSACTIONS) Slog.i(TAG,
235894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                                "<<< CLOSE TRANSACTION setTransparentRegion");
23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(origId);
23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setInsetsWindow(Session session, IWindow client,
236806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy            int touchableInsets, Rect contentInsets,
2369fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            Rect visibleInsets, Region touchableRegion) {
23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long origId = Binder.clearCallingIdentity();
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mWindowMap) {
2373e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                WindowState w = windowForClientLocked(session, client, false);
23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (w != null) {
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mGivenInsetsPending = false;
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mGivenContentInsets.set(contentInsets);
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mGivenVisibleInsets.set(visibleInsets);
2378fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    w.mGivenTouchableRegion.set(touchableRegion);
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mTouchableInsets = touchableInsets;
2380ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                    if (w.mGlobalScale != 1) {
2381ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                        w.mGivenContentInsets.scale(w.mGlobalScale);
2382ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                        w.mGivenVisibleInsets.scale(w.mGlobalScale);
2383ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                        w.mGivenTouchableRegion.scale(w.mGlobalScale);
2384ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                    }
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLayoutNeeded = true;
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    performLayoutAndPlaceSurfacesLocked();
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(origId);
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
239306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getWindowDisplayFrame(Session session, IWindow client,
23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Rect outDisplayFrame) {
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
2397e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            WindowState win = windowForClientLocked(session, client, false);
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win == null) {
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outDisplayFrame.setEmpty();
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outDisplayFrame.set(win.mDisplayFrame);
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2406bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen    public void setWindowWallpaperPositionLocked(WindowState window, float x, float y,
2407bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen            float xStep, float yStep) {
2408c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        if (window.mWallpaperX != x || window.mWallpaperY != y)  {
2409c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn            window.mWallpaperX = x;
2410c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn            window.mWallpaperY = y;
2411bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen            window.mWallpaperXStep = xStep;
2412bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen            window.mWallpaperYStep = yStep;
241373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            if (updateWallpaperOffsetLocked(window, true)) {
241473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                performLayoutAndPlaceSurfacesLocked();
2415c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn            }
2416c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        }
2417c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn    }
2418ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
24197580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn    void wallpaperCommandComplete(IBinder window, Bundle result) {
24207580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        synchronized (mWindowMap) {
24217580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            if (mWaitingOnWallpaper != null &&
24227580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    mWaitingOnWallpaper.mClient.asBinder() == window) {
24237580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                mWaitingOnWallpaper = null;
24247580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                mWindowMap.notifyAll();
24257580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            }
24267580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        }
24277580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn    }
2428ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
24297580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn    public Bundle sendWindowWallpaperCommandLocked(WindowState window,
24307580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            String action, int x, int y, int z, Bundle extras, boolean sync) {
24317580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        if (window == mWallpaperTarget || window == mLowerWallpaperTarget
24327580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                || window == mUpperWallpaperTarget) {
24337580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            boolean doWait = sync;
24347580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            int curTokenIndex = mWallpaperTokens.size();
24357580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            while (curTokenIndex > 0) {
24367580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                curTokenIndex--;
24377580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                WindowToken token = mWallpaperTokens.get(curTokenIndex);
24387580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                int curWallpaperIndex = token.windows.size();
24397580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                while (curWallpaperIndex > 0) {
24407580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    curWallpaperIndex--;
24417580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    WindowState wallpaper = token.windows.get(curWallpaperIndex);
24427580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    try {
24437580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        wallpaper.mClient.dispatchWallpaperCommand(action,
24447580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                x, y, z, extras, sync);
24457580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        // We only want to be synchronous with one wallpaper.
24467580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        sync = false;
24477580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    } catch (RemoteException e) {
24487580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    }
24497580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                }
24507580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            }
2451ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
24527580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            if (doWait) {
24537580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                // XXX Need to wait for result.
24547580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            }
24557580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        }
2456ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
24577580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        return null;
24587580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn    }
2459ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int relayoutWindow(Session session, IWindow client,
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowManager.LayoutParams attrs, int requestedWidth,
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int requestedHeight, int viewVisibility, boolean insetsPending,
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Rect outFrame, Rect outContentInsets, Rect outVisibleInsets,
2464694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            Configuration outConfig, Surface outSurface) {
24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean displayed = false;
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean inTouchMode;
2467e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        boolean configChanged;
2468ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato
2469ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato        // if they don't have this permission, mask out the status bar bits
2470ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato        if (attrs != null) {
2471a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (((attrs.systemUiVisibility|attrs.subtreeSystemUiVisibility)
2472a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    & StatusBarManager.DISABLE_MASK) != 0) {
2473a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR)
2474a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        != PackageManager.PERMISSION_GRANTED) {
2475a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    attrs.systemUiVisibility &= ~StatusBarManager.DISABLE_MASK;
2476a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    attrs.subtreeSystemUiVisibility &= ~StatusBarManager.DISABLE_MASK;
2477a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                }
2478ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato            }
2479ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato        }
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long origId = Binder.clearCallingIdentity();
248106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
2483e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            WindowState win = windowForClientLocked(session, client, false);
24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win == null) {
24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return 0;
24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mRequestedWidth = requestedWidth;
24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mRequestedHeight = requestedHeight;
24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (attrs != null) {
24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPolicy.adjustWindowParamsLw(attrs);
24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
249306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int attrChanges = 0;
24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flagChanges = 0;
24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (attrs != null) {
24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                flagChanges = win.mAttrs.flags ^= attrs.flags;
24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                attrChanges = win.mAttrs.copyFrom(attrs);
24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_LAYOUT) Slog.v(TAG, "Relayout " + win + ": " + win.mAttrs);
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25035fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            win.mEnforceSizeCompat = (win.mAttrs.flags & FLAG_COMPATIBLE_WINDOW) != 0;
25045fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((attrChanges & WindowManager.LayoutParams.ALPHA_CHANGED) != 0) {
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mAlpha = attrs.alpha;
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final boolean scaledWindow =
25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ((win.mAttrs.flags & WindowManager.LayoutParams.FLAG_SCALED) != 0);
25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (scaledWindow) {
25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // requested{Width|Height} Surface's physical size
25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // attrs.{width|height} Size on screen
25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mHScale = (attrs.width  != requestedWidth)  ?
25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        (attrs.width  / (float)requestedWidth) : 1.0f;
25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mVScale = (attrs.height != requestedHeight) ?
25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        (attrs.height / (float)requestedHeight) : 1.0f;
25199b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn            } else {
25209b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn                win.mHScale = win.mVScale = 1;
25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean imMayMove = (flagChanges&(
25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM |
25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)) != 0;
252606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean focusMayChange = win.mViewVisibility != viewVisibility
25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || ((flagChanges&WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) != 0)
25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || (!win.mRelayoutCalled);
253006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
25314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            boolean wallpaperMayMove = win.mViewVisibility != viewVisibility
25324c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    && (win.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0;
2533ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mRelayoutCalled = true;
25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int oldVisibility = win.mViewVisibility;
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mViewVisibility = viewVisibility;
25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (viewVisibility == View.VISIBLE &&
25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (win.mAppToken == null || !win.mAppToken.clientHidden)) {
25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                displayed = !win.isVisibleLw();
25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.mExiting) {
25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mExiting = false;
25423fe3851753e3623d3c7c468efa6ee17f17f9aa74Brad Fitzpatrick                    if (win.mAnimation != null) {
25433fe3851753e3623d3c7c468efa6ee17f17f9aa74Brad Fitzpatrick                        win.mAnimation.cancel();
25443fe3851753e3623d3c7c468efa6ee17f17f9aa74Brad Fitzpatrick                        win.mAnimation = null;
25453fe3851753e3623d3c7c468efa6ee17f17f9aa74Brad Fitzpatrick                    }
25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.mDestroying) {
25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mDestroying = false;
25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mDestroySurface.remove(win);
25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (oldVisibility == View.GONE) {
25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mEnterAnimationPending = true;
25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2554694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                if (displayed) {
2555694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    if (win.mSurface != null && !win.mDrawPending
2556694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            && !win.mCommitDrawPending && !mDisplayFrozen
2557694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            && mPolicy.isScreenOn()) {
2558694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        applyEnterAnimationLocked(win);
2559694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    }
2560694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    if ((win.mAttrs.flags
2561694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            & WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON) != 0) {
2562694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        if (DEBUG_VISIBILITY) Slog.v(TAG,
2563694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                "Relayout window turning screen on: " + win);
2564694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        win.mTurnOnScreen = true;
2565694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    }
2566694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    int diff = 0;
2567694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    if (win.mConfiguration != mCurConfiguration
2568694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            && (win.mConfiguration == null
2569694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                    || (diff=mCurConfiguration.diff(win.mConfiguration)) != 0)) {
2570694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        win.mConfiguration = mCurConfiguration;
2571694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        if (DEBUG_CONFIGURATION) {
2572694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            Slog.i(TAG, "Window " + win + " visible with new config: "
2573694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                    + win.mConfiguration + " / 0x"
2574694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                    + Integer.toHexString(diff));
2575694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        }
2576694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        outConfig.setTo(mCurConfiguration);
2577694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    }
257893e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                }
25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((attrChanges&WindowManager.LayoutParams.FORMAT_CHANGED) != 0) {
25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // To change the format, we need to re-build the surface.
25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.destroySurfaceLocked();
25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    displayed = true;
25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Surface surface = win.createSurfaceLocked();
25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (surface != null) {
25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outSurface.copyFrom(surface);
25883b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        win.mReportDestroySurface = false;
25893b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        win.mSurfacePendingDestroy = false;
25908a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (SHOW_TRANSACTIONS) Slog.i(TAG,
25910586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                "  OUT SURFACE " + outSurface + ": copied");
25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
25930586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                        // For some reason there isn't a surface.  Clear the
25940586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                        // caller's object so they see the same state.
25950586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                        outSurface.release();
25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (Exception e) {
25982e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                    mInputMonitor.updateInputWindowsLw(true /*force*/);
2599e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
26008a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Exception thrown when creating surface for client "
26010586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                             + client + " (" + win.mAttrs.getTitle() + ")",
26020586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                             e);
26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Binder.restoreCallingIdentity(origId);
26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return 0;
26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (displayed) {
26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    focusMayChange = true;
26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.mAttrs.type == TYPE_INPUT_METHOD
26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && mInputMethodWindow == null) {
26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mInputMethodWindow = win;
26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    imMayMove = true;
26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2614558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                if (win.mAttrs.type == TYPE_BASE_APPLICATION
2615558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                        && win.mAppToken != null
2616558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                        && win.mAppToken.startingWindow != null) {
2617558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                    // Special handling of starting window over the base
2618558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                    // window of the app: propagate lock screen flags to it,
2619558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                    // to provide the correct semantics while starting.
2620558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                    final int mask =
2621558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
2622ef73162887943e16587b8e737b19e59348338e8cMike Lockwood                        | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
2623ef73162887943e16587b8e737b19e59348338e8cMike Lockwood                        | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON;
2624558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                    WindowManager.LayoutParams sa = win.mAppToken.startingWindow.mAttrs;
2625558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                    sa.flags = (sa.flags&~mask) | (win.mAttrs.flags&mask);
2626558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                }
26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mEnterAnimationPending = false;
26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.mSurface != null) {
26308a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_VISIBILITY) Slog.i(TAG, "Relayout invis " + win
26313b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            + ": mExiting=" + win.mExiting
26323b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            + " mSurfacePendingDestroy=" + win.mSurfacePendingDestroy);
26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If we are not currently running the exit animation, we
26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // need to see about starting one.
26353b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    if (!win.mExiting || win.mSurfacePendingDestroy) {
26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Try starting an animation; if there isn't one, we
26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // can destroy the surface right away.
26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int transit = WindowManagerPolicy.TRANSIT_EXIT;
26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (win.getAttrs().type == TYPE_APPLICATION_STARTING) {
26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            transit = WindowManagerPolicy.TRANSIT_PREVIEW_DONE;
26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
26423b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        if (!win.mSurfacePendingDestroy && win.isWinVisibleLw() &&
26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              applyAnimationLocked(win, transit, false)) {
26443b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            focusMayChange = true;
26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            win.mExiting = true;
26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (win.isAnimating()) {
26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Currently in a hide animation... turn this into
26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // an exit.
26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            win.mExiting = true;
26506136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                        } else if (win == mWallpaperTarget) {
26516136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                            // If the wallpaper is currently behind this
26526136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                            // window, we need to change both of them inside
26536136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                            // of a transaction to avoid artifacts.
26546136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                            win.mExiting = true;
26556136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                            win.mAnimating = true;
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (mInputMethodWindow == win) {
26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                mInputMethodWindow = null;
26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            win.destroySurfaceLocked();
26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2664ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
26653b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                if (win.mSurface == null || (win.getAttrs().flags
26663b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        & WindowManager.LayoutParams.FLAG_KEEP_SURFACE_WHILE_ANIMATING) == 0
26673b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        || win.mSurfacePendingDestroy) {
26683b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // We are being called from a local process, which
26693b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // means outSurface holds its current surface.  Ensure the
26703b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // surface object is cleared, but we don't want it actually
26713b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // destroyed at this point.
26723b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    win.mSurfacePendingDestroy = false;
26733b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    outSurface.release();
26748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_VISIBILITY) Slog.i(TAG, "Releasing surface in: " + win);
26753b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                } else if (win.mSurface != null) {
26768a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_VISIBILITY) Slog.i(TAG,
26773b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            "Keeping surface, will report destroy: " + win);
26783b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    win.mReportDestroySurface = true;
26793b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    outSurface.copyFrom(win.mSurface);
26803b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                }
26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (focusMayChange) {
26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //System.out.println("Focus may change: " + win.mAttrs.getTitle());
26853a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                if (updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
26863a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        false /*updateInputWindows*/)) {
26879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    imMayMove = false;
26889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //System.out.println("Relayout " + win + ": focus=" + mCurrentFocus);
26909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
269106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
2692c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            // updateFocusedWindowLocked() already assigned layers so we only need to
2693c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            // reassign them at this point if the IM window state gets shuffled
2694c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            boolean assignLayers = false;
269506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imMayMove) {
26978abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn                if (moveInputMethodWindowsIfNeededLocked(false) || displayed) {
26988abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn                    // Little hack here -- we -should- be able to rely on the
26998abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn                    // function to return true if the IME has moved and needs
27008abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn                    // its layer recomputed.  However, if the IME was hidden
27018abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn                    // and isn't actually moved in the list, its layer may be
27028abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn                    // out of data so we make sure to recompute it.
27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    assignLayers = true;
27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27064c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            if (wallpaperMayMove) {
27070586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                if ((adjustWallpaperWindowsLocked()&ADJUST_WALLPAPER_LAYERS_CHANGED) != 0) {
27084c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    assignLayers = true;
27094c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
27104c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
271106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLayoutNeeded = true;
27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mGivenInsetsPending = insetsPending;
27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assignLayers) {
27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                assignLayersLocked();
27169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
271794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            configChanged = updateOrientationFromAppTokensLocked(false);
27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            performLayoutAndPlaceSurfacesLocked();
2719284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            if (displayed && win.mIsWallpaper) {
272081e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn                updateWallpaperOffsetLocked(win, mAppDisplayWidth, mAppDisplayHeight, false);
2721284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            }
27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.mAppToken != null) {
27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mAppToken.updateReportedVisibilityLocked();
27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2725ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            outFrame.set(win.mCompatFrame);
27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outContentInsets.set(win.mContentInsets);
27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outVisibleInsets.set(win.mVisibleInsets);
27288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (localLOGV) Slog.v(
27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Relayout given client " + client.asBinder()
273006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                + ", requestedWidth=" + requestedWidth
27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", requestedHeight=" + requestedHeight
27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", viewVisibility=" + viewVisibility
27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "\nRelayout returning frame=" + outFrame
27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", surface=" + outSurface);
27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27368a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (localLOGV || DEBUG_FOCUS) Slog.v(
27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Relayout of " + win + ": focusMayChange=" + focusMayChange);
27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            inTouchMode = mInTouchMode;
2740e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
27412e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown            mInputMonitor.updateInputWindowsLw(true /*force*/);
27429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2744e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        if (configChanged) {
27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendNewConfiguration();
27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
274706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
274906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (inTouchMode ? WindowManagerImpl.RELAYOUT_IN_TOUCH_MODE : 0)
27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                | (displayed ? WindowManagerImpl.RELAYOUT_FIRST_TIME : 0);
27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2754648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn    public boolean outOfMemoryWindow(Session session, IWindow client) {
2755648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        long origId = Binder.clearCallingIdentity();
2756648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn
2757648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        try {
2758648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn            synchronized(mWindowMap) {
2759648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                WindowState win = windowForClientLocked(session, client, false);
2760648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                if (win == null) {
2761648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                    return false;
2762648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                }
2763648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                return reclaimSomeSurfaceMemoryLocked(win, "from-client", false);
2764648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn            }
2765648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        } finally {
2766648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn            Binder.restoreCallingIdentity(origId);
2767648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        }
2768648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn    }
2769648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn
27709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finishDrawingWindow(Session session, IWindow client) {
27719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long origId = Binder.clearCallingIdentity();
27729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
2773e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            WindowState win = windowForClientLocked(session, client, false);
27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win != null && win.finishDrawingLocked()) {
2775759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                if ((win.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0) {
2776759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    adjustWallpaperWindowsLocked();
2777759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                }
27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutNeeded = true;
27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                performLayoutAndPlaceSurfacesLocked();
27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27857961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov    public float getWindowCompatibilityScale(IBinder windowToken) {
27867961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov        synchronized (mWindowMap) {
27877961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov            WindowState windowState = mWindowMap.get(windowToken);
27887961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov            return (windowState != null) ? windowState.mGlobalScale : 1.0f;
27897961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov        }
27907961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov    }
27917961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov
27929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private AttributeCache.Entry getCachedAnimations(WindowManager.LayoutParams lp) {
279308121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn        if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: layout params pkg="
27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + (lp != null ? lp.packageName : null)
27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " resId=0x" + (lp != null ? Integer.toHexString(lp.windowAnimations) : null));
27969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (lp != null && lp.windowAnimations != 0) {
27979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If this is a system resource, don't try to load it from the
27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // application resources.  It is nice to avoid loading application
27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // resources if we can.
28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String packageName = lp.packageName != null ? lp.packageName : "android";
28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int resId = lp.windowAnimations;
28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((resId&0xFF000000) == 0x01000000) {
28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                packageName = "android";
28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28058a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: picked package="
28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + packageName);
28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return AttributeCache.instance().get(packageName, resId,
28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.WindowAnimation);
28099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
281206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
28133b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    private AttributeCache.Entry getCachedAnimations(String packageName, int resId) {
281408121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn        if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: package="
28153b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                + packageName + " resId=0x" + Integer.toHexString(resId));
28163b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        if (packageName != null) {
28173b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if ((resId&0xFF000000) == 0x01000000) {
28183b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                packageName = "android";
28193b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            }
28208a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: picked package="
28213b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    + packageName);
28223b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            return AttributeCache.instance().get(packageName, resId,
28233b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    com.android.internal.R.styleable.WindowAnimation);
28243b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        }
28253b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        return null;
28263b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    }
28273b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn
28286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void applyEnterAnimationLocked(WindowState win) {
28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int transit = WindowManagerPolicy.TRANSIT_SHOW;
28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (win.mEnterAnimationPending) {
28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mEnterAnimationPending = false;
28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            transit = WindowManagerPolicy.TRANSIT_ENTER;
28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        applyAnimationLocked(win, transit, true);
28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean applyAnimationLocked(WindowState win,
28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int transit, boolean isEntrance) {
28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (win.mLocalAnimating && win.mAnimationIsEntrance == isEntrance) {
28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If we are trying to apply an animation, but already running
28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // an animation of the same type, then just leave that one alone.
28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
284506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Only apply an animation if the display isn't frozen.  If it is
28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // frozen, there is no reason to animate and it can cause strange
28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // artifacts when we unfreeze the display if some different animation
28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // is running.
2850de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn        if (!mDisplayFrozen && mPolicy.isScreenOn()) {
28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int anim = mPolicy.selectAnimationLw(win, transit);
28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int attr = -1;
28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Animation a = null;
28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (anim != 0) {
28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                a = AnimationUtils.loadAnimation(mContext, anim);
28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                switch (transit) {
28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case WindowManagerPolicy.TRANSIT_ENTER:
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        attr = com.android.internal.R.styleable.WindowAnimation_windowEnterAnimation;
28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case WindowManagerPolicy.TRANSIT_EXIT:
28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        attr = com.android.internal.R.styleable.WindowAnimation_windowExitAnimation;
28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case WindowManagerPolicy.TRANSIT_SHOW:
28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        attr = com.android.internal.R.styleable.WindowAnimation_windowShowAnimation;
28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case WindowManagerPolicy.TRANSIT_HIDE:
28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        attr = com.android.internal.R.styleable.WindowAnimation_windowHideAnimation;
28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
28709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attr >= 0) {
28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    a = loadAnimation(win.mAttrs, attr);
28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_ANIM) Slog.v(TAG, "applyAnimation: win=" + win
28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " anim=" + anim + " attr=0x" + Integer.toHexString(attr)
28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mAnimation=" + win.mAnimation
28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " isEntrance=" + isEntrance);
28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (a != null) {
28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_ANIM) {
2881b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    RuntimeException e = null;
2882b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (!HIDE_STACK_CRAWLS) {
2883b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        e = new RuntimeException();
2884b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        e.fillInStackTrace();
2885b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
28868a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "Loaded animation " + a + " for " + win, e);
28879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.setAnimation(a);
28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mAnimationIsEntrance = isEntrance;
28909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
28929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.clearAnimation();
28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return win.mAnimation != null;
28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Animation loadAnimation(WindowManager.LayoutParams lp, int animAttr) {
28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int anim = 0;
29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Context context = mContext;
29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (animAttr >= 0) {
29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AttributeCache.Entry ent = getCachedAnimations(lp);
29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ent != null) {
29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                context = ent.context;
29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                anim = ent.array.getResourceId(animAttr, 0);
29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (anim != 0) {
29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return AnimationUtils.loadAnimation(context, anim);
29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
291306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
29143b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    private Animation loadAnimation(String packageName, int resId) {
29153b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        int anim = 0;
29163b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        Context context = mContext;
29173b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        if (resId >= 0) {
29183b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            AttributeCache.Entry ent = getCachedAnimations(packageName, resId);
29193b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if (ent != null) {
29203b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                context = ent.context;
29213b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                anim = resId;
29223b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            }
29233b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        }
29243b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        if (anim != 0) {
29253b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            return AnimationUtils.loadAnimation(context, anim);
29263b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        }
29273b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        return null;
29283b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    }
29293b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn
29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean applyAnimationLocked(AppWindowToken wtoken,
2931ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            WindowManager.LayoutParams lp, int transit, boolean enter) {
29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Only apply an animation if the display isn't frozen.  If it is
29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // frozen, there is no reason to animate and it can cause strange
29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // artifacts when we unfreeze the display if some different animation
29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // is running.
2936de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn        if (!mDisplayFrozen && mPolicy.isScreenOn()) {
29370a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima            Animation a;
2938ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            if (mNextAppTransitionPackage != null) {
29393b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                a = loadAnimation(mNextAppTransitionPackage, enter ?
29403b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        mNextAppTransitionEnter : mNextAppTransitionExit);
29410a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima            } else {
29420a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                int animAttr = 0;
29430a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                switch (transit) {
29440a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                    case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN:
29450a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        animAttr = enter
29460a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                ? com.android.internal.R.styleable.WindowAnimation_activityOpenEnterAnimation
29470a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                : com.android.internal.R.styleable.WindowAnimation_activityOpenExitAnimation;
29480a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        break;
29490a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                    case WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE:
29500a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        animAttr = enter
29510a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                ? com.android.internal.R.styleable.WindowAnimation_activityCloseEnterAnimation
29520a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                : com.android.internal.R.styleable.WindowAnimation_activityCloseExitAnimation;
29530a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        break;
29540a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                    case WindowManagerPolicy.TRANSIT_TASK_OPEN:
29550a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        animAttr = enter
29560a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                ? com.android.internal.R.styleable.WindowAnimation_taskOpenEnterAnimation
29570a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                : com.android.internal.R.styleable.WindowAnimation_taskOpenExitAnimation;
29580a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        break;
29590a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                    case WindowManagerPolicy.TRANSIT_TASK_CLOSE:
29600a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        animAttr = enter
29610a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                ? com.android.internal.R.styleable.WindowAnimation_taskCloseEnterAnimation
29620a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                : com.android.internal.R.styleable.WindowAnimation_taskCloseExitAnimation;
29630a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        break;
29640a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                    case WindowManagerPolicy.TRANSIT_TASK_TO_FRONT:
29650a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        animAttr = enter
29660a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                ? com.android.internal.R.styleable.WindowAnimation_taskToFrontEnterAnimation
29670a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                : com.android.internal.R.styleable.WindowAnimation_taskToFrontExitAnimation;
29680a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        break;
29690a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                    case WindowManagerPolicy.TRANSIT_TASK_TO_BACK:
29700a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        animAttr = enter
29715a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima                                ? com.android.internal.R.styleable.WindowAnimation_taskToBackEnterAnimation
29720a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                : com.android.internal.R.styleable.WindowAnimation_taskToBackExitAnimation;
29730a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        break;
297425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                    case WindowManagerPolicy.TRANSIT_WALLPAPER_OPEN:
297525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        animAttr = enter
297625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                ? com.android.internal.R.styleable.WindowAnimation_wallpaperOpenEnterAnimation
297725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                : com.android.internal.R.styleable.WindowAnimation_wallpaperOpenExitAnimation;
297825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        break;
297925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                    case WindowManagerPolicy.TRANSIT_WALLPAPER_CLOSE:
298025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        animAttr = enter
298125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                ? com.android.internal.R.styleable.WindowAnimation_wallpaperCloseEnterAnimation
298225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                : com.android.internal.R.styleable.WindowAnimation_wallpaperCloseExitAnimation;
298325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        break;
298425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                    case WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_OPEN:
2985f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                        animAttr = enter
298625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenEnterAnimation
298725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenExitAnimation;
2988f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                        break;
298925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                    case WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_CLOSE:
2990f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                        animAttr = enter
299125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseEnterAnimation
299225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseExitAnimation;
2993f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                        break;
29940a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                }
2995bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                a = animAttr != 0 ? loadAnimation(lp, animAttr) : null;
29968a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_ANIM) Slog.v(TAG, "applyAnimation: wtoken=" + wtoken
29970a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        + " anim=" + a
29980a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        + " animAttr=0x" + Integer.toHexString(animAttr)
29990a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        + " transit=" + transit);
30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (a != null) {
30029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_ANIM) {
3003b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    RuntimeException e = null;
3004b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (!HIDE_STACK_CRAWLS) {
3005b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        e = new RuntimeException();
3006b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        e.fillInStackTrace();
3007b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
30088a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "Loaded animation " + a + " for " + wtoken, e);
30099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.setAnimation(a);
30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.clearAnimation();
30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return wtoken.animation != null;
30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Application Window Tokens
30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void validateAppTokens(List tokens) {
30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int v = tokens.size()-1;
30259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int m = mAppTokens.size()-1;
30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (v >= 0 && m >= 0) {
30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = mAppTokens.get(m);
30289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken.removed) {
30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                m--;
30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
30319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tokens.get(v) != wtoken.token) {
30338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Tokens out of sync: external is " + tokens.get(v)
30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + " @ " + v + ", internal is " + wtoken.token + " @ " + m);
30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            v--;
30379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            m--;
30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (v >= 0) {
30408a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "External token not found: " + tokens.get(v) + " @ " + v);
30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            v--;
30429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (m >= 0) {
30449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = mAppTokens.get(m);
30459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!wtoken.removed) {
30468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Invalid internal token: " + wtoken.token + " @ " + m);
30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            m--;
30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean checkCallingPermission(String permission, String func) {
30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Quick check: if the calling permission is me, it's all okay.
30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Binder.getCallingPid() == Process.myPid()) {
30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
305706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mContext.checkCallingPermission(permission)
30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                == PackageManager.PERMISSION_GRANTED) {
30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String msg = "Permission Denial: " + func + " from pid="
30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Binder.getCallingPid()
30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", uid=" + Binder.getCallingUid()
30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " requires " + permission;
30668a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        Slog.w(TAG, msg);
30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
306906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AppWindowToken findAppWindowToken(IBinder token) {
30719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowToken wtoken = mTokenMap.get(token);
30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wtoken == null) {
30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return wtoken.appWindowToken;
30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
307706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
30789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void addWindowToken(IBinder token, int type) {
30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
30809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "addWindowToken()")) {
3081cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
30829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
308306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
30859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken wtoken = mTokenMap.get(token);
30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken != null) {
30878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to add existing input method token: " + token);
30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            wtoken = new WindowToken(this, token, type, true);
30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTokenMap.put(token, wtoken);
30924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            if (type == TYPE_WALLPAPER) {
30934c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                mWallpaperTokens.add(wtoken);
30944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
309706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeWindowToken(IBinder token) {
30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "removeWindowToken()")) {
3101cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long origId = Binder.clearCallingIdentity();
31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken wtoken = mTokenMap.remove(token);
31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken != null) {
31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean delayed = false;
31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!wtoken.hidden) {
31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wtoken.hidden = true;
311106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int N = wtoken.windows.size();
31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean changed = false;
311406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i=0; i<N; i++) {
31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        WindowState win = wtoken.windows.get(i);
31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (win.isAnimating()) {
31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            delayed = true;
31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
312106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (win.isVisibleNow()) {
31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            applyAnimationLocked(win,
31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    WindowManagerPolicy.TRANSIT_EXIT, false);
31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            changed = true;
31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (changed) {
31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLayoutNeeded = true;
31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        performLayoutAndPlaceSurfacesLocked();
31323a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL,
31333a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                                false /*updateInputWindows*/);
31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
313506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (delayed) {
31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mExitingTokens.add(wtoken);
31384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    } else if (wtoken.windowType == TYPE_WALLPAPER) {
31394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                        mWallpaperTokens.remove(wtoken);
31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
314206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31432e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                mInputMonitor.updateInputWindowsLw(true /*force*/);
31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
31458a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to remove non-existing token: " + token);
31469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
31499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void addAppToken(int addPos, IApplicationToken token,
31529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int groupId, int requestedOrientation, boolean fullscreen) {
31539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
31549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "addAppToken()")) {
3155cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3157349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
3158349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // Get the dispatching timeout here while we are not holding any locks so that it
3159349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // can be cached by the AppWindowToken.  The timeout value is used later by the
3160349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // input dispatcher in code that does hold locks.  If we did not cache the value
3161349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // here we would run the chance of introducing a deadlock between the window manager
3162349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // (which holds locks while updating the input dispatcher state) and the activity manager
3163349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // (which holds locks while querying the application token).
3164349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        long inputDispatchingTimeoutNanos;
3165349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        try {
3166349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown            inputDispatchingTimeoutNanos = token.getKeyDispatchingTimeout() * 1000000L;
3167349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        } catch (RemoteException ex) {
3168349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown            Slog.w(TAG, "Could not get dispatching timeout.", ex);
3169349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown            inputDispatchingTimeoutNanos = DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS;
3170349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        }
317106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token.asBinder());
31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken != null) {
31758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to add existing app token: " + token);
31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            wtoken = new AppWindowToken(this, token);
3179349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown            wtoken.inputDispatchingTimeoutNanos = inputDispatchingTimeoutNanos;
31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.groupId = groupId;
31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.appFullscreen = fullscreen;
31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.requestedOrientation = requestedOrientation;
3183f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            if (DEBUG_TOKEN_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG, "addAppToken: " + wtoken);
31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAppTokens.add(addPos, wtoken);
31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTokenMap.put(token.asBinder(), wtoken);
318606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Application tokens start out hidden.
31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.hidden = true;
31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.hiddenRequested = true;
319006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //dump();
31929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
319406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAppGroupId(IBinder token, int groupId) {
31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppStartingIcon()")) {
3198cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token);
32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null) {
32048a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to set group id of non-existing app token: " + token);
32059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
32069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.groupId = groupId;
32089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
321006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
32119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getOrientationFromWindowsLocked() {
3212bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn        if (mDisplayFrozen || mOpeningApps.size() > 0 || mClosingApps.size() > 0) {
3213bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn            // If the display is frozen, some activities may be in the middle
3214bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn            // of restarting, and thus have removed their old window.  If the
3215bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn            // window has the flag to hide the lock screen, then the lock screen
3216bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn            // can re-appear and inflict its own orientation on us.  Keep the
3217bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn            // orientation stable until this all settles down.
3218bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn            return mLastWindowForcedOrientation;
3219bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn        }
3220bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn
32219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = mWindows.size() - 1;
32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (pos >= 0) {
3223e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState wtoken = mWindows.get(pos);
32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos--;
32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken.mAppToken != null) {
32269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We hit an application window. so the orientation will be determined by the
32279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // app window. No point in continuing further.
3228bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                return (mLastWindowForcedOrientation=ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3230b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate            if (!wtoken.isVisibleLw() || !wtoken.mPolicyVisibilityAfterAnim) {
32319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int req = wtoken.mAttrs.screenOrientation;
32349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if((req == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) ||
32359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (req == ActivityInfo.SCREEN_ORIENTATION_BEHIND)){
32369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
3238bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                return (mLastWindowForcedOrientation=req);
32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3241bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn        return (mLastWindowForcedOrientation=ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
32429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
324306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
32449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getOrientationFromAppTokensLocked() {
3245e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        int pos = mAppTokens.size() - 1;
3246e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        int curGroup = 0;
3247e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        int lastOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
3248e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        boolean findingBehind = false;
3249e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        boolean haveGroup = false;
3250e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        boolean lastFullscreen = false;
3251e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        while (pos >= 0) {
3252e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            AppWindowToken wtoken = mAppTokens.get(pos);
3253e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            pos--;
3254bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn
3255bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn            if (DEBUG_APP_ORIENTATION) Slog.v(TAG, "Checking app orientation: " + wtoken);
3256bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn
3257e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // if we're about to tear down this window and not seek for
3258e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // the behind activity, don't use it for orientation
3259e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            if (!findingBehind
3260e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    && (!wtoken.hidden && wtoken.hiddenRequested)) {
3261bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                if (DEBUG_ORIENTATION) Slog.v(TAG, "Skipping " + wtoken
3262bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                        + " -- going to hide");
3263e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                continue;
3264e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
3265e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
3266e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            if (!haveGroup) {
3267e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // We ignore any hidden applications on the top.
3268e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                if (wtoken.hiddenRequested || wtoken.willBeHidden) {
3269bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                    if (DEBUG_ORIENTATION) Slog.v(TAG, "Skipping " + wtoken
3270bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                            + " -- hidden on top");
3271105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    continue;
3272105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                }
3273e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                haveGroup = true;
3274e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                curGroup = wtoken.groupId;
3275e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                lastOrientation = wtoken.requestedOrientation;
3276e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            } else if (curGroup != wtoken.groupId) {
3277e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // If we have hit a new application group, and the bottom
3278e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // of the previous group didn't explicitly say to use
3279e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // the orientation behind it, and the last app was
3280e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // full screen, then we'll stick with the
3281e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // user's orientation.
3282e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                if (lastOrientation != ActivityInfo.SCREEN_ORIENTATION_BEHIND
3283e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                        && lastFullscreen) {
3284bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                    if (DEBUG_ORIENTATION) Slog.v(TAG, "Done at " + wtoken
3285bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                            + " -- end of group, return " + lastOrientation);
3286e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    return lastOrientation;
3287e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                }
3288e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
3289e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            int or = wtoken.requestedOrientation;
3290e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // If this application is fullscreen, and didn't explicitly say
3291e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // to use the orientation behind it, then just take whatever
3292e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // orientation it has and ignores whatever is under it.
3293e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            lastFullscreen = wtoken.appFullscreen;
3294e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            if (lastFullscreen
3295e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    && or != ActivityInfo.SCREEN_ORIENTATION_BEHIND) {
3296bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                if (DEBUG_ORIENTATION) Slog.v(TAG, "Done at " + wtoken
3297bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                        + " -- full screen, return " + or);
3298e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                return or;
3299e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
3300e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // If this application has requested an explicit orientation,
3301e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // then use it.
3302e5439f228f603f60febe058f633d91d5af2fff76Dianne Hackborn            if (or != ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
3303e5439f228f603f60febe058f633d91d5af2fff76Dianne Hackborn                    && or != ActivityInfo.SCREEN_ORIENTATION_BEHIND) {
3304bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                if (DEBUG_ORIENTATION) Slog.v(TAG, "Done at " + wtoken
3305bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                        + " -- explicitly set, return " + or);
3306e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                return or;
3307e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
3308e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            findingBehind |= (or == ActivityInfo.SCREEN_ORIENTATION_BEHIND);
3309e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        }
3310bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn        if (DEBUG_ORIENTATION) Slog.v(TAG, "No app is requesting an orientation");
3311e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
33129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
331306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
33149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Configuration updateOrientationFromAppTokens(
3315105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            Configuration currentConfig, IBinder freezeThisOneIfNeeded) {
3316cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
3317cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn                "updateOrientationFromAppTokens()")) {
3318cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
3319cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn        }
3320ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
3321e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        Configuration config = null;
33229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long ident = Binder.clearCallingIdentity();
3323e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
33249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
33257916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            config = updateOrientationFromAppTokensLocked(currentConfig,
33267916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    freezeThisOneIfNeeded);
33277916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
33287916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
33297916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        Binder.restoreCallingIdentity(ident);
33307916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        return config;
33317916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    }
33327916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
33337916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    private Configuration updateOrientationFromAppTokensLocked(
33347916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            Configuration currentConfig, IBinder freezeThisOneIfNeeded) {
33357916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        Configuration config = null;
33367916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
33377916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        if (updateOrientationFromAppTokensLocked(false)) {
33387916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (freezeThisOneIfNeeded != null) {
33397916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                AppWindowToken wtoken = findAppWindowToken(
33407916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        freezeThisOneIfNeeded);
33417916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                if (wtoken != null) {
33427916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    startAppFreezingScreenLocked(wtoken,
33437916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                            ActivityInfo.CONFIG_ORIENTATION);
33447916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                }
33457916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
33467916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            config = computeNewConfigurationLocked();
33477916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
33487916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        } else if (currentConfig != null) {
33497916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            // No obvious action we need to take, but if our current
33507916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            // state mismatches the activity manager's, update it,
33517916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            // disregarding font scale, which should remain set to
33527916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            // the value of the previous configuration.
33537916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            mTempConfiguration.setToDefaults();
33547916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            mTempConfiguration.fontScale = currentConfig.fontScale;
33557916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (computeNewConfigurationLocked(mTempConfiguration)) {
33567916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                if (currentConfig.diff(mTempConfiguration) != 0) {
33577916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    mWaitingForConfig = true;
33587916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    mLayoutNeeded = true;
33597916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    startFreezingDisplayLocked(false);
33607916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    config = new Configuration(mTempConfiguration);
3361e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                }
3362bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn            }
33639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3364e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
33659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return config;
33669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
336706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
33689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
3369e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * Determine the new desired orientation of the display, returning
3370e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * a non-null new Configuration if it has changed from the current
3371e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * orientation.  IF TRUE IS RETURNED SOMEONE MUST CALL
3372e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * setNewConfiguration() TO TELL THE WINDOW MANAGER IT CAN UNFREEZE THE
3373e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * SCREEN.  This will typically be done for you if you call
3374e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * sendNewConfiguration().
3375e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     *
33769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The orientation is computed from non-application windows first. If none of
33779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the non-application windows specify orientation, the orientation is computed from
337806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     * application tokens.
33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.IWindowManager#updateOrientationFromAppTokens(
33809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * android.os.IBinder)
33819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
338294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn    boolean updateOrientationFromAppTokensLocked(boolean inTransaction) {
33839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean changed = false;
33849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long ident = Binder.clearCallingIdentity();
33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3386c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            int req = computeForcedAppOrientationLocked();
338706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
33889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (req != mForcedAppOrientation) {
33899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mForcedAppOrientation = req;
33909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //send a message to Policy indicating orientation change to take
33919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //action like disabling/enabling sensors etc.,
3392c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                mPolicy.setCurrentOrientationLw(req);
3393e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                if (setRotationUncheckedLocked(WindowManagerPolicy.USE_LAST_ROTATION,
339494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        mLastRotationFlags | Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE,
339594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        inTransaction)) {
3396e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    changed = true;
33979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
33989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3399105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
3400e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            return changed;
34019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
34029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(ident);
34039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
340506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3406c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    int computeForcedAppOrientationLocked() {
3407c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        int req = getOrientationFromWindowsLocked();
3408c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        if (req == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) {
3409c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            req = getOrientationFromAppTokensLocked();
3410c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        }
3411c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        return req;
3412c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
341306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3414e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    public void setNewConfiguration(Configuration config) {
3415e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
3416e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                "setNewConfiguration()")) {
3417e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
3418e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        }
3419e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
3420e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        synchronized(mWindowMap) {
3421e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            mCurConfiguration = new Configuration(config);
3422e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            mWaitingForConfig = false;
3423e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            performLayoutAndPlaceSurfacesLocked();
3424e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        }
3425e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    }
3426e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
34279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAppOrientation(IApplicationToken token, int requestedOrientation) {
34289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
34299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppOrientation()")) {
3430cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
34319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
343206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
34339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
34349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token.asBinder());
34359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null) {
34368a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to set orientation of non-existing app token: " + token);
34379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
34389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
343906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
34409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.requestedOrientation = requestedOrientation;
34419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
344306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
34449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getAppOrientation(IApplicationToken token) {
34459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
34469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token.asBinder());
34479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null) {
34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
34499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
345006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return wtoken.requestedOrientation;
34529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
345406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setFocusedApp(IBinder token, boolean moveFocusNow) {
34569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
34579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setFocusedApp()")) {
3458cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
34599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
34629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean changed = false;
34639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token == null) {
34648a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_FOCUS) Slog.v(TAG, "Clearing focused app, was " + mFocusedApp);
34659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                changed = mFocusedApp != null;
34669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFocusedApp = null;
346700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                if (changed) {
346800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    mInputMonitor.setFocusedAppLw(null);
3469349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown                }
34709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
34719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AppWindowToken newFocus = findAppWindowToken(token);
34729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (newFocus == null) {
34738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to set focus to non-existing app token: " + token);
34749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
34759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                changed = mFocusedApp != newFocus;
34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFocusedApp = newFocus;
34788a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_FOCUS) Slog.v(TAG, "Set focused app to: " + mFocusedApp);
347900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                if (changed) {
348000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    mInputMonitor.setFocusedAppLw(newFocus);
3481349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown                }
34829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (moveFocusNow && changed) {
34859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final long origId = Binder.clearCallingIdentity();
34863a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/);
34879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.restoreCallingIdentity(origId);
34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34927da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn    public void prepareAppTransition(int transit, boolean alwaysKeepCurrent) {
34939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
34949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "prepareAppTransition()")) {
3495cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
34969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
349706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
34989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
34998a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_APP_TRANSITIONS) Slog.v(
35009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    TAG, "Prepare app transition: transit=" + transit
35019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mNextAppTransition=" + mNextAppTransition);
3502b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn            if (!mDisplayFrozen && mPolicy.isScreenOn()) {
3503bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET
3504bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                        || mNextAppTransition == WindowManagerPolicy.TRANSIT_NONE) {
35059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNextAppTransition = transit;
35067da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                } else if (!alwaysKeepCurrent) {
35077da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    if (transit == WindowManagerPolicy.TRANSIT_TASK_OPEN
35087da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            && mNextAppTransition == WindowManagerPolicy.TRANSIT_TASK_CLOSE) {
35097da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        // Opening a new task always supersedes a close for the anim.
35107da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        mNextAppTransition = transit;
35117da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    } else if (transit == WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN
35127da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            && mNextAppTransition == WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE) {
35137da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        // Opening a new activity always supersedes a close for the anim.
35147da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        mNextAppTransition = transit;
35157da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    }
35169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppTransitionReady = false;
35189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppTransitionTimeout = false;
35199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStartingIconInTransition = false;
35209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSkipAppTransitionAnimation = false;
35219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mH.removeMessages(H.APP_TRANSITION_TIMEOUT);
35229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mH.sendMessageDelayed(mH.obtainMessage(H.APP_TRANSITION_TIMEOUT),
35239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        5000);
35249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getPendingAppTransition() {
35299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mNextAppTransition;
35309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
353106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
35323b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    public void overridePendingAppTransition(String packageName,
35333b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            int enterAnim, int exitAnim) {
35348b571a817cc953ce96750f440645f104c7f55157Dianne Hackborn        if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
35353b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            mNextAppTransitionPackage = packageName;
35363b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            mNextAppTransitionEnter = enterAnim;
35373b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            mNextAppTransitionExit = exitAnim;
35383b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        }
35393b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    }
3540ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
35419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void executeAppTransition() {
35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "executeAppTransition()")) {
3544cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
354606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
35483b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if (DEBUG_APP_TRANSITIONS) {
35493b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                RuntimeException e = new RuntimeException("here");
35503b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                e.fillInStackTrace();
35518a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Execute app transition: mNextAppTransition="
35523b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        + mNextAppTransition, e);
35533b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            }
3554bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn            if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
35559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppTransitionReady = true;
35569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final long origId = Binder.clearCallingIdentity();
35579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                performLayoutAndPlaceSurfacesLocked();
35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.restoreCallingIdentity(origId);
35599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAppStartingWindow(IBinder token, String pkg,
35642f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn            int theme, CompatibilityInfo compatInfo,
35652f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn            CharSequence nonLocalizedLabel, int labelRes, int icon,
35667eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn            int windowFlags, IBinder transferFrom, boolean createIfNeeded) {
35679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
35689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppStartingIcon()")) {
3569cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
35709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
35738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_STARTING_WINDOW) Slog.v(
35749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    TAG, "setAppStartingIcon: token=" + token + " pkg=" + pkg
35759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " transferFrom=" + transferFrom);
357606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
35779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token);
35789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null) {
35798a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to set icon of non-existing app token: " + token);
35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
35819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If the display is frozen, we won't do anything until the
35849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // actual window is displayed so there is no reason to put in
35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // the starting window.
3586de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn            if (mDisplayFrozen || !mPolicy.isScreenOn()) {
35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
35889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
358906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
35909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken.startingData != null) {
35919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
35929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
359306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
35949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (transferFrom != null) {
35959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AppWindowToken ttoken = findAppWindowToken(transferFrom);
35969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ttoken != null) {
35979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowState startingWindow = ttoken.startingWindow;
35989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (startingWindow != null) {
35999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mStartingIconInTransition) {
36009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // In this case, the starting icon has already
36019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // been displayed, so start letting windows get
36029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // shown immediately without any more transitions.
36039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mSkipAppTransitionAnimation = true;
36049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
36058a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_STARTING_WINDOW) Slog.v(TAG,
36069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Moving existing starting from " + ttoken
36079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " to " + wtoken);
36089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        final long origId = Binder.clearCallingIdentity();
360906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
36109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Transfer the starting window over to the new
36119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // token.
36129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wtoken.startingData = ttoken.startingData;
36139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wtoken.startingView = ttoken.startingView;
36149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wtoken.startingWindow = startingWindow;
36159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.startingData = null;
36169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.startingView = null;
36179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.startingWindow = null;
36189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.startingMoved = true;
36199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        startingWindow.mToken = wtoken;
3620ef49c57bdcdb6c808870570c205434b002431c37Dianne Hackborn                        startingWindow.mRootToken = wtoken;
36219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        startingWindow.mAppToken = wtoken;
3622f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                        if (DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG,
36239bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                                "Removing starting window: " + startingWindow);
36249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mWindows.remove(startingWindow);
3625dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                        mWindowsChanged = true;
3626f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                        if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Removing starting " + startingWindow
3627f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                + " from " + ttoken);
36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.windows.remove(startingWindow);
36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.allAppWindows.remove(startingWindow);
36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        addWindowToListInOrderLocked(startingWindow, true);
363106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
36329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Propagate other interesting state between the
36339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // tokens.  If the old token is displayed, we should
36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // immediately force the new one to be displayed.  If
36359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // it is animating, we need to move that animation to
36369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // the new one.
36379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (ttoken.allDrawn) {
36389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.allDrawn = true;
36399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
36409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (ttoken.firstWindowDrawn) {
36419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.firstWindowDrawn = true;
36429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
36439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!ttoken.hidden) {
36449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.hidden = false;
36459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.hiddenRequested = false;
36469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.willBeHidden = false;
36479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
36489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (wtoken.clientHidden != ttoken.clientHidden) {
36499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.clientHidden = ttoken.clientHidden;
36509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.sendAppVisibilityToClients();
36519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
36529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (ttoken.animation != null) {
36539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.animation = ttoken.animation;
36549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.animating = ttoken.animating;
36559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.animLayerAdjustment = ttoken.animLayerAdjustment;
36569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ttoken.animation = null;
36579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ttoken.animLayerAdjustment = 0;
36589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.updateLayers();
36599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ttoken.updateLayers();
36609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
366106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
36623a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
36633a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                                true /*updateInputWindows*/);
36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLayoutNeeded = true;
36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        performLayoutAndPlaceSurfacesLocked();
36669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Binder.restoreCallingIdentity(origId);
36679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return;
36689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (ttoken.startingData != null) {
36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // The previous app was getting ready to show a
36709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // starting window, but hasn't yet done so.  Steal it!
36718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_STARTING_WINDOW) Slog.v(TAG,
36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Moving pending starting from " + ttoken
36739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " to " + wtoken);
36749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wtoken.startingData = ttoken.startingData;
36759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.startingData = null;
36769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.startingMoved = true;
36779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Message m = mH.obtainMessage(H.ADD_STARTING, wtoken);
36789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Note: we really want to do sendMessageAtFrontOfQueue() because we
36799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // want to process the message ASAP, before any other queued
36809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // messages.
36819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mH.sendMessageAtFrontOfQueue(m);
36829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return;
36839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
36849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // There is no existing starting window, and the caller doesn't
36889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // want us to create one, so that's it!
36899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!createIfNeeded) {
36909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
36919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
369206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3693284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            // If this is a translucent or wallpaper window, then don't
3694284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            // show a starting window -- the current effect (a full-screen
3695284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            // opaque starting window that fades away to the real contents
3696284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            // when it is ready) does not work for this.
3697284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            if (theme != 0) {
3698284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                AttributeCache.Entry ent = AttributeCache.instance().get(pkg, theme,
3699284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        com.android.internal.R.styleable.Window);
3700284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                if (ent.array.getBoolean(
3701284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        com.android.internal.R.styleable.Window_windowIsTranslucent, false)) {
3702284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    return;
3703284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                }
3704284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                if (ent.array.getBoolean(
37056136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                        com.android.internal.R.styleable.Window_windowIsFloating, false)) {
37066136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                    return;
37076136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                }
37086136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                if (ent.array.getBoolean(
3709284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        com.android.internal.R.styleable.Window_windowShowWallpaper, false)) {
3710284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    return;
3711284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                }
3712284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            }
3713ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
37149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStartingIconInTransition = true;
37152f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn            wtoken.startingData = new StartingData(pkg, theme, compatInfo, nonLocalizedLabel,
37167eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                    labelRes, icon, windowFlags);
37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Message m = mH.obtainMessage(H.ADD_STARTING, wtoken);
37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Note: we really want to do sendMessageAtFrontOfQueue() because we
37199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // want to process the message ASAP, before any other queued
37209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // messages.
37219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendMessageAtFrontOfQueue(m);
37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAppWillBeHidden(IBinder token) {
37269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
37279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppWillBeHidden()")) {
3728cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
37299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AppWindowToken wtoken;
37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
37349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken = findAppWindowToken(token);
37359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null) {
37368a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to set will be hidden of non-existing app token: " + token);
37379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
37389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.willBeHidden = true;
37409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
374206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
37439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean setTokenVisibilityLocked(AppWindowToken wtoken, WindowManager.LayoutParams lp,
3744ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            boolean visible, int transit, boolean performLayout) {
37459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean delayed = false;
37469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wtoken.clientHidden == visible) {
37489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.clientHidden = !visible;
37499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.sendAppVisibilityToClients();
37509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
375106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
37529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        wtoken.willBeHidden = false;
37539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wtoken.hidden == visible) {
37549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = wtoken.allAppWindows.size();
37559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean changed = false;
37568a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_APP_TRANSITIONS) Slog.v(
37579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Changing app " + wtoken + " hidden=" + wtoken.hidden
37589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " performLayout=" + performLayout);
375906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
37609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean runningAppAnimation = false;
376106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3762bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn            if (transit != WindowManagerPolicy.TRANSIT_UNSET) {
37639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wtoken.animation == sDummyAnimation) {
37649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wtoken.animation = null;
37659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3766ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                applyAnimationLocked(wtoken, lp, transit, visible);
37679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                changed = true;
37689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wtoken.animation != null) {
37699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    delayed = runningAppAnimation = true;
37709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
377206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
37739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
37749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState win = wtoken.allAppWindows.get(i);
37759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win == wtoken.startingWindow) {
37769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
37779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.isAnimating()) {
37809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    delayed = true;
37819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
378206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
37838a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                //Slog.i(TAG, "Window " + win + ": vis=" + win.isVisible());
37849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //win.dump("  ");
37859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (visible) {
37869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!win.isVisibleNow()) {
37879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!runningAppAnimation) {
37889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            applyAnimationLocked(win,
37899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    WindowManagerPolicy.TRANSIT_ENTER, true);
37909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
37919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        changed = true;
37929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (win.isVisibleNow()) {
37949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!runningAppAnimation) {
37959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        applyAnimationLocked(win,
37969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                WindowManagerPolicy.TRANSIT_EXIT, false);
37979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    changed = true;
37999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.hidden = wtoken.hiddenRequested = !visible;
38039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!visible) {
38049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                unsetAppFreezingScreenLocked(wtoken, true, true);
38059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
38069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If we are being set visible, and the starting window is
38079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // not yet displayed, then make sure it doesn't get displayed.
38089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState swin = wtoken.startingWindow;
38099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (swin != null && (swin.mDrawPending
38109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || swin.mCommitDrawPending)) {
38119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    swin.mPolicyVisibility = false;
38129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    swin.mPolicyVisibilityAfterAnim = false;
38139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 }
38149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
381506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
38168a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "setTokenVisibilityLocked: " + wtoken
38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + ": hidden=" + wtoken.hidden + " hiddenRequested="
38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + wtoken.hiddenRequested);
381906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
38209b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn            if (changed) {
38219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutNeeded = true;
38223a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                mInputMonitor.setUpdateInputWindowsNeededLw();
38239b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn                if (performLayout) {
38243a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
38253a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                            false /*updateInputWindows*/);
38269b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn                    performLayoutAndPlaceSurfacesLocked();
38279b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn                }
38282e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                mInputMonitor.updateInputWindowsLw(false /*force*/);
38299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wtoken.animation != null) {
38339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            delayed = true;
38349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
383506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
38369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return delayed;
38379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAppVisibility(IBinder token, boolean visible) {
38409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
38419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppVisibility()")) {
3842cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
38439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AppWindowToken wtoken;
38469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
38489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken = findAppWindowToken(token);
38499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null) {
38508a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to set visibility of non-existing app token: " + token);
38519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
38529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_APP_TRANSITIONS || DEBUG_ORIENTATION) {
3855b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                RuntimeException e = null;
3856b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (!HIDE_STACK_CRAWLS) {
3857b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    e = new RuntimeException();
3858b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    e.fillInStackTrace();
3859b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                }
38608a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.v(TAG, "setAppVisibility(" + token + ", " + visible
38619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + "): mNextAppTransition=" + mNextAppTransition
38629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " hidden=" + wtoken.hidden
38639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " hiddenRequested=" + wtoken.hiddenRequested, e);
38649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
386506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
38669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If we are preparing an app transition, then delay changing
38679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // the visibility of this token until we execute that transition.
3868b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn            if (!mDisplayFrozen && mPolicy.isScreenOn()
3869b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                    && mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
38709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Already in requested state, don't do anything more.
38719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wtoken.hiddenRequested != visible) {
38729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
38739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.hiddenRequested = !visible;
387506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
38768a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_APP_TRANSITIONS) Slog.v(
38779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        TAG, "Setting dummy animation on: " + wtoken);
38789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.setDummyAnimation();
38799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOpeningApps.remove(wtoken);
38809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mClosingApps.remove(wtoken);
3881a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                wtoken.waitingToShow = wtoken.waitingToHide = false;
38829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.inPendingTransaction = true;
38839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (visible) {
38849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mOpeningApps.add(wtoken);
38859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wtoken.startingDisplayed = false;
38869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wtoken.startingMoved = false;
3887ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
3888195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    // If the token is currently hidden (should be the
3889195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    // common case), then we need to set up to wait for
3890195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    // its windows to be ready.
3891195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    if (wtoken.hidden) {
3892195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                        wtoken.allDrawn = false;
3893195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                        wtoken.waitingToShow = true;
3894ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
3895195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                        if (wtoken.clientHidden) {
3896195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            // In the case where we are making an app visible
3897195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            // but holding off for a transition, we still need
3898195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            // to tell the client to make its windows visible so
3899195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            // they get drawn.  Otherwise, we will wait on
3900195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            // performing the transition until all windows have
3901195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            // been drawn, they never will be, and we are sad.
3902195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            wtoken.clientHidden = false;
3903195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            wtoken.sendAppVisibilityToClients();
3904195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                        }
39059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
39069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
39079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mClosingApps.add(wtoken);
3908ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
3909195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    // If the token is currently visible (should be the
3910195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    // common case), then set up to wait for it to be hidden.
3911195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    if (!wtoken.hidden) {
3912195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                        wtoken.waitingToHide = true;
3913195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    }
39149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
39159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
39169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
391706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
39189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long origId = Binder.clearCallingIdentity();
3919e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            setTokenVisibilityLocked(wtoken, null, visible, WindowManagerPolicy.TRANSIT_UNSET,
3920ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                    true);
39219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.updateReportedVisibilityLocked();
39229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(origId);
39239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void unsetAppFreezingScreenLocked(AppWindowToken wtoken,
39279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean unfreezeSurfaceNow, boolean force) {
39289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wtoken.freezingScreen) {
39298a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_ORIENTATION) Slog.v(TAG, "Clear freezing of " + wtoken
39309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " force=" + force);
39319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = wtoken.allAppWindows.size();
39329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean unfrozeWindows = false;
39339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
39349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState w = wtoken.allAppWindows.get(i);
39359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (w.mAppFreezing) {
39369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mAppFreezing = false;
39379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (w.mSurface != null && !w.mOrientationChanging) {
39389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mOrientationChanging = true;
39399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
39409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    unfrozeWindows = true;
39419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
39429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (force || unfrozeWindows) {
39448a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_ORIENTATION) Slog.v(TAG, "No longer freezing: " + wtoken);
39459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.freezingScreen = false;
39469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppsFreezingScreen--;
39479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (unfreezeSurfaceNow) {
39499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (unfrozeWindows) {
39509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLayoutNeeded = true;
39519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    performLayoutAndPlaceSurfacesLocked();
39529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3953e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                stopFreezingDisplayLocked();
39549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
395706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
39589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startAppFreezingScreenLocked(AppWindowToken wtoken,
39599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int configChanges) {
39609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_ORIENTATION) {
3961b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            RuntimeException e = null;
3962b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            if (!HIDE_STACK_CRAWLS) {
3963b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                e = new RuntimeException();
3964b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                e.fillInStackTrace();
3965b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            }
39668a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.i(TAG, "Set freezing of " + wtoken.appToken
39679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ": hidden=" + wtoken.hidden + " freezing="
39689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + wtoken.freezingScreen, e);
39699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!wtoken.hiddenRequested) {
39719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!wtoken.freezingScreen) {
39729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.freezingScreen = true;
39739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppsFreezingScreen++;
39749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mAppsFreezingScreen == 1) {
397594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    startFreezingDisplayLocked(false);
39769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mH.removeMessages(H.APP_FREEZE_TIMEOUT);
39779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mH.sendMessageDelayed(mH.obtainMessage(H.APP_FREEZE_TIMEOUT),
39789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            5000);
39799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
39809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = wtoken.allAppWindows.size();
39829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
39839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState w = wtoken.allAppWindows.get(i);
39849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mAppFreezing = true;
39859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
398806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
39899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startAppFreezingScreen(IBinder token, int configChanges) {
39909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
39919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppFreezingScreen()")) {
3992cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
39939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
3996b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn            if (configChanges == 0 && !mDisplayFrozen && mPolicy.isScreenOn()) {
39978a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_ORIENTATION) Slog.v(TAG, "Skipping set freeze of " + token);
39989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
39999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
400006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
40019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token);
40029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null || wtoken.appToken == null) {
40038a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to freeze screen with non-existing app token: " + wtoken);
40049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
40059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long origId = Binder.clearCallingIdentity();
40079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            startAppFreezingScreenLocked(wtoken, configChanges);
40089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(origId);
40099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
401106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
40129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void stopAppFreezingScreen(IBinder token, boolean force) {
40139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
40149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppFreezingScreen()")) {
4015cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
40169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
40199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token);
40209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null || wtoken.appToken == null) {
40219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
40229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long origId = Binder.clearCallingIdentity();
40248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_ORIENTATION) Slog.v(TAG, "Clear freezing of " + token
40259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ": hidden=" + wtoken.hidden + " freezing=" + wtoken.freezingScreen);
40269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unsetAppFreezingScreenLocked(wtoken, true, force);
40279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(origId);
40289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
403006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
40319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeAppToken(IBinder token) {
40329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
40339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "removeAppToken()")) {
4034cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
40359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AppWindowToken wtoken = null;
40389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AppWindowToken startingToken = null;
40399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean delayed = false;
40409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long origId = Binder.clearCallingIdentity();
40429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
40439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken basewtoken = mTokenMap.remove(token);
40449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (basewtoken != null && (wtoken=basewtoken.appWindowToken) != null) {
40458a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Removing app token: " + wtoken);
4046e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                delayed = setTokenVisibilityLocked(wtoken, null, false,
4047ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                        WindowManagerPolicy.TRANSIT_UNSET, true);
40489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.inPendingTransaction = false;
40499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOpeningApps.remove(wtoken);
4050a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                wtoken.waitingToShow = false;
40519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mClosingApps.contains(wtoken)) {
40529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    delayed = true;
4053bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                } else if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
40549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mClosingApps.add(wtoken);
4055a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    wtoken.waitingToHide = true;
40569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    delayed = true;
40579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
40588a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_APP_TRANSITIONS) Slog.v(
40599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        TAG, "Removing app " + wtoken + " delayed=" + delayed
40609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " animation=" + wtoken.animation
40619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " animating=" + wtoken.animating);
40629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (delayed) {
40639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // set the token aside because it has an active animation to be finished
4064f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG,
4065f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            "removeAppToken make exiting: " + wtoken);
40669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mExitingAppTokens.add(wtoken);
40679bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                } else {
40689bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    // Make sure there is no animation running on this token,
40699bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    // so any windows associated with it will be removed as
40709bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    // soon as their animations are complete
40719bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    wtoken.animation = null;
40729bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    wtoken.animating = false;
40739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4074f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG,
4075f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                        "removeAppToken: " + wtoken);
40769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppTokens.remove(wtoken);
40779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.removed = true;
40789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wtoken.startingData != null) {
40799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    startingToken = wtoken;
40809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
40819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                unsetAppFreezingScreenLocked(wtoken, true, true);
40829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mFocusedApp == wtoken) {
40838a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_FOCUS) Slog.v(TAG, "Removing focused app token:" + wtoken);
40849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mFocusedApp = null;
40853a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/);
408600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    mInputMonitor.setFocusedAppLw(null);
40879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
40889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
40898a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to remove non-existing app token: " + token);
40909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
409106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
40929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!delayed && wtoken != null) {
40939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.updateReportedVisibilityLocked();
40949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
40979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (startingToken != null) {
40998a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Schedule remove starting "
41009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + startingToken + ": app token removed");
41019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Message m = mH.obtainMessage(H.REMOVE_STARTING, startingToken);
41029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendMessage(m);
41039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean tmpRemoveAppWindowsLocked(WindowToken token) {
41079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NW = token.windows.size();
41089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<NW; i++) {
41099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowState win = token.windows.get(i);
41108a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Tmp removing app window " + win);
41119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindows.remove(win);
4112dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            mWindowsChanged = true;
41139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int j = win.mChildWindows.size();
41149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (j > 0) {
41159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                j--;
4116e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState cwin = win.mChildWindows.get(j);
41178a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG,
4118bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                        "Tmp removing child window " + cwin);
4119bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                mWindows.remove(cwin);
41209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NW > 0;
41239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dumpAppTokensLocked() {
41269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=mAppTokens.size()-1; i>=0; i--) {
41278a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.v(TAG, "  #" + i + ": " + mAppTokens.get(i).token);
41289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
413006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
41319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dumpWindowsLocked() {
41329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=mWindows.size()-1; i>=0; i--) {
41338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.v(TAG, "  #" + i + ": " + mWindows.get(i));
41349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
413606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
41379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int findWindowOffsetLocked(int tokenPos) {
41389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NW = mWindows.size();
41399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (tokenPos >= mAppTokens.size()) {
41419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int i = NW;
41429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (i > 0) {
41439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
4144e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState win = mWindows.get(i);
41459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.getAppToken() != null) {
41469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return i+1;
41479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
41489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (tokenPos > 0) {
41529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Find the first app token below the new position that has
41539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // a window displayed.
41549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final AppWindowToken wtoken = mAppTokens.get(tokenPos-1);
41558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_REORDER) Slog.v(TAG, "Looking for lower windows @ "
41569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + tokenPos + " -- " + wtoken.token);
4157a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            if (wtoken.sendingToBottom) {
41588a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_REORDER) Slog.v(TAG,
4159a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        "Skipping token -- currently sending to bottom");
4160a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                tokenPos--;
4161a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                continue;
4162a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
41639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int i = wtoken.windows.size();
41649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (i > 0) {
41659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
41669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState win = wtoken.windows.get(i);
41679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int j = win.mChildWindows.size();
41689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (j > 0) {
41699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    j--;
4170e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    WindowState cwin = win.mChildWindows.get(j);
4171a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    if (cwin.mSubLayer >= 0) {
41729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int pos=NW-1; pos>=0; pos--) {
41739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (mWindows.get(pos) == cwin) {
41748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_REORDER) Slog.v(TAG,
41759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "Found child win @" + (pos+1));
41769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                return pos+1;
41779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
41789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
41799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
41809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
41819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int pos=NW-1; pos>=0; pos--) {
41829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mWindows.get(pos) == win) {
41838a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_REORDER) Slog.v(TAG, "Found win @" + (pos+1));
41849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return pos+1;
41859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
41869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
41879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            tokenPos--;
41899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
41929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final int reAddWindowLocked(int index, WindowState win) {
41959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NCW = win.mChildWindows.size();
41969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean added = false;
41979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int j=0; j<NCW; j++) {
4198e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState cwin = win.mChildWindows.get(j);
41999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!added && cwin.mSubLayer >= 0) {
42008a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding child window at "
4201bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                        + index + ": " + cwin);
4202f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                win.mRebuilding = false;
42039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindows.add(index, win);
42049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                index++;
42059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                added = true;
42069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
42078a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding window at "
4208bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                    + index + ": " + cwin);
4209f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            cwin.mRebuilding = false;
42109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindows.add(index, cwin);
42119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index++;
42129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!added) {
42148a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding window at "
4215bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                    + index + ": " + win);
4216f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            win.mRebuilding = false;
42179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindows.add(index, win);
42189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index++;
42199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4220dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        mWindowsChanged = true;
42219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return index;
42229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
422306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
42249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final int reAddAppWindowsLocked(int index, WindowToken token) {
42259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NW = token.windows.size();
42269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<NW; i++) {
42279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index = reAddWindowLocked(index, token.windows.get(i));
42289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return index;
42309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void moveAppToken(int index, IBinder token) {
42339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
42349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "moveAppToken()")) {
4235cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
42369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
42398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_REORDER) Slog.v(TAG, "Initial app tokens:");
42409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_REORDER) dumpAppTokensLocked();
42419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final AppWindowToken wtoken = findAppWindowToken(token);
4242f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            if (DEBUG_TOKEN_MOVEMENT || DEBUG_REORDER) Slog.v(TAG,
4243f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    "Start moving token " + wtoken + " initially at "
4244f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    + mAppTokens.indexOf(wtoken));
42459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null || !mAppTokens.remove(wtoken)) {
42468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempting to reorder token that doesn't exist: "
42479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + token + " (" + wtoken + ")");
42489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
42499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
42509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAppTokens.add(index, wtoken);
42518a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_REORDER) Slog.v(TAG, "Moved " + token + " to " + index + ":");
4252f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            else if (DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, "Moved " + token + " to " + index);
42539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_REORDER) dumpAppTokensLocked();
425406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
42559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long origId = Binder.clearCallingIdentity();
42568a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_REORDER) Slog.v(TAG, "Removing windows in " + token + ":");
42579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_REORDER) dumpWindowsLocked();
42589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tmpRemoveAppWindowsLocked(wtoken)) {
42598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_REORDER) Slog.v(TAG, "Adding windows back in:");
42609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_REORDER) dumpWindowsLocked();
42619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reAddAppWindowsLocked(findWindowOffsetLocked(index), wtoken);
42628a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_REORDER) Slog.v(TAG, "Final window list:");
42639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_REORDER) dumpWindowsLocked();
42643a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
42653a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        false /*updateInputWindows*/);
42669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutNeeded = true;
42672e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                mInputMonitor.setUpdateInputWindowsNeededLw();
42689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                performLayoutAndPlaceSurfacesLocked();
42692e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                mInputMonitor.updateInputWindowsLw(false /*force*/);
42709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
42719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(origId);
42729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void removeAppTokensLocked(List<IBinder> tokens) {
42769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // XXX This should be done more efficiently!
42779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // (take advantage of the fact that both lists should be
42789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // ordered in the same way.)
42799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int N = tokens.size();
42809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
42819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IBinder token = tokens.get(i);
42829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final AppWindowToken wtoken = findAppWindowToken(token);
4283f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            if (DEBUG_REORDER || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG,
4284f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    "Temporarily removing " + wtoken + " from " + mAppTokens.indexOf(wtoken));
42859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mAppTokens.remove(wtoken)) {
42868a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempting to reorder token that doesn't exist: "
42879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + token + " (" + wtoken + ")");
42889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
42899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                N--;
42909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
42919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4294a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    private void moveAppWindowsLocked(AppWindowToken wtoken, int tokenPos,
4295a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            boolean updateFocusAndLayout) {
4296a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        // First remove all of the windows from the list.
4297a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        tmpRemoveAppWindowsLocked(wtoken);
4298a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn
4299a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        // Where to start adding?
4300a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        int pos = findWindowOffsetLocked(tokenPos);
4301a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn
4302a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        // And now add them back at the correct place.
4303a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        pos = reAddAppWindowsLocked(pos, wtoken);
4304a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn
4305a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        if (updateFocusAndLayout) {
43062e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown            mInputMonitor.setUpdateInputWindowsNeededLw();
43073a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown            if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
43083a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    false /*updateInputWindows*/)) {
4309a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                assignLayersLocked();
4310a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
4311a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            mLayoutNeeded = true;
4312a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            performLayoutAndPlaceSurfacesLocked();
43132e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown            mInputMonitor.updateInputWindowsLw(false /*force*/);
4314a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        }
4315a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    }
4316a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn
43179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void moveAppWindowsLocked(List<IBinder> tokens, int tokenPos) {
43189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // First remove all of the windows from the list.
43199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = tokens.size();
43209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i;
43219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=0; i<N; i++) {
43229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken token = mTokenMap.get(tokens.get(i));
43239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token != null) {
43249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                tmpRemoveAppWindowsLocked(token);
43259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
43269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Where to start adding?
43299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = findWindowOffsetLocked(tokenPos);
43309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // And now add them back at the correct place.
43329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=0; i<N; i++) {
43339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken token = mTokenMap.get(tokens.get(i));
43349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token != null) {
43359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pos = reAddAppWindowsLocked(pos, token);
43369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
43379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43392e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown        mInputMonitor.setUpdateInputWindowsNeededLw();
43403a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
43413a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                false /*updateInputWindows*/)) {
4342a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            assignLayersLocked();
4343a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        }
43449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLayoutNeeded = true;
43459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        performLayoutAndPlaceSurfacesLocked();
43462e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown        mInputMonitor.updateInputWindowsLw(false /*force*/);
43479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //dump();
43499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void moveAppTokensToTop(List<IBinder> tokens) {
43529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
43539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "moveAppTokensToTop()")) {
4354cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
43559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long origId = Binder.clearCallingIdentity();
43589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
43599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            removeAppTokensLocked(tokens);
43609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = tokens.size();
43619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
43629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AppWindowToken wt = findAppWindowToken(tokens.get(i));
43639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wt != null) {
4364f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    if (DEBUG_TOKEN_MOVEMENT || DEBUG_REORDER) Slog.v(TAG,
4365f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            "Adding next to top: " + wt);
43669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAppTokens.add(wt);
4367bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                    if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
4368a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mToTopApps.remove(wt);
4369a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mToBottomApps.remove(wt);
4370a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mToTopApps.add(wt);
4371a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        wt.sendingToBottom = false;
4372a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        wt.sendingToTop = true;
4373a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    }
43749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
43759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4376ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
4377bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn            if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET) {
4378a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                moveAppWindowsLocked(tokens, mAppTokens.size());
4379a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
43809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
43829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void moveAppTokensToBottom(List<IBinder> tokens) {
43859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
43869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "moveAppTokensToBottom()")) {
4387cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
43889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long origId = Binder.clearCallingIdentity();
43919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
43929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            removeAppTokensLocked(tokens);
43939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = tokens.size();
43949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int pos = 0;
43959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
43969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AppWindowToken wt = findAppWindowToken(tokens.get(i));
43979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wt != null) {
4398f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    if (DEBUG_TOKEN_MOVEMENT) Slog.v(TAG,
4399f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            "Adding next to bottom: " + wt + " at " + pos);
44009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAppTokens.add(pos, wt);
4401bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                    if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
4402a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mToTopApps.remove(wt);
4403a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mToBottomApps.remove(wt);
4404a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mToBottomApps.add(i, wt);
4405a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        wt.sendingToTop = false;
4406a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        wt.sendingToBottom = true;
4407a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    }
44089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pos++;
44099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
44109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4411ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
4412bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn            if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET) {
4413a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                moveAppWindowsLocked(tokens, 0);
4414a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
44159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
44179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
44209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Misc IWindowSession methods
44219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
442206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4423284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    private boolean shouldAllowDisableKeyguard()
4424d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller    {
4425284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        // We fail safe and prevent disabling keyguard in the unlikely event this gets
4426284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        // called before DevicePolicyManagerService has started.
4427284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        if (mAllowDisableKeyguard == ALLOW_DISABLE_UNKNOWN) {
4428284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService(
4429284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                    Context.DEVICE_POLICY_SERVICE);
4430284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            if (dpm != null) {
4431284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                mAllowDisableKeyguard = dpm.getPasswordQuality(null)
4432284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                        == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED ?
4433284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                                ALLOW_DISABLE_YES : ALLOW_DISABLE_NO;
4434284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            }
4435284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        }
4436284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        return mAllowDisableKeyguard == ALLOW_DISABLE_YES;
4437d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller    }
4438d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller
44399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void disableKeyguard(IBinder token, String tag) {
4440733fdf34b6a8a8e3983ff7663828a928d3c19944Mike Lockwood        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD)
44419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            != PackageManager.PERMISSION_GRANTED) {
44429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException("Requires DISABLE_KEYGUARD permission");
44439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4444d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller
4445284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        synchronized (mKeyguardTokenWatcher) {
4446284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            mKeyguardTokenWatcher.acquire(token, tag);
4447dd8846886aa21980ecdca7ba42deac4f7ecd8ff0Mike Lockwood        }
44489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void reenableKeyguard(IBinder token) {
4451733fdf34b6a8a8e3983ff7663828a928d3c19944Mike Lockwood        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD)
44529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            != PackageManager.PERMISSION_GRANTED) {
44539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException("Requires DISABLE_KEYGUARD permission");
44549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4455d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller
4456284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        synchronized (mKeyguardTokenWatcher) {
4457284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            mKeyguardTokenWatcher.release(token);
4458284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller
4459284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            if (!mKeyguardTokenWatcher.isAcquired()) {
4460284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // If we are the last one to reenable the keyguard wait until
4461284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // we have actually finished reenabling until returning.
4462284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // It is possible that reenableKeyguard() can be called before
4463284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // the previous disableKeyguard() is handled, in which case
4464284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // neither mKeyguardTokenWatcher.acquired() or released() would
4465284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // be called. In that case mKeyguardDisabled will be false here
4466284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // and we have nothing to wait for.
4467284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                while (mKeyguardDisabled) {
4468284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                    try {
4469284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                        mKeyguardTokenWatcher.wait();
4470284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                    } catch (InterruptedException e) {
4471284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                        Thread.currentThread().interrupt();
44729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
44739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
44749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
44759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
44799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.app.KeyguardManager#exitKeyguardSecurely
44809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
44819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void exitKeyguardSecurely(final IOnKeyguardExitResult callback) {
4482733fdf34b6a8a8e3983ff7663828a928d3c19944Mike Lockwood        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD)
44839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            != PackageManager.PERMISSION_GRANTED) {
44849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException("Requires DISABLE_KEYGUARD permission");
44859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPolicy.exitKeyguardSecurely(new WindowManagerPolicy.OnKeyguardExitResult() {
44879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void onKeyguardExitResult(boolean success) {
44889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
44899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    callback.onKeyguardExitResult(success);
44909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
44919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Client has died, we don't care.
44929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
44939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
44949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        });
44959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean inKeyguardRestrictedInputMode() {
44989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPolicy.inKeyguardRestrictedKeyInputMode();
44999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
450006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4501520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood    public boolean isKeyguardLocked() {
4502520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood        return mPolicy.isKeyguardLocked();
4503520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood    }
4504520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood
4505520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood    public boolean isKeyguardSecure() {
4506520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood        return mPolicy.isKeyguardSecure();
4507520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood    }
4508520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood
4509ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn    public void closeSystemDialogs(String reason) {
4510ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        synchronized(mWindowMap) {
4511ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn            for (int i=mWindows.size()-1; i>=0; i--) {
4512e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState w = mWindows.get(i);
4513ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                if (w.mSurface != null) {
4514ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                    try {
4515ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                        w.mClient.closeSystemDialogs(reason);
4516ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                    } catch (RemoteException e) {
4517ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                    }
4518ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                }
4519ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn            }
4520ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        }
4521ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn    }
4522ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
45239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static float fixScale(float scale) {
45249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (scale < 0) scale = 0;
45259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else if (scale > 20) scale = 20;
45269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return Math.abs(scale);
45279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
452806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAnimationScale(int which, float scale) {
45309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.SET_ANIMATION_SCALE,
45319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAnimationScale()")) {
4532cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires SET_ANIMATION_SCALE permission");
45339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (scale < 0) scale = 0;
45369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else if (scale > 20) scale = 20;
45379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        scale = Math.abs(scale);
45389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
45399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 0: mWindowAnimationScale = fixScale(scale); break;
45409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 1: mTransitionAnimationScale = fixScale(scale); break;
45419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
454206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Persist setting
45449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.obtainMessage(H.PERSIST_ANIMATION_SCALE).sendToTarget();
45459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
454606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAnimationScales(float[] scales) {
45489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.SET_ANIMATION_SCALE,
45499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAnimationScale()")) {
4550cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires SET_ANIMATION_SCALE permission");
45519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (scales != null) {
45549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (scales.length >= 1) {
45559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindowAnimationScale = fixScale(scales[0]);
45569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
45579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (scales.length >= 2) {
45589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTransitionAnimationScale = fixScale(scales[1]);
45599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
45609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
456106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Persist setting
45639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.obtainMessage(H.PERSIST_ANIMATION_SCALE).sendToTarget();
45649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
456506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float getAnimationScale(int which) {
45679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
45689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 0: return mWindowAnimationScale;
45699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 1: return mTransitionAnimationScale;
45709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
45729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
457306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float[] getAnimationScales() {
45759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new float[] { mWindowAnimationScale, mTransitionAnimationScale };
45769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
457706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getSwitchState(int sw) {
45799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
45809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "getSwitchState()")) {
4581cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
45829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45836d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getSwitchState(-1, InputDevice.SOURCE_ANY, sw);
45849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
458506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getSwitchStateForDevice(int devid, int sw) {
45879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
45889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "getSwitchStateForDevice()")) {
4589cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
45909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45916d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getSwitchState(devid, InputDevice.SOURCE_ANY, sw);
45929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
459306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getScancodeState(int sw) {
45959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
45969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "getScancodeState()")) {
4597cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
45989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45996d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getScanCodeState(-1, InputDevice.SOURCE_ANY, sw);
46009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
460106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getScancodeStateForDevice(int devid, int sw) {
46039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
46049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "getScancodeStateForDevice()")) {
4605cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
46069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
46076d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getScanCodeState(devid, InputDevice.SOURCE_ANY, sw);
46089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
460906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46101d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    public int getTrackballScancodeState(int sw) {
46111d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
46121d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn                "getTrackballScancodeState()")) {
46131d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
46141d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        }
46156d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getScanCodeState(-1, InputDevice.SOURCE_TRACKBALL, sw);
46161d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    }
46171d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn
46181d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    public int getDPadScancodeState(int sw) {
46191d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
46201d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn                "getDPadScancodeState()")) {
46211d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
46221d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        }
46236d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getScanCodeState(-1, InputDevice.SOURCE_DPAD, sw);
46241d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    }
46251d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn
46269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getKeycodeState(int sw) {
46279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
46289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "getKeycodeState()")) {
4629cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
46309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
46316d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_ANY, sw);
46329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
463306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getKeycodeStateForDevice(int devid, int sw) {
46359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
46369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "getKeycodeStateForDevice()")) {
4637cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
46389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
46396d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getKeyCodeState(devid, InputDevice.SOURCE_ANY, sw);
46409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
464106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46421d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    public int getTrackballKeycodeState(int sw) {
46431d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
46441d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn                "getTrackballKeycodeState()")) {
46451d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
46461d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        }
46476d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_TRACKBALL, sw);
46481d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    }
46491d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn
46501d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    public int getDPadKeycodeState(int sw) {
46511d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
46521d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn                "getDPadKeycodeState()")) {
46531d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
46541d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        }
46556d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_DPAD, sw);
46561d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    }
4657a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown
46589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hasKeys(int[] keycodes, boolean[] keyExists) {
46596d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.hasKeys(-1, InputDevice.SOURCE_ANY, keycodes, keyExists);
46609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
466106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4662a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown    public InputChannel monitorInput(String inputChannelName) {
4663a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
4664a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown                "monitorInput()")) {
4665a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown            throw new SecurityException("Requires READ_INPUT_STATE permission");
4666a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown        }
4667a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown        return mInputManager.monitorInput(inputChannelName);
4668a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown    }
4669a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown
46700029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    public void setInputFilter(InputFilter filter) {
46710029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        mInputManager.setInputFilter(filter);
46720029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    }
46730029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
46748d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public InputDevice getInputDevice(int deviceId) {
46758d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return mInputManager.getInputDevice(deviceId);
46768d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
46778d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
46788d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public int[] getInputDeviceIds() {
46798d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return mInputManager.getInputDeviceIds();
46808d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
46818d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
46829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enableScreenAfterBoot() {
46839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
46849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mSystemBooted) {
46859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
46869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
46879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSystemBooted = true;
46889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
468906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        performEnableScreen();
46919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
469206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enableScreenIfNeededLocked() {
46949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDisplayEnabled) {
46959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
46969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
46979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mSystemBooted) {
46989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
46999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.sendMessage(mH.obtainMessage(H.ENABLE_SCREEN));
47019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
470206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
47039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void performEnableScreen() {
47049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
47059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDisplayEnabled) {
47069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
47079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
47089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mSystemBooted) {
47099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
47109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
471106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
47129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Don't enable the screen until all existing windows
47139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // have been drawn.
47149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = mWindows.size();
47159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
4716e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState w = mWindows.get(i);
4717f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn                if (w.isVisibleLw() && !w.mObscured && !w.isDrawnLw()) {
47189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
47199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
47209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
472106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
47229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDisplayEnabled = true;
47239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (false) {
47248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.i(TAG, "ENABLING SCREEN!");
47259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                StringWriter sw = new StringWriter();
47269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PrintWriter pw = new PrintWriter(sw);
47279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                this.dump(null, pw, null);
47288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.i(TAG, sw.toString());
47299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
47309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
47319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IBinder surfaceFlinger = ServiceManager.getService("SurfaceFlinger");
47329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (surfaceFlinger != null) {
47338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    //Slog.i(TAG, "******* TELLING SURFACE FLINGER WE ARE BOOTED!");
47349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Parcel data = Parcel.obtain();
47359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.writeInterfaceToken("android.ui.ISurfaceComposer");
47369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    surfaceFlinger.transact(IBinder.FIRST_CALL_TRANSACTION,
47379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            data, null, 0);
47389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.recycle();
47399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
47409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException ex) {
47418a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.e(TAG, "Boot completed: SurfaceFlinger is dead!");
47429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
47439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
474406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
47459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPolicy.enableScreenAfterBoot();
474606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
47479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make sure the last requested orientation has been applied.
4748321ae681cad03d00ad1efc6f06f74268e00172a9Dianne Hackborn        setRotationUnchecked(WindowManagerPolicy.USE_LAST_ROTATION, false,
4749321ae681cad03d00ad1efc6f06f74268e00172a9Dianne Hackborn                mLastRotationFlags | Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE);
47509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
475106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
47529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setInTouchMode(boolean mode) {
47539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
47549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInTouchMode = mode;
47559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47586804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    // TODO: more accounting of which pid(s) turned it on, keep count,
47596804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    // only allow disables from pids which have count on, etc.
47606804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    public void showStrictModeViolation(boolean on) {
47616804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        int pid = Binder.getCallingPid();
47626804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        synchronized(mWindowMap) {
47636804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            // Ignoring requests to enable the red border from clients
47646804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            // which aren't on screen.  (e.g. Broadcast Receivers in
47656804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            // the background..)
47666804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            if (on) {
47676804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                boolean isVisible = false;
47686804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                for (WindowState ws : mWindows) {
47696804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                    if (ws.mSession.mPid == pid && ws.isVisibleLw()) {
47706804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                        isVisible = true;
47716804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                        break;
47726804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                    }
47736804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                }
47746804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                if (!isVisible) {
47756804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                    return;
47766804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                }
47776804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            }
47786804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick
477994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            if (SHOW_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION showStrictModeViolation");
47806804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            Surface.openTransaction();
478194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            try {
478294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                if (mStrictModeFlash == null) {
478394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    mStrictModeFlash = new StrictModeFlash(mDisplay, mFxSession);
478494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                }
478594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                mStrictModeFlash.setVisibility(on);
478694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            } finally {
478794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                Surface.closeTransaction();
478894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                if (SHOW_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION showStrictModeViolation");
47896804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            }
47906804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        }
47916804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    }
47926804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick
4793c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick    public void setStrictModeVisualIndicatorPreference(String value) {
4794c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick        SystemProperties.set(StrictMode.VISUAL_PROPERTY, value);
4795c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick    }
4796c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick
4797e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller    /**
4798e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller     * Takes a snapshot of the screen.  In landscape mode this grabs the whole screen.
4799e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller     * In portrait mode, it grabs the upper region of the screen based on the vertical dimension
4800e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller     * of the target image.
4801e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller     *
4802e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller     * @param width the width of the target bitmap
4803e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller     * @param height the height of the target bitmap
4804e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller     */
4805e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller    public Bitmap screenshotApplications(IBinder appToken, int width, int height) {
48060aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.READ_FRAME_BUFFER,
48070aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                "screenshotApplications()")) {
48080aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            throw new SecurityException("Requires READ_FRAME_BUFFER permission");
48090aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        }
48100aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
48110aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        Bitmap rawss;
48120aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
4813d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn        int maxLayer = 0;
48140aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        final Rect frame = new Rect();
48150aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
48160aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        float scale;
4817e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller        int dw, dh;
48180aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        int rot;
48190aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
48200aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        synchronized(mWindowMap) {
48210aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            long ident = Binder.clearCallingIdentity();
48220aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
482381e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn            dw = mAppDisplayWidth;
482481e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn            dh = mAppDisplayHeight;
4825428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn
48260aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            int aboveAppLayer = mPolicy.windowTypeToLayerLw(
48270aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                    WindowManager.LayoutParams.TYPE_APPLICATION) * TYPE_LAYER_MULTIPLIER
48280aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                    + TYPE_LAYER_OFFSET;
48290aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            aboveAppLayer += TYPE_LAYER_MULTIPLIER;
48300aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
4831428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            boolean isImeTarget = mInputMethodTarget != null
4832428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    && mInputMethodTarget.mAppToken != null
4833428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    && mInputMethodTarget.mAppToken.appToken != null
4834428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    && mInputMethodTarget.mAppToken.appToken.asBinder() == appToken;
4835428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn
48360aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            // Figure out the part of the screen that is actually the app.
4837428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            boolean including = false;
4838428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            for (int i=mWindows.size()-1; i>=0; i--) {
48390aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                WindowState ws = mWindows.get(i);
48400aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                if (ws.mSurface == null) {
48410aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                    continue;
48420aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                }
48430aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                if (ws.mLayer >= aboveAppLayer) {
4844d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn                    continue;
4845d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn                }
4846428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                // When we will skip windows: when we are not including
4847428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                // ones behind a window we didn't skip, and we are actually
4848428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                // taking a screenshot of a specific app.
4849428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                if (!including && appToken != null) {
4850428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    // Also, we can possibly skip this window if it is not
4851428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    // an IME target or the application for the screenshot
4852428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    // is not the current IME target.
4853428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    if (!ws.mIsImWindow || !isImeTarget) {
4854428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        // And finally, this window is of no interest if it
4855428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        // is not associated with the screenshot app.
4856428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        if (ws.mAppToken == null || ws.mAppToken.token != appToken) {
4857428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                            continue;
4858428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        }
4859428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    }
4860428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                }
4861428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn
4862428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                // We keep on including windows until we go past a full-screen
4863428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                // window.
4864428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                including = !ws.mIsImWindow && !ws.isFullscreen(dw, dh);
4865428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn
4866d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn                if (maxLayer < ws.mAnimLayer) {
4867d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn                    maxLayer = ws.mAnimLayer;
4868d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn                }
48692aded18b0ef9f189771f70f05091493a44ec46aeJim Miller
48702aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                // Don't include wallpaper in bounds calculation
48712aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                if (!ws.mIsWallpaper) {
4872ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                    final Rect wf = ws.mFrame;
48732aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                    final Rect cr = ws.mContentInsets;
48742aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                    int left = wf.left + cr.left;
48752aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                    int top = wf.top + cr.top;
48762aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                    int right = wf.right - cr.right;
48772aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                    int bottom = wf.bottom - cr.bottom;
48782aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                    frame.union(left, top, right, bottom);
48792aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                }
48800aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            }
48810aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            Binder.restoreCallingIdentity(ident);
48820aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
4883dd962ee1633b1e479bca5eae83744262fb69867fDianne Hackborn            // Constrain frame to the screen size.
4884dd962ee1633b1e479bca5eae83744262fb69867fDianne Hackborn            frame.intersect(0, 0, dw, dh);
4885e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller
4886cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn            if (frame.isEmpty() || maxLayer == 0) {
48870aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                return null;
48880aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            }
48890aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
48900aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            // The screenshot API does not apply the current screen rotation.
48910aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            rot = mDisplay.getRotation();
48920aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            int fw = frame.width();
48930aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            int fh = frame.height();
48940aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
489528637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller            // Constrain thumbnail to smaller of screen width or height. Assumes aspect
489628637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller            // of thumbnail is the same as the screen (in landscape) or square.
489728637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller            if (dw <= dh) {
489828637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller                scale = width / (float) fw; // portrait
489928637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller            } else {
490028637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller                scale = height / (float) fh; // landscape
490128637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller            }
49020aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
49030aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            // The screen shot will contain the entire screen.
4904428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            dw = (int)(dw*scale);
4905428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            dh = (int)(dh*scale);
49060aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            if (rot == Surface.ROTATION_90 || rot == Surface.ROTATION_270) {
49070aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                int tmp = dw;
49080aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                dw = dh;
49090aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                dh = tmp;
49100aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                rot = (rot == Surface.ROTATION_90) ? Surface.ROTATION_270 : Surface.ROTATION_90;
49110aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            }
4912d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn            rawss = Surface.screenshot(dw, dh, 0, maxLayer);
49130aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        }
49140aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
4915cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn        if (rawss == null) {
491688b03bd2e12c10c73e455a7eccf7d1aa324049d7Dianne Hackborn            Log.w(TAG, "Failure taking screenshot for (" + dw + "x" + dh
491788b03bd2e12c10c73e455a7eccf7d1aa324049d7Dianne Hackborn                    + ") to layer " + maxLayer);
4918cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn            return null;
4919cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn        }
4920e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller
4921e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller        Bitmap bm = Bitmap.createBitmap(width, height, rawss.getConfig());
49220aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        Matrix matrix = new Matrix();
49230aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        ScreenRotationAnimation.createRotationMatrix(rot, dw, dh, matrix);
49240aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        matrix.postTranslate(-(int)(frame.left*scale), -(int)(frame.top*scale));
49250aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        Canvas canvas = new Canvas(bm);
49260aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        canvas.drawBitmap(rawss, matrix, null);
49276311d0a079702b29984c0d31937345be105e1a5eDianne Hackborn        canvas.setBitmap(null);
49280aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
49290aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        rawss.recycle();
49300aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        return bm;
49310aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn    }
49320aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
4933b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler    public void freezeRotation() {
4934b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION,
49352ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler                "freezeRotation()")) {
4936b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler            throw new SecurityException("Requires SET_ORIENTATION permission");
4937b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        }
4938b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler
49392ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler        if (DEBUG_ORIENTATION) Slog.v(TAG, "freezeRotation: mRotation=" + mRotation);
49402ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler
4941b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        mPolicy.setUserRotationMode(WindowManagerPolicy.USER_ROTATION_LOCKED, mRotation);
4942b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        setRotationUnchecked(WindowManagerPolicy.USE_LAST_ROTATION, false, 0);
4943b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler    }
4944b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler
4945b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler    public void thawRotation() {
4946b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION,
49472ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler                "thawRotation()")) {
4948b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler            throw new SecurityException("Requires SET_ORIENTATION permission");
4949b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        }
4950b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler
49512ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler        if (DEBUG_ORIENTATION) Slog.v(TAG, "thawRotation: mRotation=" + mRotation);
49522ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler
49532ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler        mPolicy.setUserRotationMode(WindowManagerPolicy.USER_ROTATION_FREE, 777); // rot not used
4954b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        setRotationUnchecked(WindowManagerPolicy.USE_LAST_ROTATION, false, 0);
4955b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler    }
4956b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler
495706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy    public void setRotation(int rotation,
49581e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn            boolean alwaysSendConfiguration, int animFlags) {
49599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION,
49601e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn                "setRotation()")) {
4961cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires SET_ORIENTATION permission");
49629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
49639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49641e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn        setRotationUnchecked(rotation, alwaysSendConfiguration, animFlags);
49659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
496606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
49671e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn    public void setRotationUnchecked(int rotation,
49681e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn            boolean alwaysSendConfiguration, int animFlags) {
49698a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if(DEBUG_ORIENTATION) Slog.v(TAG,
4970910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner                   "setRotationUnchecked(rotation=" + rotation +
4971910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner                   " alwaysSendConfiguration=" + alwaysSendConfiguration +
4972910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner                   " animFlags=" + animFlags);
497306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
49749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long origId = Binder.clearCallingIdentity();
49759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean changed;
49769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
497794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            changed = setRotationUncheckedLocked(rotation, animFlags, false);
49789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
497906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4980e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        if (changed || alwaysSendConfiguration) {
49819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendNewConfiguration();
49829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
498306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
49849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
49859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
498606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4987e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    /**
4988e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * Apply a new rotation to the screen, respecting the requests of
4989e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * applications.  Use WindowManagerPolicy.USE_LAST_ROTATION to simply
4990e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * re-evaluate the desired rotation.
4991e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     *
4992e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * Returns null if the rotation has been changed.  In this case YOU
4993e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * MUST CALL setNewConfiguration() TO UNFREEZE THE SCREEN.
4994e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     */
499594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn    public boolean setRotationUncheckedLocked(int rotation, int animFlags, boolean inTransaction) {
499624572375323dee79e3b456af07640ca194fd40bfJeff Brown        if (mDragState != null
499724572375323dee79e3b456af07640ca194fd40bfJeff Brown                || (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating())) {
499824572375323dee79e3b456af07640ca194fd40bfJeff Brown            // Potential rotation during a drag or while waiting for a previous orientation
499924572375323dee79e3b456af07640ca194fd40bfJeff Brown            // change to finish (rotation animation will be dismissed).
500024572375323dee79e3b456af07640ca194fd40bfJeff Brown            // Don't do the rotation now, but make a note to perform the rotation later.
500189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            if (DEBUG_ORIENTATION) Slog.v(TAG, "Deferring rotation.");
500289ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            if (rotation != WindowManagerPolicy.USE_LAST_ROTATION) {
500389ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                mDeferredRotation = rotation;
500489ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                mDeferredRotationAnimFlags = animFlags;
500589ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            }
5006ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate            return false;
5007ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate        }
5008ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate
50099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean changed;
50109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (rotation == WindowManagerPolicy.USE_LAST_ROTATION) {
501189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            if (mDeferredRotation != WindowManagerPolicy.USE_LAST_ROTATION) {
501289ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                rotation = mDeferredRotation;
501389ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                mRequestedRotation = rotation;
501489ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                mLastRotationFlags = mDeferredRotationAnimFlags;
501589ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            }
50169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            rotation = mRequestedRotation;
50179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
50189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRequestedRotation = rotation;
5019321ae681cad03d00ad1efc6f06f74268e00172a9Dianne Hackborn            mLastRotationFlags = animFlags;
50209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
502189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        mDeferredRotation = WindowManagerPolicy.USE_LAST_ROTATION;
50228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_ORIENTATION) Slog.v(TAG, "Overwriting rotation value from " + rotation);
5023c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        rotation = mPolicy.rotationForOrientationLw(mForcedAppOrientation,
50249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRotation, mDisplayEnabled);
50258a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_ORIENTATION) Slog.v(TAG, "new rotation is set to " + rotation);
5026dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn
5027dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        int desiredRotation = rotation;
5028dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        int lockedRotation = mPolicy.getLockedRotationLw();
5029dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        if (lockedRotation >= 0 && rotation != lockedRotation) {
5030dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            // We are locked in a rotation but something is requesting
5031dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            // a different rotation...  we will either keep the locked
5032dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            // rotation if it results in the same orientation, or have to
5033dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            // switch into an emulated orientation mode.
5034dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn
5035dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            // First, we know that our rotation is actually going to be
5036dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            // the locked rotation.
5037dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            rotation = lockedRotation;
5038dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn
5039dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            // Now the difference between the desired and lockedRotation
5040dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            // may mean that the orientation is different...  if that is
5041dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            // not the case, we can just make the desired rotation be the
5042dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            // same as the new locked rotation.
5043dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            switch (lockedRotation) {
5044dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                case Surface.ROTATION_0:
5045dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                    if (rotation == Surface.ROTATION_180) {
5046dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                        desiredRotation = lockedRotation;
5047dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                    }
5048dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                    break;
5049dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                case Surface.ROTATION_90:
5050dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                    if (rotation == Surface.ROTATION_270) {
5051dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                        desiredRotation = lockedRotation;
5052dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                    }
5053dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                    break;
5054dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                case Surface.ROTATION_180:
5055dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                    if (rotation == Surface.ROTATION_0) {
5056dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                        desiredRotation = lockedRotation;
5057dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                    }
5058dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                    break;
5059dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                case Surface.ROTATION_270:
5060dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                    if (rotation == Surface.ROTATION_90) {
5061dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                        desiredRotation = lockedRotation;
5062dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                    }
5063dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                    break;
5064dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            }
5065dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        }
5066dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn
50679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        changed = mDisplayEnabled && mRotation != rotation;
5068dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        if (mAltOrientation != (rotation != desiredRotation)) {
5069dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            changed = true;
5070dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            mAltOrientation = rotation != desiredRotation;
5071dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        }
507206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
50739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (changed) {
50748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_ORIENTATION) Slog.v(TAG,
50759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Rotation changed to " + rotation
50769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " from " + mRotation
50779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " (forceApp=" + mForcedAppOrientation
50789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ", req=" + mRequestedRotation + ")");
50799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRotation = rotation;
50809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowsFreezingScreen = true;
50819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT);
50829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendMessageDelayed(mH.obtainMessage(H.WINDOW_FREEZE_TIMEOUT),
50839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    2000);
5084e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            mWaitingForConfig = true;
5085e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            mLayoutNeeded = true;
508694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            startFreezingDisplayLocked(inTransaction);
50875fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            //Slog.i(TAG, "Setting rotation to " + rotation + ", animFlags=" + animFlags);
508800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            mInputManager.setDisplayOrientation(0, rotation);
50899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDisplayEnabled) {
5090910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner                // NOTE: We disable the rotation in the emulator because
5091910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner                //       it doesn't support hardware OpenGL emulation yet.
5092de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                if (CUSTOM_SCREEN_ROTATION && mScreenRotationAnimation != null
5093de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                        && mScreenRotationAnimation.hasScreenshot()) {
5094a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn                    Surface.freezeDisplay(0);
509594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    if (!inTransaction) {
509694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        if (SHOW_TRANSACTIONS) Slog.i(TAG,
509794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                                ">>> OPEN TRANSACTION setRotationUnchecked");
509894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        Surface.openTransaction();
509994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    }
510094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    try {
510194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        if (mScreenRotationAnimation != null) {
510294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                            mScreenRotationAnimation.setRotation(rotation);
510394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        }
510494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    } finally {
510594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        if (!inTransaction) {
510694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                            Surface.closeTransaction();
510794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                            if (SHOW_TRANSACTIONS) Slog.i(TAG,
510894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                                    "<<< CLOSE TRANSACTION setRotationUnchecked");
510994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        }
5110a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn                    }
5111a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn                    Surface.setOrientation(0, rotation, animFlags);
5112a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn                    Surface.unfreezeDisplay(0);
5113a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn                } else {
5114a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn                    Surface.setOrientation(0, rotation, animFlags);
5115a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn                }
51167916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                rebuildBlackFrame(inTransaction);
51179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5118dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn
51199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=mWindows.size()-1; i>=0; i--) {
5120e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState w = mWindows.get(i);
51219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (w.mSurface != null) {
51229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mOrientationChanging = true;
51239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
51249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
51259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=mRotationWatchers.size()-1; i>=0; i--) {
51269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
51279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRotationWatchers.get(i).onRotationChanged(rotation);
51289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
51299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
51309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
51319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } //end if changed
513206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
51339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return changed;
51349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
513506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
51369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getRotation() {
51379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRotation;
51389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
51399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int watchRotation(IRotationWatcher watcher) {
51419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final IBinder watcherBinder = watcher.asBinder();
51429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IBinder.DeathRecipient dr = new IBinder.DeathRecipient() {
51439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void binderDied() {
51449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (mWindowMap) {
51459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i=0; i<mRotationWatchers.size(); i++) {
51469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (watcherBinder == mRotationWatchers.get(i).asBinder()) {
5147fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu                            IRotationWatcher removed = mRotationWatchers.remove(i);
5148fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu                            if (removed != null) {
5149fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu                                removed.asBinder().unlinkToDeath(this, 0);
5150fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu                            }
51519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            i--;
51529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
51539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
51549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
51559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
51569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
515706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
51589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
51599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
51609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                watcher.asBinder().linkToDeath(dr, 0);
51619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRotationWatchers.add(watcher);
51629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
51639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Client died, no cleanup needed.
51649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
516506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
51669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mRotation;
51679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
51699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5171dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     * Apps that use the compact menu panel (as controlled by the panelMenuIsCompact
5172dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     * theme attribute) on devices that feature a physical options menu key attempt to position
5173dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     * their menu panel window along the edge of the screen nearest the physical menu key.
5174dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     * This lowers the travel distance between invoking the menu panel and selecting
5175dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     * a menu option.
5176dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     *
5177dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     * This method helps control where that menu is placed. Its current implementation makes
5178dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     * assumptions about the menu key and its relationship to the screen based on whether
5179dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     * the device's natural orientation is portrait (width < height) or landscape.
5180dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     *
5181dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     * The menu key is assumed to be located along the bottom edge of natural-portrait
5182dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     * devices and along the right edge of natural-landscape devices. If these assumptions
5183dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     * do not hold for the target device, this method should be changed to reflect that.
5184dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     *
5185dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     * @return A {@link Gravity} value for placing the options menu window
5186dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     */
5187dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell    public int getPreferredOptionsPanelGravity() {
5188dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell        synchronized (mWindowMap) {
5189dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell            final int rotation = getRotation();
5190dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell
5191dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell            if (mInitialDisplayWidth < mInitialDisplayHeight) {
5192dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                // On devices with a natural orientation of portrait
5193dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                switch (rotation) {
5194dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                    default:
5195dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                    case Surface.ROTATION_0:
5196dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                        return Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
5197dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                    case Surface.ROTATION_90:
5198dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                        return Gravity.RIGHT | Gravity.CENTER_VERTICAL;
5199dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                    case Surface.ROTATION_180:
5200dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                        return Gravity.CENTER_HORIZONTAL | Gravity.TOP;
5201dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                    case Surface.ROTATION_270:
5202dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                        return Gravity.LEFT | Gravity.CENTER_VERTICAL;
5203dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                }
5204dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell            } else {
5205dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                // On devices with a natural orientation of landscape
5206dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                switch (rotation) {
5207dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                    default:
5208dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                    case Surface.ROTATION_0:
5209dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                        return Gravity.RIGHT | Gravity.CENTER_VERTICAL;
5210dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                    case Surface.ROTATION_90:
5211dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                        return Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
5212dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                    case Surface.ROTATION_180:
5213dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                        return Gravity.LEFT | Gravity.CENTER_VERTICAL;
5214dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                    case Surface.ROTATION_270:
5215dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                        return Gravity.CENTER_HORIZONTAL | Gravity.TOP;
5216dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                }
5217dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell            }
5218dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell        }
5219dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell    }
5220dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell
5221dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell    /**
52229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Starts the view server on the specified port.
52239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
52249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param port The port to listener to.
52259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
52269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the server was successfully started, false otherwise.
52279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5228a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn     * @see com.android.server.wm.ViewServer
5229a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn     * @see com.android.server.wm.ViewServer#VIEW_SERVER_DEFAULT_PORT
52309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
52319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean startViewServer(int port) {
523206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy        if (isSystemSecure()) {
52339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
52349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(Manifest.permission.DUMP, "startViewServer")) {
52379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
52389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (port < 1024) {
52419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
52429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mViewServer != null) {
52459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mViewServer.isRunning()) {
52469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
52479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mViewServer.start();
52489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IOException e) {
52498a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "View server did not start");
52509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
52519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
52539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
52569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mViewServer = new ViewServer(this, port);
52579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mViewServer.start();
52589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
52598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "View server did not start");
52609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
52629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
52639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
526406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy    private boolean isSystemSecure() {
526506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy        return "1".equals(SystemProperties.get(SYSTEM_SECURE, "1")) &&
526606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                "0".equals(SystemProperties.get(SYSTEM_DEBUGGABLE, "0"));
526706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy    }
526806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
52699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
52709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Stops the view server if it exists.
52719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
52729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the server stopped, false if it wasn't started or
52739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         couldn't be stopped.
52749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5275a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn     * @see com.android.server.wm.ViewServer
52769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
52779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean stopViewServer() {
527806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy        if (isSystemSecure()) {
52799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
52809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(Manifest.permission.DUMP, "stopViewServer")) {
52839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
52849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mViewServer != null) {
52879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mViewServer.stop();
52889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
52909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
52919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
52939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether the view server is running.
52949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
52959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the server is running, false otherwise.
52969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5297a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn     * @see com.android.server.wm.ViewServer
52989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
52999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isViewServerRunning() {
530006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy        if (isSystemSecure()) {
53019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
53029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
53039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(Manifest.permission.DUMP, "isViewServerRunning")) {
53059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
53069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
53079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mViewServer != null && mViewServer.isRunning();
53099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
53109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
53129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Lists all availble windows in the system. The listing is written in the
53139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * specified Socket's output stream with the following syntax:
53149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * windowHashCodeInHexadecimal windowName
53159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Each line of the ouput represents a different window.
53169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
53179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param client The remote client to send the listing to.
53189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return False if an error occured, true otherwise.
53199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
53209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean viewServerListWindows(Socket client) {
532106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy        if (isSystemSecure()) {
53229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
53239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
53249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean result = true;
53269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5327e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        WindowState[] windows;
53289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
53299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //noinspection unchecked
5330e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            windows = mWindows.toArray(new WindowState[mWindows.size()]);
53319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
53329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        BufferedWriter out = null;
53349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Any uncaught exception will crash the system process
53369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
53379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            OutputStream clientStream = client.getOutputStream();
53389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out = new BufferedWriter(new OutputStreamWriter(clientStream), 8 * 1024);
53399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int count = windows.length;
53419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < count; i++) {
5342e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                final WindowState w = windows[i];
53439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.write(Integer.toHexString(System.identityHashCode(w)));
53449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.write(' ');
53459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.append(w.mAttrs.getTitle());
53469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.write('\n');
53479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
53489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.write("DONE.\n");
53509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.flush();
53519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
53529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            result = false;
53539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
53549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (out != null) {
53559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
53569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.close();
53579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IOException e) {
53589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    result = false;
53599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
53609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
53619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
53629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
53649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
53659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5367f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev     * Returns the focused window in the following format:
5368f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev     * windowHashCodeInHexadecimal windowName
5369f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev     *
5370f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev     * @param client The remote client to send the listing to.
5371f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev     * @return False if an error occurred, true otherwise.
5372f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev     */
5373f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev    boolean viewServerGetFocusedWindow(Socket client) {
5374f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        if (isSystemSecure()) {
5375f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            return false;
5376f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        }
5377f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev
5378f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        boolean result = true;
5379f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev
5380f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        WindowState focusedWindow = getFocusedWindow();
5381f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev
5382f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        BufferedWriter out = null;
5383f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev
5384f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        // Any uncaught exception will crash the system process
5385f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        try {
5386f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            OutputStream clientStream = client.getOutputStream();
5387f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            out = new BufferedWriter(new OutputStreamWriter(clientStream), 8 * 1024);
5388f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev
5389f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            if(focusedWindow != null) {
5390f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev                out.write(Integer.toHexString(System.identityHashCode(focusedWindow)));
5391f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev                out.write(' ');
5392f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev                out.append(focusedWindow.mAttrs.getTitle());
5393f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            }
5394f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            out.write('\n');
5395f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            out.flush();
5396f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        } catch (Exception e) {
5397f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            result = false;
53989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
53999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (out != null) {
54009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
54019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.close();
54029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IOException e) {
54039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    result = false;
54049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
54059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
54069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
54079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
54099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
54109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
54129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sends a command to a target window. The result of the command, if any, will be
54139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * written in the output stream of the specified socket.
54149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
54159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The parameters must follow this syntax:
54169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * windowHashcode extra
54179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
54189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Where XX is the length in characeters of the windowTitle.
54199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
54209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The first parameter is the target window. The window with the specified hashcode
54219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be the target. If no target can be found, nothing happens. The extra parameters
54229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be delivered to the target window and as parameters to the command itself.
54239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
54249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param client The remote client to sent the result, if any, to.
54259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param command The command to execute.
54269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param parameters The command parameters.
54279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
54289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the command was successfully delivered, false otherwise. This does
54299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         not indicate whether the command itself was successful.
54309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
54319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean viewServerWindowCommand(Socket client, String command, String parameters) {
543206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy        if (isSystemSecure()) {
54339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
54349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
54359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean success = true;
54379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data = null;
54389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel reply = null;
54399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
544043b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev        BufferedWriter out = null;
544143b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev
54429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Any uncaught exception will crash the system process
54439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
54449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Find the hashcode of the window
54459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int index = parameters.indexOf(' ');
54469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (index == -1) {
54479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                index = parameters.length();
54489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
54499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final String code = parameters.substring(0, index);
5450236092a36216c79507ec19eb207831810caced19Romain Guy            int hashCode = (int) Long.parseLong(code, 16);
54519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Extract the command's parameter after the window description
54539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (index < parameters.length()) {
54549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                parameters = parameters.substring(index + 1);
54559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
54569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                parameters = "";
54579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
54589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            final WindowState window = findWindow(hashCode);
54609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (window == null) {
54619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
54629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
54639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data = Parcel.obtain();
54659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.writeInterfaceToken("android.view.IWindow");
54669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.writeString(command);
54679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.writeString(parameters);
54689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.writeInt(1);
54699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ParcelFileDescriptor.fromSocket(client).writeToParcel(data, 0);
54709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply = Parcel.obtain();
54729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final IBinder binder = window.mClient.asBinder();
54749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // TODO: GET THE TRANSACTION CODE IN A SAFER MANNER
54759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            binder.transact(IBinder.FIRST_CALL_TRANSACTION, data, reply, 0);
54769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply.readException();
54789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
547943b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev            if (!client.isOutputShutdown()) {
548043b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
548143b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                out.write("DONE\n");
548243b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                out.flush();
548343b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev            }
548443b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev
54859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
54868a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Could not send command " + command + " with parameters " + parameters, e);
54879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            success = false;
54889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
54899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (data != null) {
54909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                data.recycle();
54919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
54929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (reply != null) {
54939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reply.recycle();
54949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
549543b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev            if (out != null) {
549643b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                try {
549743b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                    out.close();
549843b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                } catch (IOException e) {
549943b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev
550043b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                }
550143b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev            }
55029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return success;
55059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
55069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5507dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    public void addWindowChangeListener(WindowChangeListener listener) {
5508dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        synchronized(mWindowMap) {
5509dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            mWindowChangeListeners.add(listener);
5510dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        }
5511dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    }
5512dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev
5513dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    public void removeWindowChangeListener(WindowChangeListener listener) {
5514dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        synchronized(mWindowMap) {
5515dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            mWindowChangeListeners.remove(listener);
5516dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        }
5517dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    }
5518dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev
5519dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    private void notifyWindowsChanged() {
5520dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        WindowChangeListener[] windowChangeListeners;
5521dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        synchronized(mWindowMap) {
5522dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            if(mWindowChangeListeners.isEmpty()) {
5523dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                return;
5524dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            }
5525dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            windowChangeListeners = new WindowChangeListener[mWindowChangeListeners.size()];
5526dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            windowChangeListeners = mWindowChangeListeners.toArray(windowChangeListeners);
5527dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        }
5528dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        int N = windowChangeListeners.length;
5529dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        for(int i = 0; i < N; i++) {
5530dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            windowChangeListeners[i].windowsChanged();
5531dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        }
5532dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    }
5533dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev
55346e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev    private void notifyFocusChanged() {
55356e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        WindowChangeListener[] windowChangeListeners;
55366e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        synchronized(mWindowMap) {
55376e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev            if(mWindowChangeListeners.isEmpty()) {
55386e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev                return;
55396e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev            }
55406e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev            windowChangeListeners = new WindowChangeListener[mWindowChangeListeners.size()];
55416e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev            windowChangeListeners = mWindowChangeListeners.toArray(windowChangeListeners);
55426e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        }
55436e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        int N = windowChangeListeners.length;
55446e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        for(int i = 0; i < N; i++) {
55456e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev            windowChangeListeners[i].focusChanged();
55466e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        }
55476e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev    }
55486e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev
55499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowState findWindow(int hashCode) {
55509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (hashCode == -1) {
55519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getFocusedWindow();
55529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
5555e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            final ArrayList<WindowState> windows = mWindows;
55569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int count = windows.size();
55579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < count; i++) {
5559e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState w = windows.get(i);
55609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (System.identityHashCode(w) == hashCode) {
55619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return w;
55629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
55639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
55649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
55679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
55689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
55709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Instruct the Activity Manager to fetch the current configuration and broadcast
55719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that to config-changed listeners if appropriate.
55729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
55739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void sendNewConfiguration() {
55749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
55759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mActivityManager.updateConfiguration(null);
55769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
55779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
557906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
55809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Configuration computeNewConfiguration() {
55819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
558294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            Configuration config = computeNewConfigurationLocked();
558394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            if (config == null && mWaitingForConfig) {
558494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                // Nothing changed but we are waiting for something... stop that!
558594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                mWaitingForConfig = false;
558694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                performLayoutAndPlaceSurfacesLocked();
558794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            }
558894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            return config;
5589c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        }
5590c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn    }
559106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
5592c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn    Configuration computeNewConfigurationLocked() {
5593c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        Configuration config = new Configuration();
5594c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        if (!computeNewConfigurationLocked(config)) {
5595c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn            return null;
5596c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        }
5597c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        return config;
5598c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn    }
559906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
560069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    private int reduceConfigWidthSize(int curSize, int rotation, float density, int dw) {
560169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        int size = (int)(mPolicy.getConfigDisplayWidth(rotation, dw) / density);
560269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        if (size < curSize) {
560369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn            curSize = size;
560469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        }
560569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        return curSize;
560669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    }
560769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn
56085fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    private int computeSmallestWidth(boolean rotated, int dw, int dh, float density) {
56095fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        // We need to determine the smallest width that will occur under normal
56105fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        // operation.  To this, start with the base screen size and compute the
56115fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        // width under the different possible rotations.  We need to un-rotate
56125fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        // the current screen dimensions before doing this.
56135fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        int unrotDw, unrotDh;
56145fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        if (rotated) {
56155fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            unrotDw = dh;
56165fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            unrotDh = dw;
56175fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        } else {
56185fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            unrotDw = dw;
56195fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            unrotDh = dh;
56205fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        }
56215fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        int sw = reduceConfigWidthSize(unrotDw, Surface.ROTATION_0, density, unrotDw);
56225fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        sw = reduceConfigWidthSize(sw, Surface.ROTATION_90, density, unrotDh);
56235fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        sw = reduceConfigWidthSize(sw, Surface.ROTATION_180, density, unrotDw);
56245fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        sw = reduceConfigWidthSize(sw, Surface.ROTATION_270, density, unrotDh);
56255fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        return sw;
56265fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    }
56275fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
562848a7651823030ed3c0f4c084b423430044425feaDianne Hackborn    private int reduceCompatConfigWidthSize(int curSize, int rotation, DisplayMetrics dm,
562948a7651823030ed3c0f4c084b423430044425feaDianne Hackborn            int dw, int dh) {
56302b31d53161789358de57fd396716a6503855c5daDianne Hackborn        dm.noncompatWidthPixels = mPolicy.getNonDecorDisplayWidth(rotation, dw);
56312b31d53161789358de57fd396716a6503855c5daDianne Hackborn        dm.noncompatHeightPixels = mPolicy.getNonDecorDisplayHeight(rotation, dh);
563248a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        float scale = CompatibilityInfo.computeCompatibleScaling(dm, null);
56332b31d53161789358de57fd396716a6503855c5daDianne Hackborn        int size = (int)(((dm.noncompatWidthPixels / scale) / dm.density) + .5f);
563448a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        if (curSize == 0 || size < curSize) {
563548a7651823030ed3c0f4c084b423430044425feaDianne Hackborn            curSize = size;
563648a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        }
563748a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        return curSize;
563848a7651823030ed3c0f4c084b423430044425feaDianne Hackborn    }
563948a7651823030ed3c0f4c084b423430044425feaDianne Hackborn
564048a7651823030ed3c0f4c084b423430044425feaDianne Hackborn    private int computeCompatSmallestWidth(boolean rotated, DisplayMetrics dm, int dw, int dh) {
564148a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        mTmpDisplayMetrics.setTo(dm);
564248a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        dm = mTmpDisplayMetrics;
564348a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        int unrotDw, unrotDh;
564448a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        if (rotated) {
564548a7651823030ed3c0f4c084b423430044425feaDianne Hackborn            unrotDw = dh;
564648a7651823030ed3c0f4c084b423430044425feaDianne Hackborn            unrotDh = dw;
564748a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        } else {
564848a7651823030ed3c0f4c084b423430044425feaDianne Hackborn            unrotDw = dw;
564948a7651823030ed3c0f4c084b423430044425feaDianne Hackborn            unrotDh = dh;
565048a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        }
565148a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        int sw = reduceCompatConfigWidthSize(0, Surface.ROTATION_0, dm, unrotDw, unrotDh);
565248a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        sw = reduceCompatConfigWidthSize(sw, Surface.ROTATION_90, dm, unrotDh, unrotDw);
565348a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        sw = reduceCompatConfigWidthSize(sw, Surface.ROTATION_180, dm, unrotDw, unrotDh);
565448a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        sw = reduceCompatConfigWidthSize(sw, Surface.ROTATION_270, dm, unrotDh, unrotDw);
565548a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        return sw;
565648a7651823030ed3c0f4c084b423430044425feaDianne Hackborn    }
565748a7651823030ed3c0f4c084b423430044425feaDianne Hackborn
5658c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn    boolean computeNewConfigurationLocked(Configuration config) {
5659c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        if (mDisplay == null) {
5660c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn            return false;
56619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
566200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown
566300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        mInputManager.getInputConfiguration(config);
5664b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate
5665b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        // Use the effective "visual" dimensions based on current rotation
5666b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        final boolean rotated = (mRotation == Surface.ROTATION_90
5667b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate                || mRotation == Surface.ROTATION_270);
56687916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        final int realdw = rotated ? mBaseDisplayHeight : mBaseDisplayWidth;
56697916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        final int realdh = rotated ? mBaseDisplayWidth : mBaseDisplayHeight;
5670dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn
5671dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        if (mAltOrientation) {
5672dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            mCurDisplayWidth = realdw;
5673dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            mCurDisplayHeight = realdh;
5674dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            if (realdw > realdh) {
5675dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                // Turn landscape into portrait.
5676dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                int maxw = (int)(realdh/1.3f);
5677dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                if (maxw < realdw) {
5678dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                    mCurDisplayWidth = maxw;
5679dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                }
5680dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            } else {
5681dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                // Turn portrait into landscape.
5682dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                int maxh = (int)(realdw/1.3f);
5683dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                if (maxh < realdh) {
5684dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                    mCurDisplayHeight = maxh;
5685dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                }
5686dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            }
5687dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        } else {
5688dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            mCurDisplayWidth = realdw;
5689dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            mCurDisplayHeight = realdh;
5690dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        }
5691dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn
5692dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        final int dw = mCurDisplayWidth;
5693dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        final int dh = mCurDisplayHeight;
5694b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate
5695c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        int orientation = Configuration.ORIENTATION_SQUARE;
5696c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        if (dw < dh) {
5697c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn            orientation = Configuration.ORIENTATION_PORTRAIT;
5698c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        } else if (dw > dh) {
5699c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn            orientation = Configuration.ORIENTATION_LANDSCAPE;
5700c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        }
5701c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        config.orientation = orientation;
5702ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
5703bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        // Update real display metrics.
5704bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        mDisplay.getMetricsWithSize(mRealDisplayMetrics, mCurDisplayWidth, mCurDisplayHeight);
5705dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn
5706bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        // Update application display metrics.
5707bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        final DisplayMetrics dm = mDisplayMetrics;
5708bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        mAppDisplayWidth = mPolicy.getNonDecorDisplayWidth(mRotation, dw);
5709bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        mAppDisplayHeight = mPolicy.getNonDecorDisplayHeight(mRotation, dh);
5710bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        mDisplay.getMetricsWithSize(dm, mAppDisplayWidth, mAppDisplayHeight);
5711dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn
57125fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        mCompatibleScreenScale = CompatibilityInfo.computeCompatibleScaling(dm,
57135fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                mCompatDisplayMetrics);
57141ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
571569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        config.screenWidthDp = (int)(mPolicy.getConfigDisplayWidth(mRotation, dw) / dm.density);
571669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        config.screenHeightDp = (int)(mPolicy.getConfigDisplayHeight(mRotation, dh) / dm.density);
57175fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        config.smallestScreenWidthDp = computeSmallestWidth(rotated, dw, dh, dm.density);
57185fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
57195fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        config.compatScreenWidthDp = (int)(config.screenWidthDp / mCompatibleScreenScale);
57205fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        config.compatScreenHeightDp = (int)(config.screenHeightDp / mCompatibleScreenScale);
572148a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        config.compatSmallestScreenWidthDp = computeCompatSmallestWidth(rotated, dm, dw, dh);
572269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn
572369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        // We need to determine the smallest width that will occur under normal
572469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        // operation.  To this, start with the base screen size and compute the
572569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        // width under the different possible rotations.  We need to un-rotate
572669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        // the current screen dimensions before doing this.
572769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        int unrotDw, unrotDh;
572869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        if (rotated) {
572969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn            unrotDw = dh;
573069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn            unrotDh = dw;
573169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        } else {
573269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn            unrotDw = dw;
573369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn            unrotDh = dh;
573469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        }
573569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        config.smallestScreenWidthDp = reduceConfigWidthSize(unrotDw,
573669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn                Surface.ROTATION_0, dm.density, unrotDw);
573769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        config.smallestScreenWidthDp = reduceConfigWidthSize(config.smallestScreenWidthDp,
573869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn                Surface.ROTATION_90, dm.density, unrotDh);
573969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        config.smallestScreenWidthDp = reduceConfigWidthSize(config.smallestScreenWidthDp,
574069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn                Surface.ROTATION_180, dm.density, unrotDw);
574169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        config.smallestScreenWidthDp = reduceConfigWidthSize(config.smallestScreenWidthDp,
574269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn                Surface.ROTATION_270, dm.density, unrotDh);
57433fc982f41fda1f254bfbc35490d81cd82a0ed90aDianne Hackborn
5744dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        // Compute the screen layout size class.
5745dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        int screenLayout;
5746dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        int longSize = dw;
5747dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        int shortSize = dh;
5748dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        if (longSize < shortSize) {
5749dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            int tmp = longSize;
5750dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            longSize = shortSize;
5751dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            shortSize = tmp;
5752dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        }
5753dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        longSize = (int)(longSize/dm.density);
5754dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        shortSize = (int)(shortSize/dm.density);
5755dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn
5756dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        // These semi-magic numbers define our compatibility modes for
5757dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        // applications with different screens.  These are guarantees to
5758dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        // app developers about the space they can expect for a particular
5759dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        // configuration.  DO NOT CHANGE!
5760dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        if (longSize < 470) {
5761dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            // This is shorter than an HVGA normal density screen (which
5762dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            // is 480 pixels on its long side).
5763dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            screenLayout = Configuration.SCREENLAYOUT_SIZE_SMALL
5764dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                    | Configuration.SCREENLAYOUT_LONG_NO;
5765dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        } else {
5766dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            // What size is this screen screen?
5767dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            if (longSize >= 960 && shortSize >= 720) {
5768dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                // 1.5xVGA or larger screens at medium density are the point
5769dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                // at which we consider it to be an extra large screen.
5770dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                screenLayout = Configuration.SCREENLAYOUT_SIZE_XLARGE;
5771dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            } else if (longSize >= 640 && shortSize >= 480) {
5772dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                // VGA or larger screens at medium density are the point
5773dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                // at which we consider it to be a large screen.
5774dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                screenLayout = Configuration.SCREENLAYOUT_SIZE_LARGE;
5775723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            } else {
5776dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                screenLayout = Configuration.SCREENLAYOUT_SIZE_NORMAL;
5777dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            }
5778ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
5779dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            // If this screen is wider than normal HVGA, or taller
5780dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            // than FWVGA, then for old apps we want to run in size
5781dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            // compatibility mode.
5782dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            if (shortSize > 321 || longSize > 570) {
5783dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                screenLayout |= Configuration.SCREENLAYOUT_COMPAT_NEEDED;
5784dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            }
5785dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn
5786dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            // Is this a long screen?
5787dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            if (((longSize*3)/5) >= (shortSize-1)) {
5788dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                // Anything wider than WVGA (5:3) is considering to be long.
5789dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                screenLayout |= Configuration.SCREENLAYOUT_LONG_YES;
5790dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            } else {
5791dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                screenLayout |= Configuration.SCREENLAYOUT_LONG_NO;
5792723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            }
5793723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        }
5794dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        config.screenLayout = screenLayout;
5795ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
5796597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        // Determine whether a hard keyboard is available and enabled.
57972992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        boolean hardKeyboardAvailable = config.keyboard != Configuration.KEYBOARD_NOKEYS;
57982992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        if (hardKeyboardAvailable != mHardKeyboardAvailable) {
57992992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            mHardKeyboardAvailable = hardKeyboardAvailable;
58002992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            mHardKeyboardEnabled = hardKeyboardAvailable;
58012992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
58022992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            mH.removeMessages(H.REPORT_HARD_KEYBOARD_STATUS_CHANGE);
58032992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            mH.sendEmptyMessage(H.REPORT_HARD_KEYBOARD_STATUS_CHANGE);
58042992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
58052992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        if (!mHardKeyboardEnabled) {
58062992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            config.keyboard = Configuration.KEYBOARD_NOKEYS;
58072992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
5808597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown
5809597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        // Update value of keyboardHidden, hardKeyboardHidden and navigationHidden
5810597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        // based on whether a hard or soft keyboard is present, whether navigation keys
5811597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        // are present and the lid switch state.
5812597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        config.keyboardHidden = Configuration.KEYBOARDHIDDEN_NO;
5813597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_NO;
5814597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        config.navigationHidden = Configuration.NAVIGATIONHIDDEN_NO;
5815597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        mPolicy.adjustConfigurationLw(config);
5816c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        return true;
58179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5818a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
58192992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    public boolean isHardKeyboardAvailable() {
58202992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        synchronized (mWindowMap) {
58212992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            return mHardKeyboardAvailable;
58222992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
58232992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
58242992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
58252992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    public boolean isHardKeyboardEnabled() {
58262992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        synchronized (mWindowMap) {
58272992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            return mHardKeyboardEnabled;
58282992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
58292992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
58302992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
58312992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    public void setHardKeyboardEnabled(boolean enabled) {
58322992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        synchronized (mWindowMap) {
58332992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            if (mHardKeyboardEnabled != enabled) {
58342992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                mHardKeyboardEnabled = enabled;
58352992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
58362992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            }
58372992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
58382992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
58392992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
58402992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    public void setOnHardKeyboardStatusChangeListener(
58412992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            OnHardKeyboardStatusChangeListener listener) {
58422992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        synchronized (mWindowMap) {
58432992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            mHardKeyboardStatusChangeListener = listener;
58442992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
58452992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
58462992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
58472992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    void notifyHardKeyboardStatusChange() {
58482992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        final boolean available, enabled;
58492992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        final OnHardKeyboardStatusChangeListener listener;
58502992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        synchronized (mWindowMap) {
58512992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            listener = mHardKeyboardStatusChangeListener;
58522992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            available = mHardKeyboardAvailable;
58532992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            enabled = mHardKeyboardEnabled;
58542992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
58552992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        if (listener != null) {
58562992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            listener.onHardKeyboardStatusChange(available, enabled);
58572992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
58582992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
58592992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
5860a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    // -------------------------------------------------------------
5861a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    // Drag and drop
5862a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    // -------------------------------------------------------------
5863a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
5864a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    IBinder prepareDragSurface(IWindow window, SurfaceSession session,
586502d2b3ba9ba830a8147db2739613f7bbb2d0fcbfChristopher Tate            int flags, int width, int height, Surface outSurface) {
5866a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        if (DEBUG_DRAG) {
5867a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            Slog.d(TAG, "prepare drag surface: w=" + width + " h=" + height
586802d2b3ba9ba830a8147db2739613f7bbb2d0fcbfChristopher Tate                    + " flags=" + Integer.toHexString(flags) + " win=" + window
5869a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    + " asbinder=" + window.asBinder());
5870a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        }
5871a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
5872a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        final int callerPid = Binder.getCallingPid();
5873a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        final long origId = Binder.clearCallingIdentity();
5874a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        IBinder token = null;
5875a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
5876a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        try {
5877a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            synchronized (mWindowMap) {
5878a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                try {
5879a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    if (mDragState == null) {
5880a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        Surface surface = new Surface(session, callerPid, "drag surface", 0,
5881a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                                width, height, PixelFormat.TRANSLUCENT, Surface.HIDDEN);
5882ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                        if (SHOW_TRANSACTIONS) Slog.i(TAG, "  DRAG "
5883ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                                + surface + ": CREATE");
5884a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        outSurface.copyFrom(surface);
58857b362e431f3e17a755e56bc7dbc99bd661cb46baChris Tate                        final IBinder winBinder = window.asBinder();
5886a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        token = new Binder();
58876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        mDragState = new DragState(this, token, surface, /*flags*/ 0, winBinder);
5888a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        mDragState.mSurface = surface;
5889a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        token = mDragState.mToken = new Binder();
5890a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
5891a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        // 5 second timeout for this window to actually begin the drag
58927b362e431f3e17a755e56bc7dbc99bd661cb46baChris Tate                        mH.removeMessages(H.DRAG_START_TIMEOUT, winBinder);
58937b362e431f3e17a755e56bc7dbc99bd661cb46baChris Tate                        Message msg = mH.obtainMessage(H.DRAG_START_TIMEOUT, winBinder);
5894a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        mH.sendMessageDelayed(msg, 5000);
5895a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    } else {
5896a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        Slog.w(TAG, "Drag already in progress");
5897a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
5898a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                } catch (Surface.OutOfResourcesException e) {
5899a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    Slog.e(TAG, "Can't allocate drag surface w=" + width + " h=" + height, e);
5900a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    if (mDragState != null) {
5901a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        mDragState.reset();
5902a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        mDragState = null;
5903a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
5904a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                }
5905a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            }
5906a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        } finally {
5907a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            Binder.restoreCallingIdentity(origId);
5908a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        }
5909a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
5910a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        return token;
5911a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    }
5912a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
59139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
59149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Input Events and Focus Management
59159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
591646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
59176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final InputMonitor mInputMonitor = new InputMonitor(this);
59187fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
59199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void pauseKeyDispatching(IBinder _token) {
59209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
59219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "pauseKeyDispatching()")) {
5922cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
59239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
592406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
59259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
59269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken token = mTokenMap.get(_token);
59279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token != null) {
592800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                mInputMonitor.pauseDispatchingLw(token);
59299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
59309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
59319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5932ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
59339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void resumeKeyDispatching(IBinder _token) {
59349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
59359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "resumeKeyDispatching()")) {
5936cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
5937e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan        }
5938e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan
59399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
59409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken token = mTokenMap.get(_token);
59419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token != null) {
594200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                mInputMonitor.resumeDispatchingLw(token);
5943e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan            }
5944e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan        }
59459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5946e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan
59479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setEventDispatching(boolean enabled) {
59489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
59499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "resumeKeyDispatching()")) {
5950cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
59519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
595206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
59539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
595400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            mInputMonitor.setEventDispatchingLw(enabled);
59559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
59569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
595706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
59589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
59599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Injects a keystroke event into the UI.
5960bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * Even when sync is false, this method may block while waiting for current
5961bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * input events to be dispatched.
596206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     *
596306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     * @param ev A motion event describing the keystroke action.  (Be sure to use
59649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link SystemClock#uptimeMillis()} as the timebase.)
59659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sync If true, wait for the event to be completed before returning to the caller.
59669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if event was dispatched, false if it was dropped for any reason
59679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
59689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean injectKeyEvent(KeyEvent ev, boolean sync) {
59699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long downTime = ev.getDownTime();
59709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long eventTime = ev.getEventTime();
597106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
59729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int action = ev.getAction();
59739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int code = ev.getKeyCode();
59749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int repeatCount = ev.getRepeatCount();
59759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int metaState = ev.getMetaState();
59769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int deviceId = ev.getDeviceId();
59779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int scancode = ev.getScanCode();
5978c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        int source = ev.getSource();
5979c6ded10dd1ee08c887d0e81d683a7611fbe3ca4dMike Playle        int flags = ev.getFlags();
5980c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
5981c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        if (source == InputDevice.SOURCE_UNKNOWN) {
5982c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            source = InputDevice.SOURCE_KEYBOARD;
5983c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        }
598406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
59859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (eventTime == 0) eventTime = SystemClock.uptimeMillis();
59869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (downTime == 0) downTime = eventTime;
598706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
59889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        KeyEvent newEvent = new KeyEvent(downTime, eventTime, action, code, repeatCount, metaState,
59894a88013a4a06a9ea80e8419f94694936e6b013f0Jean-Baptiste Queru                deviceId, scancode, flags | KeyEvent.FLAG_FROM_SYSTEM, source);
599006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
59912bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final int pid = Binder.getCallingPid();
59922bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final int uid = Binder.getCallingUid();
59932bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final long ident = Binder.clearCallingIdentity();
599446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
5995bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final int result = mInputManager.injectInputEvent(newEvent, pid, uid,
5996bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                sync ? InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISH
5997bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                        : InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT,
5998bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                INJECTION_TIMEOUT_MILLIS);
599946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
60002bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        Binder.restoreCallingIdentity(ident);
60017fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        return reportInjectionResult(result);
60029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
60039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
60049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
60059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Inject a pointer (touch) event into the UI.
6006bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * Even when sync is false, this method may block while waiting for current
6007bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * input events to be dispatched.
600806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     *
600906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     * @param ev A motion event describing the pointer (touch) action.  (As noted in
601006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     * {@link MotionEvent#obtain(long, long, int, float, float, int)}, be sure to use
60119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link SystemClock#uptimeMillis()} as the timebase.)
60129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sync If true, wait for the event to be completed before returning to the caller.
60139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if event was dispatched, false if it was dropped for any reason
60149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
60159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean injectPointerEvent(MotionEvent ev, boolean sync) {
60162bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final int pid = Binder.getCallingPid();
60172bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final int uid = Binder.getCallingUid();
60182bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final long ident = Binder.clearCallingIdentity();
601946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
6020c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        MotionEvent newEvent = MotionEvent.obtain(ev);
6021c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        if ((newEvent.getSource() & InputDevice.SOURCE_CLASS_POINTER) == 0) {
6022c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            newEvent.setSource(InputDevice.SOURCE_TOUCHSCREEN);
6023c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        }
6024c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
6025bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final int result = mInputManager.injectInputEvent(newEvent, pid, uid,
6026bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                sync ? InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISH
6027bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                        : InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT,
6028bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                INJECTION_TIMEOUT_MILLIS);
602946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
60302bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        Binder.restoreCallingIdentity(ident);
60317fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        return reportInjectionResult(result);
60329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
603306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
60349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
60359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Inject a trackball (navigation device) event into the UI.
6036bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * Even when sync is false, this method may block while waiting for current
6037bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * input events to be dispatched.
603806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     *
603906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     * @param ev A motion event describing the trackball action.  (As noted in
604006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     * {@link MotionEvent#obtain(long, long, int, float, float, int)}, be sure to use
60419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link SystemClock#uptimeMillis()} as the timebase.)
60429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sync If true, wait for the event to be completed before returning to the caller.
60439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if event was dispatched, false if it was dropped for any reason
60449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
60459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean injectTrackballEvent(MotionEvent ev, boolean sync) {
60462bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final int pid = Binder.getCallingPid();
60472bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final int uid = Binder.getCallingUid();
60482bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final long ident = Binder.clearCallingIdentity();
604946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
6050c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        MotionEvent newEvent = MotionEvent.obtain(ev);
6051c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        if ((newEvent.getSource() & InputDevice.SOURCE_CLASS_TRACKBALL) == 0) {
6052c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            newEvent.setSource(InputDevice.SOURCE_TRACKBALL);
6053c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        }
6054c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
6055bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final int result = mInputManager.injectInputEvent(newEvent, pid, uid,
6056bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                sync ? InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISH
6057bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                        : InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT,
6058bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                INJECTION_TIMEOUT_MILLIS);
6059bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown
6060bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        Binder.restoreCallingIdentity(ident);
6061bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        return reportInjectionResult(result);
6062bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown    }
6063bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown
6064bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown    /**
6065bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * Inject an input event into the UI without waiting for dispatch to commence.
6066bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * This variant is useful for fire-and-forget input event injection.  It does not
6067bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * block any longer than it takes to enqueue the input event.
6068bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     *
6069bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * @param ev An input event.  (Be sure to set the input source correctly.)
6070bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * @return Returns true if event was dispatched, false if it was dropped for any reason
6071bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     */
6072bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown    public boolean injectInputEventNoWait(InputEvent ev) {
6073bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final int pid = Binder.getCallingPid();
6074bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final int uid = Binder.getCallingUid();
6075bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final long ident = Binder.clearCallingIdentity();
6076bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown
6077bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final int result = mInputManager.injectInputEvent(ev, pid, uid,
6078bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                InputManager.INPUT_EVENT_INJECTION_SYNC_NONE,
6079bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                INJECTION_TIMEOUT_MILLIS);
608046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
60812bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        Binder.restoreCallingIdentity(ident);
60827fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        return reportInjectionResult(result);
60837fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    }
60847fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
60857fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    private boolean reportInjectionResult(int result) {
608600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        switch (result) {
608700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            case InputManager.INPUT_EVENT_INJECTION_PERMISSION_DENIED:
608800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                Slog.w(TAG, "Input event injection permission denied.");
608900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                throw new SecurityException(
609000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                        "Injecting to another application requires INJECT_EVENTS permission");
609100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            case InputManager.INPUT_EVENT_INJECTION_SUCCEEDED:
609209e85dc0270ac9ce660c17ee8290ff2d136b395bChristopher Tate                //Slog.v(TAG, "Input event injection succeeded.");
609300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                return true;
609400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            case InputManager.INPUT_EVENT_INJECTION_TIMED_OUT:
609500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                Slog.w(TAG, "Input event injection timed out.");
609600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                return false;
609700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            case InputManager.INPUT_EVENT_INJECTION_FAILED:
609800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            default:
609900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                Slog.w(TAG, "Input event injection failed.");
610000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                return false;
6101cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn        }
61029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
610306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
61041a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown    /**
61051a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown     * Temporarily set the pointer speed.  Does not save the new setting.
61061a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown     * Used by the settings application.
61071a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown     */
61081a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown    public void setPointerSpeed(int speed) {
61091a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown        if (!checkCallingPermission(android.Manifest.permission.SET_POINTER_SPEED,
61101a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown                "setPointerSpeed()")) {
61111a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown            throw new SecurityException("Requires SET_POINTER_SPEED permission");
61121a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown        }
61131a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown
61141a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown        mInputManager.setPointerSpeed(speed);
61151a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown    }
61161a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown
61179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowState getFocusedWindow() {
61189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
61199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getFocusedWindowLocked();
61209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
61219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
61229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
61239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowState getFocusedWindowLocked() {
61249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCurrentFocus;
61259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
612606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
61279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean detectSafeMode() {
6128b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown        if (!mInputMonitor.waitForInputDevicesReady(
6129b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown                INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS)) {
6130b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown            Slog.w(TAG, "Devices still not ready after waiting "
6131b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown                    + INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS
6132b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown                    + " milliseconds before attempting to detect safe mode.");
6133b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown        }
6134b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown
61359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSafeMode = mPolicy.detectSafeMode();
61369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSafeMode;
61379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
613806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
61399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void systemReady() {
61405132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn        synchronized(mWindowMap) {
61415132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            if (mDisplay != null) {
61425132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn                throw new IllegalStateException("Display already initialized");
61435132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            }
61445132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
61455132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            mDisplay = wm.getDefaultDisplay();
6146bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            mInitialDisplayWidth = mDisplay.getRawWidth();
6147bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            mInitialDisplayHeight = mDisplay.getRawHeight();
61487916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            int rot = mDisplay.getRotation();
61497916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (rot == Surface.ROTATION_90 || rot == Surface.ROTATION_270) {
61507916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                // If the screen is currently rotated, we need to swap the
61517916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                // initial width and height to get the true natural values.
61527916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                int tmp = mInitialDisplayWidth;
61537916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                mInitialDisplayWidth = mInitialDisplayHeight;
61547916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                mInitialDisplayHeight = tmp;
61557916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
615681e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn            mBaseDisplayWidth = mCurDisplayWidth = mAppDisplayWidth = mInitialDisplayWidth;
615781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn            mBaseDisplayHeight = mCurDisplayHeight = mAppDisplayHeight = mInitialDisplayHeight;
6158bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            mInputManager.setDisplaySize(Display.DEFAULT_DISPLAY,
6159bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                    mDisplay.getRawWidth(), mDisplay.getRawHeight(),
6160bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                    mDisplay.getRawExternalWidth(), mDisplay.getRawExternalHeight());
61619d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn            mPolicy.setInitialDisplaySize(mInitialDisplayWidth, mInitialDisplayHeight);
61625132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn        }
61635132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn
61645132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn        try {
61655132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            mActivityManager.updateConfiguration(null);
61665132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn        } catch (RemoteException e) {
61675132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn        }
6168571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato
6169154db5f6358284d917d515f05d4474606b4896b2Dianne Hackborn        mPolicy.systemReady();
6170571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato
6171571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        synchronized (mWindowMap) {
6172571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato            readForcedDisplaySizeLocked();
6173571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        }
61745132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn    }
61755132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn
61766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // This is an animation that does nothing: it just immediately finishes
61776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // itself every time it is called.  It is used as a stub animation in cases
61786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // where we want to synchronize multiple things that may be animating.
61796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    static final class DummyAnimation extends Animation {
61806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public boolean getTransformation(long currentTime, Transformation outTransformation) {
61816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return false;
61826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
61836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
61846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    static final Animation sDummyAnimation = new DummyAnimation();
61856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
61869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
61876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Async Handler
61889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
61899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
61906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final class H extends Handler {
61916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int REPORT_FOCUS_CHANGE = 2;
61926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int REPORT_LOSING_FOCUS = 3;
61936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int ANIMATE = 4;
61946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int ADD_STARTING = 5;
61956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int REMOVE_STARTING = 6;
61966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int FINISHED_STARTING = 7;
61976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int REPORT_APPLICATION_TOKEN_WINDOWS = 8;
61986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int WINDOW_FREEZE_TIMEOUT = 11;
61996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int HOLD_SCREEN_CHANGED = 12;
62006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int APP_TRANSITION_TIMEOUT = 13;
62016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int PERSIST_ANIMATION_SCALE = 14;
62026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int FORCE_GC = 15;
62036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int ENABLE_SCREEN = 16;
62046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int APP_FREEZE_TIMEOUT = 17;
62056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int SEND_NEW_CONFIGURATION = 18;
62066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int REPORT_WINDOWS_CHANGE = 19;
62076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int DRAG_START_TIMEOUT = 20;
62086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int DRAG_END_TIMEOUT = 21;
62096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int REPORT_HARD_KEYBOARD_STATUS_CHANGE = 22;
621006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
62119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Session mLastReportedHold;
621206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
62139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public H() {
62149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
621506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
62169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
62179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void handleMessage(Message msg) {
62189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (msg.what) {
62199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case REPORT_FOCUS_CHANGE: {
62209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowState lastFocus;
62219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowState newFocus;
622206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
62239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized(mWindowMap) {
62249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        lastFocus = mLastFocus;
62259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newFocus = mCurrentFocus;
62269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (lastFocus == newFocus) {
62279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Focus is not changing, so nothing to do.
62289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return;
62299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
62309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLastFocus = newFocus;
62318a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        //Slog.i(TAG, "Focus moving from " + lastFocus
62329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        //        + " to " + newFocus);
62339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (newFocus != null && lastFocus != null
62349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                && !newFocus.isDisplayedLw()) {
62358a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            //Slog.i(TAG, "Delaying loss of focus...");
62369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLosingFocus.add(lastFocus);
62379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            lastFocus = null;
62389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
62399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
62409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (lastFocus != newFocus) {
62429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        //System.out.println("Changing focus from " + lastFocus
62439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        //                   + " to " + newFocus);
62449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (newFocus != null) {
62459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            try {
62468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                //Slog.i(TAG, "Gaining focus: " + newFocus);
62479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                newFocus.mClient.windowFocusChanged(true, mInTouchMode);
62489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } catch (RemoteException e) {
62499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // Ignore if process has died.
62509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
62515e7833a571967d1dbc8618ac96ad6a379bcdf66aKonstantin Lopyrev                            notifyFocusChanged();
62529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
62539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (lastFocus != null) {
62559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            try {
62568a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                //Slog.i(TAG, "Losing focus: " + lastFocus);
62579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                lastFocus.mClient.windowFocusChanged(false, mInTouchMode);
62589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } catch (RemoteException e) {
62599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // Ignore if process has died.
62609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
62619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
6262664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato
6263664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                        mPolicy.focusChanged(lastFocus, newFocus);
62649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
62659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
62669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case REPORT_LOSING_FOCUS: {
62689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ArrayList<WindowState> losers;
626906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
62709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized(mWindowMap) {
62719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        losers = mLosingFocus;
62729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLosingFocus = new ArrayList<WindowState>();
62739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
62749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int N = losers.size();
62769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i=0; i<N; i++) {
62779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        try {
62788a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            //Slog.i(TAG, "Losing delayed focus: " + losers.get(i));
62799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            losers.get(i).mClient.windowFocusChanged(false, mInTouchMode);
62809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } catch (RemoteException e) {
62819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                             // Ignore if process has died.
62829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
62839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
62849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
62859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case ANIMATE: {
62879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized(mWindowMap) {
62889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAnimationPending = false;
62899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        performLayoutAndPlaceSurfacesLocked();
62909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
62919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
62929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case ADD_STARTING: {
62949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final AppWindowToken wtoken = (AppWindowToken)msg.obj;
62959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final StartingData sd = wtoken.startingData;
62969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (sd == null) {
62989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Animation has been canceled... do nothing.
62999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return;
63009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
630106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
63028a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Add starting "
63039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + wtoken + ": pkg=" + sd.pkg);
630406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
63059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    View view = null;
63069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
63079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        view = mPolicy.addStartingWindow(
63082f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                            wtoken.token, sd.pkg, sd.theme, sd.compatInfo,
63092f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                            sd.nonLocalizedLabel, sd.labelRes, sd.icon, sd.windowFlags);
63109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (Exception e) {
63118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "Exception when adding starting window", e);
63129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
63139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (view != null) {
63159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        boolean abort = false;
63169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        synchronized(mWindowMap) {
63189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (wtoken.removed || wtoken.startingData == null) {
63199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // If the window was successfully added, then
63209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // we need to remove it.
63219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (wtoken.startingWindow != null) {
63228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                    if (DEBUG_STARTING_WINDOW) Slog.v(TAG,
63239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            "Aborted starting " + wtoken
63249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + ": removed=" + wtoken.removed
63259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " startingData=" + wtoken.startingData);
63269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    wtoken.startingWindow = null;
63279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    wtoken.startingData = null;
63289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    abort = true;
63299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
63309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } else {
63319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                wtoken.startingView = view;
63329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
63338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_STARTING_WINDOW && !abort) Slog.v(TAG,
63349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Added starting " + wtoken
63359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + ": startingWindow="
63369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + wtoken.startingWindow + " startingView="
63379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + wtoken.startingView);
63389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
63399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (abort) {
63419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            try {
63429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                mPolicy.removeStartingWindow(wtoken.token, view);
63439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } catch (Exception e) {
63448a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.w(TAG, "Exception when removing starting window", e);
63459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
63469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
63479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
63489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
63499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case REMOVE_STARTING: {
63519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final AppWindowToken wtoken = (AppWindowToken)msg.obj;
63529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    IBinder token = null;
63539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    View view = null;
63549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (mWindowMap) {
63558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Remove starting "
63569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + wtoken + ": startingWindow="
63579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + wtoken.startingWindow + " startingView="
63589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + wtoken.startingView);
63599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (wtoken.startingWindow != null) {
63609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            view = wtoken.startingView;
63619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            token = wtoken.token;
63629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.startingData = null;
63639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.startingView = null;
63649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.startingWindow = null;
63659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
63669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
63679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (view != null) {
63689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        try {
63699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mPolicy.removeStartingWindow(token, view);
63709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } catch (Exception e) {
63718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            Slog.w(TAG, "Exception when removing starting window", e);
63729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
63739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
63749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
63759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case FINISHED_STARTING: {
63779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    IBinder token = null;
63789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    View view = null;
63799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    while (true) {
63809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        synchronized (mWindowMap) {
63819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            final int N = mFinishedStarting.size();
63829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (N <= 0) {
63839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                break;
63849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
63859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AppWindowToken wtoken = mFinishedStarting.remove(N-1);
63869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_STARTING_WINDOW) Slog.v(TAG,
63889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Finished starting " + wtoken
63899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + ": startingWindow=" + wtoken.startingWindow
63909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + " startingView=" + wtoken.startingView);
63919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (wtoken.startingWindow == null) {
63939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                continue;
63949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
63959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            view = wtoken.startingView;
63979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            token = wtoken.token;
63989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.startingData = null;
63999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.startingView = null;
64009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.startingWindow = null;
64019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
64029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
64039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        try {
64049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mPolicy.removeStartingWindow(token, view);
64059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } catch (Exception e) {
64068a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            Slog.w(TAG, "Exception when removing starting window", e);
64079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
64089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
64099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
64109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
64119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case REPORT_APPLICATION_TOKEN_WINDOWS: {
64129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final AppWindowToken wtoken = (AppWindowToken)msg.obj;
64139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
64149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean nowVisible = msg.arg1 != 0;
64159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean nowGone = msg.arg2 != 0;
64169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
64179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
64188a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_VISIBILITY) Slog.v(
64199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                TAG, "Reporting visible in " + wtoken
64209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " visible=" + nowVisible
64219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " gone=" + nowGone);
64229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (nowVisible) {
64239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.appToken.windowsVisible();
64249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
64259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.appToken.windowsGone();
64269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
64279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (RemoteException ex) {
64289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
64299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
643006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
64319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WINDOW_FREEZE_TIMEOUT: {
64329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (mWindowMap) {
64338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "Window freeze timeout expired.");
64349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int i = mWindows.size();
64359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        while (i > 0) {
64369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            i--;
6437e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                            WindowState w = mWindows.get(i);
64389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (w.mOrientationChanging) {
64399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mOrientationChanging = false;
64408a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.w(TAG, "Force clearing orientation change: " + w);
64419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
64429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
64439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        performLayoutAndPlaceSurfacesLocked();
64449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
64459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
64469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
644706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
64489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case HOLD_SCREEN_CHANGED: {
64499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Session oldHold;
64509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Session newHold;
64519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (mWindowMap) {
64529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        oldHold = mLastReportedHold;
64539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newHold = (Session)msg.obj;
64549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLastReportedHold = newHold;
64559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
645606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
64579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (oldHold != newHold) {
64589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        try {
64599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (oldHold != null) {
64609adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                                mBatteryStats.noteStopWakelock(oldHold.mUid, -1,
64619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "window",
64629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        BatteryStats.WAKE_TYPE_WINDOW);
64639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
64649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (newHold != null) {
64659adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                                mBatteryStats.noteStartWakelock(newHold.mUid, -1,
64669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "window",
64679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        BatteryStats.WAKE_TYPE_WINDOW);
64689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
64699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } catch (RemoteException e) {
64709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
64719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
64729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
64739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
647406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
64759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case APP_TRANSITION_TIMEOUT: {
64769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (mWindowMap) {
6477bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                        if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
64788a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
64799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "*** APP TRANSITION TIMEOUT");
64809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mAppTransitionReady = true;
64819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mAppTransitionTimeout = true;
64829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            performLayoutAndPlaceSurfacesLocked();
64839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
64849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
64859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
64869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
648706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
64889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case PERSIST_ANIMATION_SCALE: {
64899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.System.putFloat(mContext.getContentResolver(),
64909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Settings.System.WINDOW_ANIMATION_SCALE, mWindowAnimationScale);
64919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.System.putFloat(mContext.getContentResolver(),
64929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Settings.System.TRANSITION_ANIMATION_SCALE, mTransitionAnimationScale);
64939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
64949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
649506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
64969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case FORCE_GC: {
64979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized(mWindowMap) {
64989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mAnimationPending) {
64999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // If we are animating, don't do the gc now but
65009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // delay a bit so we don't interrupt the animation.
65019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mH.sendMessageDelayed(mH.obtainMessage(H.FORCE_GC),
65029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    2000);
65039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return;
65049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
65059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // If we are currently rotating the display, it will
65069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // schedule a new message when done.
65079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mDisplayFrozen) {
65089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return;
65099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
65109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
65119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Runtime.getRuntime().gc();
65129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
65139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
651406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
65159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case ENABLE_SCREEN: {
65169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    performEnableScreen();
65179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
65189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
651906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
65209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case APP_FREEZE_TIMEOUT: {
65219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (mWindowMap) {
65228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "App freeze timeout expired.");
65239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int i = mAppTokens.size();
65249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        while (i > 0) {
65259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            i--;
65269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AppWindowToken tok = mAppTokens.get(i);
65279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (tok.freezingScreen) {
65288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.w(TAG, "Force clearing freeze: " + tok);
65299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                unsetAppFreezingScreenLocked(tok, true, true);
65309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
65319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
65329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
65339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
65349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
653506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6536e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                case SEND_NEW_CONFIGURATION: {
6537e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    removeMessages(SEND_NEW_CONFIGURATION);
6538e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    sendNewConfiguration();
6539c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                    break;
6540c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                }
654106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
65426e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev                case REPORT_WINDOWS_CHANGE: {
6543dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                    if (mWindowsChanged) {
6544dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                        synchronized (mWindowMap) {
6545dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                            mWindowsChanged = false;
6546dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                        }
6547dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                        notifyWindowsChanged();
6548dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                    }
6549dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                    break;
6550dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                }
6551dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev
6552a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                case DRAG_START_TIMEOUT: {
6553a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    IBinder win = (IBinder)msg.obj;
6554a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    if (DEBUG_DRAG) {
6555a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        Slog.w(TAG, "Timeout starting drag by win " + win);
6556a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
6557a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    synchronized (mWindowMap) {
6558a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        // !!! TODO: ANR the app that has failed to start the drag in time
6559a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (mDragState != null) {
6560d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                            mDragState.unregister();
65612e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                            mInputMonitor.updateInputWindowsLw(true /*force*/);
6562a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                            mDragState.reset();
6563a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                            mDragState = null;
6564a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        }
6565a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
6566d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    break;
6567a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                }
6568a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
6569d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                case DRAG_END_TIMEOUT: {
6570d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    IBinder win = (IBinder)msg.obj;
6571d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    if (DEBUG_DRAG) {
6572d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        Slog.w(TAG, "Timeout ending drag to win " + win);
6573d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    }
6574d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    synchronized (mWindowMap) {
6575d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        // !!! TODO: ANR the drag-receiving app
6576d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        mDragState.mDragResult = false;
6577d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        mDragState.endDragLw();
6578d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    }
6579d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    break;
6580d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                }
65812992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
65822992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                case REPORT_HARD_KEYBOARD_STATUS_CHANGE: {
65832992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                    notifyHardKeyboardStatusChange();
65842992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                    break;
65852992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                }
65869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
65879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
65889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
65899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
65909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
65919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // IWindowManager API
65929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
65939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
65949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public IWindowSession openSession(IInputMethodClient client,
65959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IInputContext inputContext) {
65969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (client == null) throw new IllegalArgumentException("null client");
65979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (inputContext == null) throw new IllegalArgumentException("null inputContext");
65986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        Session session = new Session(this, client, inputContext);
659946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        return session;
66009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
66019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
66029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean inputMethodClientHasFocus(IInputMethodClient client) {
66039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
66049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // The focus for the client is the window immediately below
66059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // where we would place the input method window.
66069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int idx = findDesiredInputMethodWindowIndexLocked(false);
66079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowState imFocus;
66089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (idx > 0) {
6609e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                imFocus = mWindows.get(idx-1);
6610e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                //Log.i(TAG, "Desired input method target: " + imFocus);
6611e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                //Log.i(TAG, "Current focus: " + this.mCurrentFocus);
6612e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                //Log.i(TAG, "Last focus: " + this.mLastFocus);
66139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (imFocus != null) {
6614e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // This may be a starting window, in which case we still want
6615e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // to count it as okay.
6616e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    if (imFocus.mAttrs.type == LayoutParams.TYPE_APPLICATION_STARTING
6617e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            && imFocus.mAppToken != null) {
6618e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        // The client has definitely started, so it really should
6619e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        // have a window in this app token.  Let's look for it.
6620e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        for (int i=0; i<imFocus.mAppToken.windows.size(); i++) {
6621e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            WindowState w = imFocus.mAppToken.windows.get(i);
6622e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            if (w != imFocus) {
6623e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                                //Log.i(TAG, "Switching to real app window: " + w);
6624e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                                imFocus = w;
6625e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                                break;
6626e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            }
6627e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        }
6628e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    }
6629e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    //Log.i(TAG, "IM target client: " + imFocus.mSession.mClient);
6630e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    //if (imFocus.mSession.mClient != null) {
6631e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    //    Log.i(TAG, "IM target client binder: " + imFocus.mSession.mClient.asBinder());
6632e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    //    Log.i(TAG, "Requesting client binder: " + client.asBinder());
6633e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    //}
66349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (imFocus.mSession.mClient != null &&
66359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            imFocus.mSession.mClient.asBinder() == client.asBinder()) {
66369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return true;
66379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6638e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn
6639e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // Okay, how about this...  what is the current focus?
6640e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // It seems in some cases we may not have moved the IM
6641e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // target window, such as when it was in a pop-up window,
6642e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // so let's also look at the current focus.  (An example:
6643e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // go to Gmail, start searching so the keyboard goes up,
6644e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // press home.  Sometimes the IME won't go down.)
6645e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // Would be nice to fix this more correctly, but it's
6646e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // way at the end of a release, and this should be good enough.
6647e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    if (mCurrentFocus != null && mCurrentFocus.mSession.mClient != null &&
6648e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            mCurrentFocus.mSession.mClient.asBinder() == client.asBinder()) {
6649e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        return true;
6650e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    }
66519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
66529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
66539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
66549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
66559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
665606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
665744bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn    public void getDisplaySize(Point size) {
665844bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        synchronized(mWindowMap) {
665981e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn            size.x = mAppDisplayWidth;
666081e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn            size.y = mAppDisplayHeight;
666144bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        }
666244bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn    }
666344bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn
6664bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    public void getRealDisplaySize(Point size) {
6665bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        synchronized(mWindowMap) {
6666bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            size.x = mCurDisplayWidth;
6667bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            size.y = mCurDisplayHeight;
6668bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        }
66697d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    }
66707d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
66717d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    public void getInitialDisplaySize(Point size) {
66727d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        synchronized(mWindowMap) {
66737d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            size.x = mInitialDisplayWidth;
66747d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            size.y = mInitialDisplayHeight;
66757d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        }
6676bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    }
6677bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown
667844bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn    public int getMaximumSizeDimension() {
667944bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        synchronized(mWindowMap) {
668044bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn            // Do this based on the raw screen size, until we are smarter.
66817916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            return mBaseDisplayWidth > mBaseDisplayHeight
66827916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    ? mBaseDisplayWidth : mBaseDisplayHeight;
66837916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
66847916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    }
66857916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
66867916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    public void setForcedDisplaySize(int longDimen, int shortDimen) {
66877916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        synchronized(mWindowMap) {
66887916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            int width, height;
66897916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (mInitialDisplayWidth < mInitialDisplayHeight) {
66907916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                width = shortDimen < mInitialDisplayWidth
66917916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        ? shortDimen : mInitialDisplayWidth;
66927916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                height = longDimen < mInitialDisplayHeight
66937916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        ? longDimen : mInitialDisplayHeight;
66947916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            } else {
66957916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                width = longDimen < mInitialDisplayWidth
66967916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        ? longDimen : mInitialDisplayWidth;
66977916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                height = shortDimen < mInitialDisplayHeight
66987916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        ? shortDimen : mInitialDisplayHeight;
66997916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
67007916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            setForcedDisplaySizeLocked(width, height);
6701571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato            Settings.Secure.putString(mContext.getContentResolver(),
6702571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato                    Settings.Secure.DISPLAY_SIZE_FORCED, width + "," + height);
67037916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
67047916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    }
67057916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
67067916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    private void rebuildBlackFrame(boolean inTransaction) {
67077916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        if (!inTransaction) {
67087916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (SHOW_TRANSACTIONS) Slog.i(TAG,
67097916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    ">>> OPEN TRANSACTION rebuildBlackFrame");
67107916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            Surface.openTransaction();
67117916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
67127916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        try {
67137916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (mBlackFrame != null) {
67147916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                mBlackFrame.kill();
67157916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                mBlackFrame = null;
67167916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
67177916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (mBaseDisplayWidth < mInitialDisplayWidth
67187916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    || mBaseDisplayHeight < mInitialDisplayHeight) {
67198f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                int initW, initH, baseW, baseH;
67208f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                final boolean rotated = (mRotation == Surface.ROTATION_90
67218f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                        || mRotation == Surface.ROTATION_270);
67228f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                if (rotated) {
67238f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                    initW = mInitialDisplayHeight;
67248f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                    initH = mInitialDisplayWidth;
67258f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                    baseW = mBaseDisplayHeight;
67268f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                    baseH = mBaseDisplayWidth;
67278f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                } else {
67288f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                    initW = mInitialDisplayWidth;
67298f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                    initH = mInitialDisplayHeight;
67308f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                    baseW = mBaseDisplayWidth;
67318f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                    baseH = mBaseDisplayHeight;
67328f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                }
67338f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                Rect outer = new Rect(0, 0, initW, initH);
67348f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                Rect inner = new Rect(0, 0, baseW, baseH);
67357916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                try {
67367916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    mBlackFrame = new BlackFrame(mFxSession, outer, inner, MASK_LAYER);
67377916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                } catch (Surface.OutOfResourcesException e) {
67387916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                }
67397916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
67407916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        } finally {
67417916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (!inTransaction) {
67427916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                Surface.closeTransaction();
67437916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                if (SHOW_TRANSACTIONS) Slog.i(TAG,
67447916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        "<<< CLOSE TRANSACTION rebuildBlackFrame");
67457916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
67467916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
67477916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    }
67487916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
6749571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato    private void readForcedDisplaySizeLocked() {
6750571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        final String str = Settings.Secure.getString(mContext.getContentResolver(),
6751571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato                Settings.Secure.DISPLAY_SIZE_FORCED);
6752571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        if (str == null || str.length() == 0) {
6753571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato            return;
6754571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        }
6755571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        final int pos = str.indexOf(',');
6756571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        if (pos <= 0 || str.lastIndexOf(',') != pos) {
6757571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato            return;
6758571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        }
6759571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        int width, height;
6760571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        try {
6761571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato            width = Integer.parseInt(str.substring(0, pos));
6762571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato            height = Integer.parseInt(str.substring(pos+1));
6763571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        } catch (NumberFormatException ex) {
6764571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato            return;
6765571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        }
6766571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        setForcedDisplaySizeLocked(width, height);
6767571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato    }
6768571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato
67697916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    private void setForcedDisplaySizeLocked(int width, int height) {
6770571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        Slog.i(TAG, "Using new display size: " + width + "x" + height);
6771571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato
67727916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        mBaseDisplayWidth = width;
67737916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        mBaseDisplayHeight = height;
67747916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        mPolicy.setInitialDisplaySize(mBaseDisplayWidth, mBaseDisplayHeight);
67757916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
67767916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        mLayoutNeeded = true;
67777916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
67787916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        boolean configChanged = updateOrientationFromAppTokensLocked(false);
67797916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        mTempConfiguration.setToDefaults();
67807916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        mTempConfiguration.fontScale = mCurConfiguration.fontScale;
67817916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        if (computeNewConfigurationLocked(mTempConfiguration)) {
67827916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (mCurConfiguration.diff(mTempConfiguration) != 0) {
67837916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                configChanged = true;
67847916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
67857916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
67867916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
67877916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        if (configChanged) {
67887916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            mWaitingForConfig = true;
67897916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            startFreezingDisplayLocked(false);
67907916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
67917916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
67927916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
67937916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        rebuildBlackFrame(false);
67947916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
67957916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        performLayoutAndPlaceSurfacesLocked();
67967916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    }
67977916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
67987916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    public void clearForcedDisplaySize() {
67997916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        synchronized(mWindowMap) {
68007916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            setForcedDisplaySizeLocked(mInitialDisplayWidth, mInitialDisplayHeight);
6801571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato            Settings.Secure.putString(mContext.getContentResolver(),
6802571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato                    Settings.Secure.DISPLAY_SIZE_FORCED, "");
680344bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        }
680444bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn    }
680544bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn
680681e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn    public boolean canStatusBarHide() {
680781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        return mPolicy.canStatusBarHide();
680881e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn    }
680981e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn
68109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
68119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Internals
68129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
68139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6814e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    final WindowState windowForClientLocked(Session session, IWindow client,
6815e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            boolean throwOnError) {
6816e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        return windowForClientLocked(session, client.asBinder(), throwOnError);
68179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
681806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6819e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    final WindowState windowForClientLocked(Session session, IBinder client,
6820e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            boolean throwOnError) {
68219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState win = mWindowMap.get(client);
68228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (localLOGV) Slog.v(
68239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Looking up client " + client + ": " + win);
68249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (win == null) {
6825e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            RuntimeException ex = new IllegalArgumentException(
6826e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    "Requested window " + client + " does not exist");
6827e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            if (throwOnError) {
6828e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                throw ex;
6829e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
68308a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Failed looking up window", ex);
68319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
68329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
68339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (session != null && win.mSession != session) {
6834e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            RuntimeException ex = new IllegalArgumentException(
6835e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    "Requested window " + client + " is in session " +
6836e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    win.mSession + ", not " + session);
6837e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            if (throwOnError) {
6838e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                throw ex;
6839e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
68408a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Failed looking up window", ex);
68419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
68429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
68439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return win;
68459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
68469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6847a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    final void rebuildAppWindowListLocked() {
6848a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        int NW = mWindows.size();
6849a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        int i;
68503b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        int lastWallpaper = -1;
68519bfb707597898f54722460b48588007b682f3e2aDianne Hackborn        int numRemoved = 0;
6852ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
6853f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        if (mRebuildTmp.length < NW) {
6854f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            mRebuildTmp = new WindowState[NW+10];
6855f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        }
6856f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn
6857a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        // First remove all existing app windows.
6858a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        i=0;
6859a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        while (i < NW) {
6860e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState w = mWindows.get(i);
68613b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if (w.mAppToken != null) {
6862e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState win = mWindows.remove(i);
6863f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                win.mRebuilding = true;
6864f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                mRebuildTmp[numRemoved] = win;
6865dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                mWindowsChanged = true;
68668a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG,
6867bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                        "Rebuild removing window: " + win);
6868a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                NW--;
68699bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                numRemoved++;
6870a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                continue;
68713b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            } else if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_WALLPAPER
68723b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    && lastWallpaper == i-1) {
68733b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                lastWallpaper = i;
6874a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
6875a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            i++;
6876a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        }
6877ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
68783b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        // The wallpaper window(s) typically live at the bottom of the stack,
68793b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        // so skip them before adding app tokens.
68803b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        lastWallpaper++;
68813b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        i = lastWallpaper;
6882ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
6883bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        // First add all of the exiting app tokens...  these are no longer
6884bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        // in the main app list, but still have windows shown.  We put them
6885bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        // in the back because now that the animation is over we no longer
6886bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        // will care about them.
6887bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        int NT = mExitingAppTokens.size();
6888a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        for (int j=0; j<NT; j++) {
6889bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn            i = reAddAppWindowsLocked(i, mExitingAppTokens.get(j));
6890bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        }
6891ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
6892bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        // And add in the still active app tokens in Z order.
6893bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        NT = mAppTokens.size();
6894bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        for (int j=0; j<NT; j++) {
6895bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn            i = reAddAppWindowsLocked(i, mAppTokens.get(j));
6896a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        }
6897ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
68983b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        i -= lastWallpaper;
68999bfb707597898f54722460b48588007b682f3e2aDianne Hackborn        if (i != numRemoved) {
69008a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Rebuild removed " + numRemoved
69019bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    + " windows but added " + i);
6902f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            for (i=0; i<numRemoved; i++) {
6903f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                WindowState ws = mRebuildTmp[i];
6904f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (ws.mRebuilding) {
6905f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    StringWriter sw = new StringWriter();
6906f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    PrintWriter pw = new PrintWriter(sw);
6907a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    ws.dump(pw, "", true);
6908f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    pw.flush();
6909f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    Slog.w(TAG, "This window was lost: " + ws);
6910f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    Slog.w(TAG, sw.toString());
6911f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                }
6912f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            }
6913f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            Slog.w(TAG, "Current app token list:");
6914f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            dumpAppTokensLocked();
6915f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            Slog.w(TAG, "Final window list:");
6916f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            dumpWindowsLocked();
69179bfb707597898f54722460b48588007b682f3e2aDianne Hackborn        }
6918a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    }
6919ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
69209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void assignLayersLocked() {
69219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int N = mWindows.size();
69229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int curBaseLayer = 0;
69239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int curLayer = 0;
69249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i;
692506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
69266c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn        if (DEBUG_LAYERS) {
69276c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            RuntimeException here = new RuntimeException("here");
69286c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            here.fillInStackTrace();
69296c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            Log.v(TAG, "Assigning layers", here);
69306c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn        }
69316c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn
69329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=0; i<N; i++) {
6933e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState w = mWindows.get(i);
69347341d7a104b47996445d069a695e155a07184606Dianne Hackborn            if (w.mBaseLayer == curBaseLayer || w.mIsImWindow
69357341d7a104b47996445d069a695e155a07184606Dianne Hackborn                    || (i > 0 && w.mIsWallpaper)) {
69369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                curLayer += WINDOW_LAYER_MULTIPLIER;
69379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mLayer = curLayer;
69389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
69399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                curBaseLayer = curLayer = w.mBaseLayer;
69409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mLayer = curLayer;
69419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
69429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (w.mTargetAppToken != null) {
69439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mAnimLayer = w.mLayer + w.mTargetAppToken.animLayerAdjustment;
69449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (w.mAppToken != null) {
69459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mAnimLayer = w.mLayer + w.mAppToken.animLayerAdjustment;
69469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
69479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mAnimLayer = w.mLayer;
69489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
69499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (w.mIsImWindow) {
69509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mAnimLayer += mInputMethodAnimLayerAdjustment;
6951759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            } else if (w.mIsWallpaper) {
6952759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                w.mAnimLayer += mWallpaperAnimLayerAdjustment;
69539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
69548a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_LAYERS) Slog.v(TAG, "Assign layer " + w + ": "
69559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + w.mAnimLayer);
69569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //System.out.println(
69579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //    "Assigned layer " + curLayer + " to " + w.mClient.asBinder());
69589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
69599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
69609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mInLayout = false;
69629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void performLayoutAndPlaceSurfacesLocked() {
69639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mInLayout) {
6964cfe6524071624b6679e5fa4db847328e8d0317c8Dave Bort            if (DEBUG) {
69659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Recursive call!");
69669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
69678a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "performLayoutAndPlaceSurfacesLocked called while in layout");
69689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
69699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
69709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6971e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        if (mWaitingForConfig) {
6972e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // Our configuration has changed (most likely rotation), but we
6973e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // don't yet have the complete configuration to report to
6974e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // applications.  Don't do any window layout until we have it.
6975e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            return;
6976e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        }
6977e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
6978ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        if (mDisplay == null) {
6979ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            // Not yet initialized, nothing to do.
6980ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            return;
6981ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
6982ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
69832e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn        mInLayout = true;
69849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean recoveringMemory = false;
69852e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn
69862e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn        try {
69872e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn            if (mForceRemoves != null) {
69882e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                recoveringMemory = true;
6989f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                // Wait a little bit for things to settle down, and off we go.
69902e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                for (int i=0; i<mForceRemoves.size(); i++) {
69912e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                    WindowState ws = mForceRemoves.get(i);
69922e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                    Slog.i(TAG, "Force removing: " + ws);
69932e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                    removeWindowInnerLocked(ws.mSession, ws);
69942e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                }
69952e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                mForceRemoves = null;
69962e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                Slog.w(TAG, "Due to memory failure, waiting a bit for next layout");
69972e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                Object tmp = new Object();
69982e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                synchronized (tmp) {
69992e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                    try {
70002e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                        tmp.wait(250);
70012e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                    } catch (InterruptedException e) {
70022e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                    }
70039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
70049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
70052e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn        } catch (RuntimeException e) {
70062e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn            Slog.e(TAG, "Unhandled exception while force removing for memory", e);
70079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
70082e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn
70099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
70109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            performLayoutAndPlaceSurfacesLockedInner(recoveringMemory);
701106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7012f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            int N = mPendingRemove.size();
7013f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            if (N > 0) {
7014f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (mPendingRemoveTmp.length < N) {
7015f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    mPendingRemoveTmp = new WindowState[N+10];
70169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7017f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                mPendingRemove.toArray(mPendingRemoveTmp);
70189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPendingRemove.clear();
7019f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                for (int i=0; i<N; i++) {
7020f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    WindowState w = mPendingRemoveTmp[i];
7021f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    removeWindowInnerLocked(w.mSession, w);
7022f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                }
70239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInLayout = false;
70259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                assignLayersLocked();
70269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutNeeded = true;
70279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                performLayoutAndPlaceSurfacesLocked();
70289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
70309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInLayout = false;
70319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mLayoutNeeded) {
70329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    requestAnimationLocked(0);
70339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
70349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7035dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            if (mWindowsChanged && !mWindowChangeListeners.isEmpty()) {
70366e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev                mH.removeMessages(H.REPORT_WINDOWS_CHANGE);
70376e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev                mH.sendMessage(mH.obtainMessage(H.REPORT_WINDOWS_CHANGE));
7038dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            }
70399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
70409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInLayout = false;
70418a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.e(TAG, "Unhandled exception while layout out windows", e);
70429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
70439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
70449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70453a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown    private final int performLayoutLockedInner(boolean initial, boolean updateInputWindows) {
7046b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        if (!mLayoutNeeded) {
7047b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            return 0;
7048b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        }
7049b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
7050b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        mLayoutNeeded = false;
7051b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
705244bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        final int dw = mCurDisplayWidth;
705344bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        final int dh = mCurDisplayHeight;
70549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = mWindows.size();
70569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i;
70579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70588a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_LAYOUT) Slog.v(TAG, "performLayout: needed="
70599b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn                + mLayoutNeeded + " dw=" + dw + " dh=" + dh);
70609b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn
7061b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        mPolicy.beginLayoutLw(dw, dh);
706206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7063b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        int seq = mLayoutSeq+1;
7064b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        if (seq < 0) seq = 0;
7065b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        mLayoutSeq = seq;
7066b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
7067b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        // First perform layout of any root windows (not attached
7068b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        // to another window).
7069b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        int topAttached = -1;
7070b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        for (i = N-1; i >= 0; i--) {
7071e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState win = mWindows.get(i);
7072b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
7073b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // Don't do layout of a window if it is not visible, or
7074b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // soon won't be visible, to avoid wasting time and funky
7075b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // changes while a window is animating away.
7076b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            final AppWindowToken atoken = win.mAppToken;
7077b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            final boolean gone = win.mViewVisibility == View.GONE
7078b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    || !win.mRelayoutCalled
7079ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn                    || (atoken == null && win.mRootToken.hidden)
7080b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    || (atoken != null && atoken.hiddenRequested)
7081b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    || win.mAttachedHidden
7082b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    || win.mExiting || win.mDestroying;
7083b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
70841c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn            if (DEBUG_LAYOUT && !win.mLayoutAttached) {
70851c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                Slog.v(TAG, "First pass " + win
7086b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + ": gone=" + gone + " mHaveFrame=" + win.mHaveFrame
7087b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + " mLayoutAttached=" + win.mLayoutAttached);
70881c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                if (gone) Slog.v(TAG, "  (mViewVisibility="
7089b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + win.mViewVisibility + " mRelayoutCalled="
7090b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + win.mRelayoutCalled + " hidden="
7091b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + win.mRootToken.hidden + " hiddenRequested="
7092b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + (atoken != null && atoken.hiddenRequested)
7093b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + " mAttachedHidden=" + win.mAttachedHidden);
7094b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            }
7095e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
7096b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // If this view is GONE, then skip it -- keep the current
7097b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // frame, and let the caller know so they can ignore it
7098b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // if they want.  (We do the normal layout for INVISIBLE
7099b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // windows, since that means "perform layout as normal,
7100b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // just don't display").
7101b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            if (!gone || !win.mHaveFrame) {
7102e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                if (!win.mLayoutAttached) {
71038e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                    if (initial) {
71040f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                        //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial");
71058e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        win.mContentChanged = false;
71068e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                    }
7107e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                    win.prelayout();
7108b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    mPolicy.layoutWindowLw(win, win.mAttrs, null);
7109b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    win.mLayoutSeq = seq;
7110b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (DEBUG_LAYOUT) Slog.v(TAG, "-> mFrame="
7111b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + win.mFrame + " mContainingFrame="
7112b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + win.mContainingFrame + " mDisplayFrame="
7113b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + win.mDisplayFrame);
7114b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                } else {
7115b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (topAttached < 0) topAttached = i;
71169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
71179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7118b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        }
711906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7120b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        // Now perform layout of attached windows, which usually
7121b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        // depend on the position of the window they are attached to.
7122b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        // XXX does not deal with windows that are attached to windows
7123b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        // that are themselves attached.
7124b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        for (i = topAttached; i >= 0; i--) {
7125e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState win = mWindows.get(i);
71269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7127b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            if (win.mLayoutAttached) {
7128b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (DEBUG_LAYOUT) Slog.v(TAG, "Second pass " + win
7129b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + " mHaveFrame=" + win.mHaveFrame
7130b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + " mViewVisibility=" + win.mViewVisibility
7131b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + " mRelayoutCalled=" + win.mRelayoutCalled);
71321c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                // If this view is GONE, then skip it -- keep the current
71331c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                // frame, and let the caller know so they can ignore it
71341c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                // if they want.  (We do the normal layout for INVISIBLE
71351c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                // windows, since that means "perform layout as normal,
71361c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                // just don't display").
7137b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if ((win.mViewVisibility != View.GONE && win.mRelayoutCalled)
7138b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        || !win.mHaveFrame) {
71398e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                    if (initial) {
71400f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                        //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial");
71418e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        win.mContentChanged = false;
71428e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                    }
7143e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                    win.prelayout();
7144b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    mPolicy.layoutWindowLw(win, win.mAttrs, win.mAttachedWindow);
7145b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    win.mLayoutSeq = seq;
7146b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (DEBUG_LAYOUT) Slog.v(TAG, "-> mFrame="
7147b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + win.mFrame + " mContainingFrame="
7148b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + win.mContainingFrame + " mDisplayFrame="
7149b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + win.mDisplayFrame);
71509bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                }
7151958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            }
71529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7153349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
7154349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // Window frames may have changed.  Tell the input dispatcher about it.
71553a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        mInputMonitor.setUpdateInputWindowsNeededLw();
71563a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        if (updateInputWindows) {
71572e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown            mInputMonitor.updateInputWindowsLw(false /*force*/);
71583a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        }
7159b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
7160b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        return mPolicy.finishLayoutLw();
71619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
716206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
71636804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    // "Something has changed!  Let's make it correct now."
71649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void performLayoutAndPlaceSurfacesLockedInner(
71659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean recoveringMemory) {
716634bcebca707187393263183aa4dab32728763f2fJoe Onorato        if (mDisplay == null) {
716734bcebca707187393263183aa4dab32728763f2fJoe Onorato            Slog.i(TAG, "skipping performLayoutAndPlaceSurfacesLockedInner with no mDisplay");
716834bcebca707187393263183aa4dab32728763f2fJoe Onorato            return;
716934bcebca707187393263183aa4dab32728763f2fJoe Onorato        }
717034bcebca707187393263183aa4dab32728763f2fJoe Onorato
71719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long currentTime = SystemClock.uptimeMillis();
7172dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        final int dw = mCurDisplayWidth;
7173dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        final int dh = mCurDisplayHeight;
717481e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        final int innerDw = mAppDisplayWidth;
717581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        final int innerDh = mAppDisplayHeight;
7176e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn
71779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i;
71789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7179b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn        if (mFocusMayChange) {
7180b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn            mFocusMayChange = false;
71813a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown            updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
71823a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    false /*updateInputWindows*/);
7183b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn        }
7184b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn
71859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Initialize state of exiting tokens.
71869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=mExitingTokens.size()-1; i>=0; i--) {
71879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mExitingTokens.get(i).hasVisible = false;
71889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
71899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
71909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Initialize state of exiting applications.
71919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=mExitingAppTokens.size()-1; i>=0; i--) {
71929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mExitingAppTokens.get(i).hasVisible = false;
71939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
71949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
71959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean orientationChangeComplete = true;
71969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Session holdScreen = null;
71979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float screenBrightness = -1;
7198fb73f79340375013225618a5d87f46b958f698efMike Lockwood        float buttonBrightness = -1;
71999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean focusDisplayed = false;
72009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean animating = false;
7201fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        boolean createWatermark = false;
720289ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        boolean updateRotation = false;
720350660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn        boolean screenRotationFinished = false;
7204fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
7205fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        if (mFxSession == null) {
7206fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn            mFxSession = new SurfaceSession();
7207fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn            createWatermark = true;
7208fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
7209fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
721094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn        if (SHOW_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION performLayoutAndPlaceSurfaces");
72119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
72129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Surface.openTransaction();
7213fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
7214fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        if (createWatermark) {
7215fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn            createWatermark();
7216fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
7217fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        if (mWatermark != null) {
7218fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn            mWatermark.positionSurface(dw, dh);
7219fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
72206804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        if (mStrictModeFlash != null) {
72216804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            mStrictModeFlash.positionSurface(dw, dh);
72226804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        }
7223fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
72249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
7225de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn            boolean wallpaperForceHidingChanged = false;
7226b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            int repeats = 0;
7227b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            int changes = 0;
7228b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
72299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            do {
7230b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                repeats++;
7231b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (repeats > 6) {
7232b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    Slog.w(TAG, "Animation repeat aborted after too many iterations");
7233b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    mLayoutNeeded = false;
7234b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    break;
7235b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                }
7236b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
7237b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if ((changes&(WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER
7238b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        | WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG
7239b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        | WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT)) != 0) {
7240b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
7241b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        if ((adjustWallpaperWindowsLocked()&ADJUST_WALLPAPER_LAYERS_CHANGED) != 0) {
7242b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            assignLayersLocked();
7243b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            mLayoutNeeded = true;
7244b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        }
7245b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
7246b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG) != 0) {
7247b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        if (DEBUG_LAYOUT) Slog.v(TAG, "Computing new config from layout");
724894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        if (updateOrientationFromAppTokensLocked(true)) {
7249b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            mLayoutNeeded = true;
7250b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
7251b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        }
7252b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
7253b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT) != 0) {
7254b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        mLayoutNeeded = true;
7255b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
7256b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                }
7257b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
7258b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                // FIRST LOOP: Perform a layout, if needed.
7259b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (repeats < 4) {
72603a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    changes = performLayoutLockedInner(repeats == 0, false /*updateInputWindows*/);
7261b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (changes != 0) {
7262b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        continue;
7263b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
7264b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                } else {
7265b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    Slog.w(TAG, "Layout repeat skipped after too many iterations");
7266b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    changes = 0;
7267b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                }
7268b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
72699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int transactionSequence = ++mTransactionSequence;
72709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
72719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Update animations of all applications, including those
72729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // associated with exiting/removed apps
72739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean tokensAnimating = false;
72749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int NAT = mAppTokens.size();
72759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (i=0; i<NAT; i++) {
7276e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                    if (mAppTokens.get(i).stepAnimationLocked(currentTime,
7277e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                            innerDw, innerDh)) {
72789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        tokensAnimating = true;
72799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
72809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
72819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int NEAT = mExitingAppTokens.size();
72829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (i=0; i<NEAT; i++) {
7283e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                    if (mExitingAppTokens.get(i).stepAnimationLocked(currentTime,
7284e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                            innerDw, innerDh)) {
72859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        tokensAnimating = true;
72869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
72879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
72889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7289b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                // SECOND LOOP: Execute animations and update visibility of windows.
7290b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
72918a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "*** ANIM STEP: seq="
7292de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        + transactionSequence + " tokensAnimating="
7293de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        + tokensAnimating);
7294de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn
72959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                animating = tokensAnimating;
72969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7297f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                if (mScreenRotationAnimation != null) {
7298f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                    if (mScreenRotationAnimation.isAnimating()) {
7299f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                        if (mScreenRotationAnimation.stepAnimation(currentTime)) {
7300f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                            animating = true;
7301f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                        } else {
730250660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn                            screenRotationFinished = true;
730389ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                            updateRotation = true;
7304f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                        }
7305f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                    }
7306f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                }
7307f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn
73089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean tokenMayBeDrawn = false;
73096c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                boolean wallpaperMayChange = false;
7310b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                boolean forceHiding = false;
73116c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                WindowState windowDetachedWallpaper = null;
7312de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                WindowState windowAnimationBackground = null;
7313de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                int windowAnimationBackgroundColor = 0;
73149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPolicy.beginAnimationLw(dw, dh);
73169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7317bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                final int N = mWindows.size();
7318ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
73199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (i=N-1; i>=0; i--) {
7320e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    WindowState w = mWindows.get(i);
73219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final WindowManager.LayoutParams attrs = w.mAttrs;
73239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (w.mSurface != null) {
73258e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        // Take care of the window being ready to display.
73266c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                        if (w.commitFinishDrawingLocked(currentTime)) {
73276c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                            if ((w.mAttrs.flags
73286c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                                    & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) {
73298a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_WALLPAPER) Slog.v(TAG,
73300586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                        "First draw done in potential wallpaper target " + w);
73316c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                                wallpaperMayChange = true;
73326c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                            }
73336c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                        }
7334ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
73356c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        final boolean wasAnimating = w.mAnimating;
73368e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn
7337e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                        int animDw = innerDw;
7338e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                        int animDh = innerDh;
73398e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn
73408e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        // If the window has moved due to its containing
73418e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        // content frame changing, then we'd like to animate
73428e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        // it.  The checks here are ordered by what is least
73433fe7f2f2e35692fe563ae00f62995030f1987c4fJoe Onorato                        // likely to be true first.
73441c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                        if (w.shouldAnimateMove()) {
73458e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            // Frame has moved, containing content frame
73468e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            // has also moved, and we're not currently animating...
73478e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            // let's do something.
73488e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            Animation a = AnimationUtils.loadAnimation(mContext,
73498e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                                    com.android.internal.R.anim.window_move_from_decor);
73508e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            w.setAnimation(a);
73518e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            animDw = w.mLastFrame.left - w.mFrame.left;
73528e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            animDh = w.mLastFrame.top - w.mFrame.top;
73538e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        }
73548e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn
73558e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        // Execute animation.
73568e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        final boolean nowAnimating = w.stepAnimationLocked(currentTime,
73578e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                                animDw, animDh);
73586c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn
73596c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        // If this window is animating, make a note that we have
73606c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        // an animating window and take care of a request to run
73616c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        // a detached wallpaper animation.
73626c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        if (nowAnimating) {
7363de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                            if (w.mAnimation != null) {
7364de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                if (w.mAnimation.getDetachWallpaper()) {
7365de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                    windowDetachedWallpaper = w;
7366de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                }
7367de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                if (w.mAnimation.getBackgroundColor() != 0) {
7368de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                    windowAnimationBackground = w;
7369de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                    windowAnimationBackgroundColor =
7370de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                            w.mAnimation.getBackgroundColor();
7371de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                }
73726c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                            }
73739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            animating = true;
73749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
73756c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn
73766c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        // If this window's app token is running a detached wallpaper
73776c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        // animation, make a note so we can ensure the wallpaper is
73786c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        // displayed behind it.
7379de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                        if (w.mAppToken != null && w.mAppToken.animation != null) {
7380de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                            if (w.mAppToken.animation.getDetachWallpaper()) {
7381de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                windowDetachedWallpaper = w;
7382de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                            }
7383de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                            if (w.mAppToken.animation.getBackgroundColor() != 0) {
7384de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                windowAnimationBackground = w;
7385de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                windowAnimationBackgroundColor =
7386de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                        w.mAppToken.animation.getBackgroundColor();
7387de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                            }
73886c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        }
73896c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn
73906136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                        if (wasAnimating && !w.mAnimating && mWallpaperTarget == w) {
73916136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                            wallpaperMayChange = true;
73926136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                        }
7393ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
73943b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        if (mPolicy.doesForceHide(w, attrs)) {
73956c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                            if (!wasAnimating && nowAnimating) {
739620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                if (DEBUG_VISIBILITY) Slog.v(TAG,
73976c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                                        "Animation started that could impact force hide: "
739820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        + w);
73993b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                wallpaperForceHidingChanged = true;
7400b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                                mFocusMayChange = true;
74013b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            } else if (w.isReadyForDisplay() && w.mAnimation == null) {
74023b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                forceHiding = true;
74033b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            }
74043b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        } else if (mPolicy.canBeForceHidden(w, attrs)) {
74053b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            boolean changed;
74063b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            if (forceHiding) {
74073b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                changed = w.hideLw(false, false);
740820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                if (DEBUG_VISIBILITY && changed) Slog.v(TAG,
740920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        "Now policy hidden: " + w);
74103b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            } else {
74113b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                changed = w.showLw(false, false);
741220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                if (DEBUG_VISIBILITY && changed) Slog.v(TAG,
741320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        "Now policy shown: " + w);
741420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                if (changed) {
741520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                    if (wallpaperForceHidingChanged
7416b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                            && w.isVisibleNow() /*w.isReadyForDisplay()*/) {
741720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // Assume we will need to animate.  If
741820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // we don't (because the wallpaper will
741920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // stay with the lock screen), then we will
742020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // clean up later.
742120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        Animation a = mPolicy.createForceHideEnterAnimation();
742220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        if (a != null) {
742320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                            w.setAnimation(a);
742420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        }
742520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                    }
742620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                    if (mCurrentFocus == null ||
742720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                            mCurrentFocus.mLayer < w.mLayer) {
742820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // We are showing on to of the current
742920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // focus, so re-evaluate focus to make
743020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // sure it is correct.
743120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        mFocusMayChange = true;
74323b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                    }
74333b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                }
74343b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            }
74353b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            if (changed && (attrs.flags
74363b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                    & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) {
74373b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                wallpaperMayChange = true;
74383b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            }
74393b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        }
7440ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
74419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mPolicy.animatingWindowLw(w, attrs);
74429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
74439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
74449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final AppWindowToken atoken = w.mAppToken;
74459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (atoken != null && (!atoken.allDrawn || atoken.freezingScreen)) {
74469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (atoken.lastTransactionSequence != transactionSequence) {
74479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            atoken.lastTransactionSequence = transactionSequence;
74489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            atoken.numInterestingWindows = atoken.numDrawnWindows = 0;
74499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            atoken.startingDisplayed = false;
74509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
74519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if ((w.isOnScreen() || w.mAttrs.type
74529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                == WindowManager.LayoutParams.TYPE_BASE_APPLICATION)
74539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                && !w.mExiting && !w.mDestroying) {
74549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) {
74558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.v(TAG, "Eval win " + w + ": isDrawn="
74567433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn                                        + w.isDrawnLw()
74579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + ", isAnimating=" + w.isAnimating());
74587433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn                                if (!w.isDrawnLw()) {
74598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                    Slog.v(TAG, "Not displayed: s=" + w.mSurface
74609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " pv=" + w.mPolicyVisibility
74619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " dp=" + w.mDrawPending
74629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " cdp=" + w.mCommitDrawPending
74639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " ah=" + w.mAttachedHidden
74649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " th=" + atoken.hiddenRequested
74659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " a=" + w.mAnimating);
74669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
74679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
74689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (w != atoken.startingWindow) {
74699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (!atoken.freezingScreen || !w.mAppFreezing) {
74709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    atoken.numInterestingWindows++;
74717433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn                                    if (w.isDrawnLw()) {
74729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        atoken.numDrawnWindows++;
74738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                        if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) Slog.v(TAG,
74749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                "tokenMayBeDrawn: " + atoken
74759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                + " freezingScreen=" + atoken.freezingScreen
74769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                + " mAppFreezing=" + w.mAppFreezing);
74779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        tokenMayBeDrawn = true;
74789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    }
74799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
74807433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn                            } else if (w.isDrawnLw()) {
74819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                atoken.startingDisplayed = true;
74829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
74839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
74849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (w.mReadyToShow) {
74859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.performShowLocked();
74869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
74879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
74889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7489b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                changes |= mPolicy.finishAnimationLw();
74909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
74919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (tokenMayBeDrawn) {
74929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // See if any windows have been drawn, so they (and others
74939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // associated with them) can now be shown.
7494f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    final int NT = mAppTokens.size();
74959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (i=0; i<NT; i++) {
7496f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                        AppWindowToken wtoken = mAppTokens.get(i);
74979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (wtoken.freezingScreen) {
74989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int numInteresting = wtoken.numInterestingWindows;
74999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
75008a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_VISIBILITY) Slog.v(TAG,
75019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "allDrawn: " + wtoken
75029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " interesting=" + numInteresting
75039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " drawn=" + wtoken.numDrawnWindows);
75049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                wtoken.showAllWindowsLocked();
75059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                unsetAppFreezingScreenLocked(wtoken, false, true);
75069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                orientationChangeComplete = true;
75079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
75089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (!wtoken.allDrawn) {
75099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int numInteresting = wtoken.numInterestingWindows;
75109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
75118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_VISIBILITY) Slog.v(TAG,
75129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "allDrawn: " + wtoken
75139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " interesting=" + numInteresting
75149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " drawn=" + wtoken.numDrawnWindows);
75159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                wtoken.allDrawn = true;
7516b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
75179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
75189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // We can now show all of the drawn windows!
75199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (!mOpeningApps.contains(wtoken)) {
75209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    wtoken.showAllWindowsLocked();
75219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
75229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
75239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
75249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
75259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
75269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
75279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If we are ready to perform an app transition, check through
75289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // all of the app tokens to be shown and see if they are ready
75299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // to go.
75309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mAppTransitionReady) {
75319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int NN = mOpeningApps.size();
75329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean goodToGo = true;
75338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
75349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "Checking " + NN + " opening apps (frozen="
75359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mDisplayFrozen + " timeout="
75369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mAppTransitionTimeout + ")...");
75379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mDisplayFrozen && !mAppTransitionTimeout) {
75389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // If the display isn't frozen, wait to do anything until
75399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // all of the apps are ready.  Otherwise just go because
75409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // we'll unfreeze the display when everyone is ready.
75419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (i=0; i<NN && goodToGo; i++) {
75429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AppWindowToken wtoken = mOpeningApps.get(i);
75438a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
75449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Check opening app" + wtoken + ": allDrawn="
75459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + wtoken.allDrawn + " startingDisplayed="
75469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + wtoken.startingDisplayed);
75479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (!wtoken.allDrawn && !wtoken.startingDisplayed
75489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    && !wtoken.startingMoved) {
75499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                goodToGo = false;
75509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
75519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
75529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
75539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (goodToGo) {
75548a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO");
75559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int transit = mNextAppTransition;
75569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mSkipAppTransitionAnimation) {
7557bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                            transit = WindowManagerPolicy.TRANSIT_UNSET;
75589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
7559bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                        mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET;
75609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAppTransitionReady = false;
7561a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mAppTransitionRunning = true;
75629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAppTransitionTimeout = false;
75639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mStartingIconInTransition = false;
75649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mSkipAppTransitionAnimation = false;
75659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
75669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mH.removeMessages(H.APP_TRANSITION_TIMEOUT);
75679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7568a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // If there are applications waiting to come to the
7569a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // top of the stack, now is the time to move their windows.
7570a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // (Note that we don't do apps going to the bottom
7571a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // here -- we want to keep their windows in the old
7572a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // Z-order until the animation completes.)
7573a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        if (mToTopApps.size() > 0) {
7574a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                            NN = mAppTokens.size();
7575a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                            for (i=0; i<NN; i++) {
7576a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                                AppWindowToken wtoken = mAppTokens.get(i);
7577a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                                if (wtoken.sendingToTop) {
7578a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                                    wtoken.sendingToTop = false;
7579a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                                    moveAppWindowsLocked(wtoken, NN, false);
7580a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                                }
7581a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                            }
7582a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                            mToTopApps.clear();
7583a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        }
7584ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
758525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        WindowState oldWallpaper = mWallpaperTarget;
7586ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
75873be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        adjustWallpaperWindowsLocked();
75886c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                        wallpaperMayChange = false;
7589ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7590bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // The top-most window will supply the layout params,
7591bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // and we will determine it below.
7592bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        LayoutParams animLp = null;
7593bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        int bestAnimLayer = -1;
759408121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                        boolean fullscreenAnim = false;
7595ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
75968a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
75973be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                                "New wallpaper target=" + mWallpaperTarget
75983be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                                + ", lower target=" + mLowerWallpaperTarget
75993be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                                + ", upper target=" + mUpperWallpaperTarget);
760025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        int foundWallpapers = 0;
7601bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // Do a first pass through the tokens for two
7602bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // things:
7603bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // (1) Determine if both the closing and opening
7604bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // app token sets are wallpaper targets, in which
7605bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // case special animations are needed
7606bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // (since the wallpaper needs to stay static
7607bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // behind them).
7608bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // (2) Find the layout params of the top-most
7609bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // application window in the tokens, which is
7610bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // what will control the animation theme.
7611bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        final int NC = mClosingApps.size();
7612bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        NN = NC + mOpeningApps.size();
7613bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        for (i=0; i<NN; i++) {
7614bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            AppWindowToken wtoken;
7615bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            int mode;
7616bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            if (i < NC) {
7617bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                wtoken = mClosingApps.get(i);
7618bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                mode = 1;
7619bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            } else {
7620bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                wtoken = mOpeningApps.get(i-NC);
7621bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                mode = 2;
7622f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                            }
7623bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            if (mLowerWallpaperTarget != null) {
7624bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                if (mLowerWallpaperTarget.mAppToken == wtoken
7625bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                        || mUpperWallpaperTarget.mAppToken == wtoken) {
7626bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                    foundWallpapers |= mode;
7627f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                                }
7628bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            }
7629bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            if (wtoken.appFullscreen) {
7630bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                WindowState ws = wtoken.findMainWindow();
7631bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                if (ws != null) {
7632ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                                    animLp = ws.mAttrs;
7633ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                                    bestAnimLayer = ws.mLayer;
763408121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                                    fullscreenAnim = true;
763508121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                                }
763608121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                            } else if (!fullscreenAnim) {
763708121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                                WindowState ws = wtoken.findMainWindow();
763808121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                                if (ws != null) {
763908121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                                    if (ws.mLayer > bestAnimLayer) {
7640bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                        animLp = ws.mAttrs;
7641bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                        bestAnimLayer = ws.mLayer;
7642bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                    }
7643f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                                }
7644f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                            }
764525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        }
7646ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
764725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        if (foundWallpapers == 3) {
76488a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
764925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    "Wallpaper animation!");
765025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            switch (transit) {
765125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN:
765225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                case WindowManagerPolicy.TRANSIT_TASK_OPEN:
765325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                case WindowManagerPolicy.TRANSIT_TASK_TO_FRONT:
765425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    transit = WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_OPEN;
765525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    break;
765625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                case WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE:
765725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                case WindowManagerPolicy.TRANSIT_TASK_CLOSE:
765825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                case WindowManagerPolicy.TRANSIT_TASK_TO_BACK:
765925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    transit = WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_CLOSE;
766025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    break;
7661f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                            }
76628a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
766325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    "New transit: " + transit);
766425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        } else if (oldWallpaper != null) {
766525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            // We are transitioning from an activity with
766625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            // a wallpaper to one without.
766725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            transit = WindowManagerPolicy.TRANSIT_WALLPAPER_CLOSE;
76688a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
766925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    "New transit away from wallpaper: " + transit);
767025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        } else if (mWallpaperTarget != null) {
767125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            // We are transitioning from an activity without
767225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            // a wallpaper to now showing the wallpaper
767325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            transit = WindowManagerPolicy.TRANSIT_WALLPAPER_OPEN;
76748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
767525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    "New transit into wallpaper: " + transit);
7676f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                        }
7677ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7678de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        // If all closing windows are obscured, then there is
7679de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        // no need to do an animation.  This is the case, for
7680de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        // example, when this transition is being done behind
7681de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        // the lock screen.
7682de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        if (!mPolicy.allowAppAnimationsLw()) {
7683de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            animLp = null;
7684de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        }
7685de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn
76869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        NN = mOpeningApps.size();
76879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (i=0; i<NN; i++) {
76889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AppWindowToken wtoken = mOpeningApps.get(i);
76898a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
76909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Now opening app" + wtoken);
76919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.reportedVisible = false;
76929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.inPendingTransaction = false;
769383360b3167f2c394125b74f655bc577070cb9ccaDianne Hackborn                            wtoken.animation = null;
7694e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                            setTokenVisibilityLocked(wtoken, animLp, true,
7695ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                                    transit, false);
76969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.updateReportedVisibilityLocked();
7697a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                            wtoken.waitingToShow = false;
76989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.showAllWindowsLocked();
76999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
77009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        NN = mClosingApps.size();
77019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (i=0; i<NN; i++) {
77029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AppWindowToken wtoken = mClosingApps.get(i);
77038a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
77049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Now closing app" + wtoken);
77059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.inPendingTransaction = false;
770683360b3167f2c394125b74f655bc577070cb9ccaDianne Hackborn                            wtoken.animation = null;
7707e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                            setTokenVisibilityLocked(wtoken, animLp, false,
7708ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                                    transit, false);
77099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.updateReportedVisibilityLocked();
7710a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                            wtoken.waitingToHide = false;
77119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Force the allDrawn flag, because we want to start
77129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // this guy's animations regardless of whether it's
77139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // gotten drawn.
77149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.allDrawn = true;
77159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
77169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
77178b571a817cc953ce96750f440645f104c7f55157Dianne Hackborn                        mNextAppTransitionPackage = null;
7718ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
77199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mOpeningApps.clear();
77209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mClosingApps.clear();
77219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
77229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // This has changed the visibility of windows, so perform
77239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // a new layout to get them all up-to-date.
772494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT
772594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                                | WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG;
77269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLayoutNeeded = true;
772720583ff9d49257bd4ccc60e7b6337661e34ed887Dianne Hackborn                        if (!moveInputMethodWindowsIfNeededLocked(true)) {
772820583ff9d49257bd4ccc60e7b6337661e34ed887Dianne Hackborn                            assignLayersLocked();
772920583ff9d49257bd4ccc60e7b6337661e34ed887Dianne Hackborn                        }
77303a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES,
77313a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                                false /*updateInputWindows*/);
7732b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                        mFocusMayChange = false;
77339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
77349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7735ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
773616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                int adjResult = 0;
773716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn
7738a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                if (!animating && mAppTransitionRunning) {
7739a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // We have finished the animation of an app transition.  To do
7740a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // this, we have delayed a lot of operations like showing and
7741a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // hiding apps, moving apps in Z-order, etc.  The app token list
7742a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // reflects the correct Z-order, but the window list may now
7743a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // be out of sync with it.  So here we will just rebuild the
7744a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // entire app window list.  Fun!
7745a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    mAppTransitionRunning = false;
7746a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // Clear information about apps that were moving.
7747a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    mToBottomApps.clear();
7748ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7749a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    rebuildAppWindowListLocked();
7750b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT;
775116064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                    adjResult |= ADJUST_WALLPAPER_LAYERS_CHANGED;
7752a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    moveInputMethodWindowsIfNeededLocked(false);
7753a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    wallpaperMayChange = true;
7754c9568e3989f1491abaa7960eca986af12743cb05Suchi Amalapurapu                    // Since the window list has been rebuilt, focus might
7755c9568e3989f1491abaa7960eca986af12743cb05Suchi Amalapurapu                    // have to be recomputed since the actual order of windows
7756c9568e3989f1491abaa7960eca986af12743cb05Suchi Amalapurapu                    // might have changed again.
7757b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                    mFocusMayChange = true;
7758a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                }
7759ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7760b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (wallpaperForceHidingChanged && changes == 0 && !mAppTransitionReady) {
77613b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // At this point, there was a window with a wallpaper that
77623b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // was force hiding other windows behind it, but now it
77633b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // is going away.  This may be simple -- just animate
77643b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // away the wallpaper and its window -- or it may be
77653b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // hard -- the wallpaper now needs to be shown behind
77663b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // something that was hidden.
77673b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    WindowState oldWallpaper = mWallpaperTarget;
7768de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                    if (mLowerWallpaperTarget != null
7769de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            && mLowerWallpaperTarget.mAppToken != null) {
77708a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_WALLPAPER) Slog.v(TAG,
7771de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                                "wallpaperForceHiding changed with lower="
7772de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                                + mLowerWallpaperTarget);
77738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_WALLPAPER) Slog.v(TAG,
7774de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                                "hidden=" + mLowerWallpaperTarget.mAppToken.hidden +
7775de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                                " hiddenRequested=" + mLowerWallpaperTarget.mAppToken.hiddenRequested);
7776de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        if (mLowerWallpaperTarget.mAppToken.hidden) {
7777de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            // The lower target has become hidden before we
7778de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            // actually started the animation...  let's completely
7779de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            // re-evaluate everything.
7780de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            mLowerWallpaperTarget = mUpperWallpaperTarget = null;
7781b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
7782de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        }
7783de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                    }
778416064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                    adjResult |= adjustWallpaperWindowsLocked();
77853b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    wallpaperMayChange = false;
7786de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                    wallpaperForceHidingChanged = false;
77878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WALLPAPER) Slog.v(TAG, "****** OLD: " + oldWallpaper
7788de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            + " NEW: " + mWallpaperTarget
7789de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            + " LOWER: " + mLowerWallpaperTarget);
77903b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    if (mLowerWallpaperTarget == null) {
77913b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        // Whoops, we don't need a special wallpaper animation.
77923b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        // Clear them out.
77933b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        forceHiding = false;
77943b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        for (i=N-1; i>=0; i--) {
7795e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                            WindowState w = mWindows.get(i);
77963b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            if (w.mSurface != null) {
77973b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                final WindowManager.LayoutParams attrs = w.mAttrs;
7798c03d28b9e96f667d29ec6e480bed171bbd07169dSuchi Amalapurapu                                if (mPolicy.doesForceHide(w, attrs) && w.isVisibleLw()) {
77998a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                    if (DEBUG_FOCUS) Slog.i(TAG, "win=" + w + " force hides other windows");
78003b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                    forceHiding = true;
78013b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                } else if (mPolicy.canBeForceHidden(w, attrs)) {
78023b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                    if (!w.mAnimating) {
78033b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                        // We set the animation above so it
78043b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                        // is not yet running.
78053b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                        w.clearAnimation();
78063b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                    }
78073b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                }
78083b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            }
78093b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        }
78103b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    }
78113b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                }
7812ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
78136c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                if (mWindowDetachedWallpaper != windowDetachedWallpaper) {
78146c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                    if (DEBUG_WALLPAPER) Slog.v(TAG,
78156c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                            "Detached wallpaper changed from " + mWindowDetachedWallpaper
78166c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                            + windowDetachedWallpaper);
78176c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                    mWindowDetachedWallpaper = windowDetachedWallpaper;
78186c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                    wallpaperMayChange = true;
78196c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                }
78206c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn
7821de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                if (windowAnimationBackgroundColor != 0) {
7822de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                    if (mWindowAnimationBackgroundSurface == null) {
7823de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                        mWindowAnimationBackgroundSurface = new DimSurface(mFxSession);
7824de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                    }
7825de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                    mWindowAnimationBackgroundSurface.show(dw, dh,
7826de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                            windowAnimationBackground.mAnimLayer - LAYER_OFFSET_DIM,
7827de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                            windowAnimationBackgroundColor);
7828de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                } else if (mWindowAnimationBackgroundSurface != null) {
7829de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                    mWindowAnimationBackgroundSurface.hide();
7830de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                }
7831de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn
78326c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                if (wallpaperMayChange) {
78338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WALLPAPER) Slog.v(TAG,
78340586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                            "Wallpaper may change!  Adjusting");
783516064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                    adjResult |= adjustWallpaperWindowsLocked();
78363b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                }
7837ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
78383b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                if ((adjResult&ADJUST_WALLPAPER_LAYERS_CHANGED) != 0) {
78398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WALLPAPER) Slog.v(TAG,
78403b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            "Wallpaper layer changed: assigning layers + relayout");
7841b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT;
78423b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    assignLayersLocked();
78433b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                } else if ((adjResult&ADJUST_WALLPAPER_VISIBILITY_CHANGED) != 0) {
78448a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WALLPAPER) Slog.v(TAG,
78453b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            "Wallpaper visibility changed: relayout");
7846b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT;
78473b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                }
7848ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7849b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                if (mFocusMayChange) {
7850b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                    mFocusMayChange = false;
78513a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    if (updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES,
78523a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                            false /*updateInputWindows*/)) {
7853b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
78543b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        adjResult = 0;
7855a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    }
78566c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                }
78573b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn
78583b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                if (mLayoutNeeded) {
7859b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT;
78603b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                }
7861ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7862b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "*** ANIM STEP: changes=0x"
7863b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + Integer.toHexString(changes));
7864b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            } while (changes != 0);
78659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
78669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // THIRD LOOP: Update the surfaces of all windows.
78679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
78689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final boolean someoneLosingFocus = mLosingFocus.size() != 0;
78699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
78709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean obscured = false;
78719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean blurring = false;
78729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean dimming = false;
78739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean covered = false;
78749ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn            boolean syswin = false;
78759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7876bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn            final int N = mWindows.size();
7877ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
78789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (i=N-1; i>=0; i--) {
7879e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState w = mWindows.get(i);
78809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
78819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean displayed = false;
78829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final WindowManager.LayoutParams attrs = w.mAttrs;
78839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int attrFlags = attrs.flags;
78849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
78859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (w.mSurface != null) {
7886ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // XXX NOTE: The logic here could be improved.  We have
7887ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // the decision about whether to resize a window separated
7888ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // from whether to hide the surface.  This can cause us to
7889ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // resize a surface even if we are going to hide it.  You
7890ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // can see this by (1) holding device in landscape mode on
7891ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // home screen; (2) tapping browser icon (device will rotate
7892ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // to landscape; (3) tap home.  The wallpaper will be resized
7893ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // in step 2 but then immediately hidden, causing us to
7894ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // have to resize and then redraw it again in step 3.  It
7895ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // would be nice to figure out how to avoid this, but it is
7896ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // difficult because we do need to resize surfaces in some
7897ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // cases while they are hidden such as when first showing a
7898ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // window.
7899ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn
79009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.computeShownFrameLocked();
79018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (localLOGV) Slog.v(
79029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            TAG, "Placing surface #" + i + " " + w.mSurface
7903ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                            + ": new=" + w.mShownFrame);
79049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7905fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                    if (w.mSurface != null) {
7906b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        int width, height;
7907b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        if ((w.mAttrs.flags & w.mAttrs.FLAG_SCALED) != 0) {
7908b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                            // for a scaled surface, we just want to use
7909b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                            // the requested size.
7910b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                            width  = w.mRequestedWidth;
7911b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                            height = w.mRequestedHeight;
7912b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        } else {
7913b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                            width = w.mCompatFrame.width();
7914b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                            height = w.mCompatFrame.height();
7915b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        }
7916b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn
7917b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        if (width < 1) {
7918b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                            width = 1;
7919b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        }
7920b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        if (height < 1) {
7921b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                            height = 1;
7922b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        }
7923b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        final boolean surfaceResized = w.mSurfaceW != width || w.mSurfaceH != height;
7924b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        if (surfaceResized) {
7925b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                            w.mSurfaceW = width;
7926b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                            w.mSurfaceH = height;
7927b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        }
7928b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn
7929fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                        if (w.mSurfaceX != w.mShownFrame.left
7930fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                || w.mSurfaceY != w.mShownFrame.top) {
7931fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                            try {
7932fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                if (SHOW_TRANSACTIONS) logSurface(w,
7933fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        "POS " + w.mShownFrame.left
7934fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + ", " + w.mShownFrame.top, null);
7935fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                w.mSurfaceX = w.mShownFrame.left;
7936fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                w.mSurfaceY = w.mShownFrame.top;
7937fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                w.mSurface.setPosition(w.mShownFrame.left, w.mShownFrame.top);
7938fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                            } catch (RuntimeException e) {
7939fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                Slog.w(TAG, "Error positioning surface of " + w
7940fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + " pos=(" + w.mShownFrame.left
7941fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + "," + w.mShownFrame.top + ")", e);
7942fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                if (!recoveringMemory) {
7943648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                    reclaimSomeSurfaceMemoryLocked(w, "position", true);
7944fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                }
7945fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                            }
7946fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                        }
7947fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown
7948b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        if (surfaceResized) {
79499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            try {
7950b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                if (SHOW_TRANSACTIONS) logSurface(w,
7951b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                                        "SIZE " + width + "x" + height, null);
7952ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                                w.mSurfaceResized = true;
79539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mSurface.setSize(width, height);
79549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } catch (RuntimeException e) {
79559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // If something goes wrong with the surface (such
79569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // as running out of memory), don't take down the
79579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // entire system.
7958fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                Slog.e(TAG, "Error resizing surface of " + w
7959fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + " size=(" + width + "x" + height + ")", e);
79609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (!recoveringMemory) {
7961648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                    reclaimSomeSurfaceMemoryLocked(w, "size", true);
79629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
79639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
79649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
79659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
7966fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown
7967e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    if (!w.mAppFreezing && w.mLayoutSeq == mLayoutSeq) {
7968b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        w.mContentInsetsChanged |=
79699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            !w.mLastContentInsets.equals(w.mContentInsets);
7970b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        w.mVisibleInsetsChanged |=
79719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            !w.mLastVisibleInsets.equals(w.mVisibleInsets);
7972e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                        boolean configChanged =
7973e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                            w.mConfiguration != mCurConfiguration
7974e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                            && (w.mConfiguration == null
7975e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                                    || mCurConfiguration.diff(w.mConfiguration) != 0);
7976694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        if (DEBUG_CONFIGURATION && configChanged) {
7977694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            Slog.v(TAG, "Win " + w + " config changed: "
7978694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                    + mCurConfiguration);
7979694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        }
79808a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (localLOGV) Slog.v(TAG, "Resizing " + w
7981e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                                + ": configChanged=" + configChanged
7982b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                                + " last=" + w.mLastFrame + " frame=" + w.mFrame);
7983b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        w.mLastFrame.set(w.mFrame);
7984b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        if (w.mContentInsetsChanged
7985e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                                || w.mVisibleInsetsChanged
7986ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                                || w.mSurfaceResized
7987e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                                || configChanged) {
7988fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                            if (DEBUG_RESIZE || DEBUG_ORIENTATION) {
7989fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                Slog.v(TAG, "Resize reasons: "
7990fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + " contentInsetsChanged=" + w.mContentInsetsChanged
7991fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + " visibleInsetsChanged=" + w.mVisibleInsetsChanged
7992fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + " surfaceResized=" + w.mSurfaceResized
7993fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + " configChanged=" + configChanged);
7994fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                            }
7995fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown
79969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            w.mLastContentInsets.set(w.mContentInsets);
79979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            w.mLastVisibleInsets.set(w.mVisibleInsets);
79980586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                            // If the screen is currently frozen, then keep
79990586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                            // it frozen until this window draws at its new
80000586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                            // orientation.
80010586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                            if (mDisplayFrozen) {
80028a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_ORIENTATION) Slog.v(TAG,
80030586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                        "Resizing while display frozen: " + w);
80040586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                w.mOrientationChanging = true;
8005e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                                if (!mWindowsFreezingScreen) {
80060586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                    mWindowsFreezingScreen = true;
80070586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                    // XXX should probably keep timeout from
80080586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                    // when we first froze the display.
80090586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                    mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT);
80100586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                    mH.sendMessageDelayed(mH.obtainMessage(
80110586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                            H.WINDOW_FREEZE_TIMEOUT), 2000);
80120586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                }
80130586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                            }
80149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // If the orientation is changing, then we need to
80159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // hold off on unfreezing the display until this
80169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // window has been redrawn; to do that, we need
80179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // to go through the process of getting informed
80189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // by the application when it has finished drawing.
80199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (w.mOrientationChanging) {
80208a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_ORIENTATION) Slog.v(TAG,
80219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "Orientation start waiting for draw in "
80229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + w + ", surface " + w.mSurface);
80239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mDrawPending = true;
80249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mCommitDrawPending = false;
80259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mReadyToShow = false;
80269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (w.mAppToken != null) {
80279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    w.mAppToken.allDrawn = false;
80289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
80299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
8030b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                            if (!mResizingWindows.contains(w)) {
8031b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                                if (DEBUG_RESIZE || DEBUG_ORIENTATION) Slog.v(TAG,
8032b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                                        "Resizing window " + w + " to " + w.mSurfaceW
8033b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                                        + "x" + w.mSurfaceH);
8034b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                                mResizingWindows.add(w);
8035b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                            }
80369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (w.mOrientationChanging) {
80379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (!w.mDrawPending && !w.mCommitDrawPending) {
80388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_ORIENTATION) Slog.v(TAG,
80399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "Orientation not waiting for draw in "
80409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + w + ", surface " + w.mSurface);
80419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mOrientationChanging = false;
80429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
80439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
80449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
80459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
80463b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    if (w.mAttachedHidden || !w.isReadyForDisplay()) {
80479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!w.mLastHidden) {
80489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            //dump();
80499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            w.mLastHidden = true;
8050b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            if (SHOW_TRANSACTIONS) logSurface(w,
8051b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                    "HIDE (performLayout)", null);
80529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (w.mSurface != null) {
805316064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                w.mSurfaceShown = false;
80549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                try {
80559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    w.mSurface.hide();
80569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                } catch (RuntimeException e) {
80578a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                    Slog.w(TAG, "Exception hiding surface in " + w);
80589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
80599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
80609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
80619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // If we are waiting for this window to handle an
80629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // orientation change, well, it is hidden, so
80639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // doesn't really matter.  Note that this does
80649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // introduce a potential glitch if the window
80659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // becomes unhidden before it has drawn for the
80669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // new orientation.
80679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (w.mOrientationChanging) {
80689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            w.mOrientationChanging = false;
80698a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_ORIENTATION) Slog.v(TAG,
80709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Orientation change skips hidden " + w);
80719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
80729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (w.mLastLayer != w.mAnimLayer
80739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastAlpha != w.mShownAlpha
80749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastDsDx != w.mDsDx
80759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastDtDx != w.mDtDx
80769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastDsDy != w.mDsDy
80779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastDtDy != w.mDtDy
80789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastHScale != w.mHScale
80799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastVScale != w.mVScale
80809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastHidden) {
80819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        displayed = true;
80829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastAlpha = w.mShownAlpha;
80839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastLayer = w.mAnimLayer;
80849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastDsDx = w.mDsDx;
80859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastDtDx = w.mDtDx;
80869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastDsDy = w.mDsDy;
80879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastDtDy = w.mDtDy;
80889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastHScale = w.mHScale;
80899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastVScale = w.mVScale;
8090b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        if (SHOW_TRANSACTIONS) logSurface(w,
8091b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                "alpha=" + w.mShownAlpha + " layer=" + w.mAnimLayer
80920586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                + " matrix=[" + (w.mDsDx*w.mHScale)
80930586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                + "," + (w.mDtDx*w.mVScale)
80940586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                + "][" + (w.mDsDy*w.mHScale)
8095b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                + "," + (w.mDtDy*w.mVScale) + "]", null);
80969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (w.mSurface != null) {
80979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            try {
809816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                w.mSurfaceAlpha = w.mShownAlpha;
80999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mSurface.setAlpha(w.mShownAlpha);
810016064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                w.mSurfaceLayer = w.mAnimLayer;
81019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mSurface.setLayer(w.mAnimLayer);
81029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mSurface.setMatrix(
81039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        w.mDsDx*w.mHScale, w.mDtDx*w.mVScale,
81049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        w.mDsDy*w.mHScale, w.mDtDy*w.mVScale);
81059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } catch (RuntimeException e) {
81068a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.w(TAG, "Error updating surface in " + w, e);
81079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (!recoveringMemory) {
8108648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                    reclaimSomeSurfaceMemoryLocked(w, "update", true);
81099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
81109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
81119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
81129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
81139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (w.mLastHidden && !w.mDrawPending
81149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                && !w.mCommitDrawPending
81159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                && !w.mReadyToShow) {
8116b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            if (SHOW_TRANSACTIONS) logSurface(w,
8117b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                    "SHOW (performLayout)", null);
81188a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + w
81199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + " during relayout");
81209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (showSurfaceRobustlyLocked(w)) {
81219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mHasDrawn = true;
81229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mLastHidden = false;
81239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } else {
81249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mOrientationChanging = false;
81259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
81269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
81279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (w.mSurface != null) {
81289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            w.mToken.hasVisible = true;
81299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
81309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
81319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        displayed = true;
81329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
81339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
81349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (displayed) {
81359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!covered) {
8136980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy                            if (attrs.width == LayoutParams.MATCH_PARENT
8137980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy                                    && attrs.height == LayoutParams.MATCH_PARENT) {
81389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                covered = true;
81399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
81409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
81419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (w.mOrientationChanging) {
81429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (w.mDrawPending || w.mCommitDrawPending) {
81439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                orientationChangeComplete = false;
81448a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_ORIENTATION) Slog.v(TAG,
81459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "Orientation continue waiting for draw in " + w);
81469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } else {
81479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mOrientationChanging = false;
81488a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_ORIENTATION) Slog.v(TAG,
81499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "Orientation change complete in " + w);
81509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
81519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
81529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mToken.hasVisible = true;
81539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
81549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (w.mOrientationChanging) {
81558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_ORIENTATION) Slog.v(TAG,
81569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "Orientation change skips hidden " + w);
81579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mOrientationChanging = false;
81589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
81599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
81600f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                if (w.mContentChanged) {
81610f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                    //Slog.i(TAG, "Window " + this + " clearing mContentChanged - done placing");
81620f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                    w.mContentChanged = false;
81630f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                }
81640f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
81659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final boolean canBeSeen = w.isDisplayedLw();
81669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
81679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (someoneLosingFocus && w == mCurrentFocus && canBeSeen) {
81689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    focusDisplayed = true;
81699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
81709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8171e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                final boolean obscuredChanged = w.mObscured != obscured;
8172ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
81739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Update effect.
81747341d7a104b47996445d069a695e155a07184606Dianne Hackborn                if (!(w.mObscured=obscured)) {
81759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (w.mSurface != null) {
81769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if ((attrFlags&FLAG_KEEP_SCREEN_ON) != 0) {
81779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            holdScreen = w.mSession;
81789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
81799ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn                        if (!syswin && w.mAttrs.screenBrightness >= 0
81809ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn                                && screenBrightness < 0) {
81819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            screenBrightness = w.mAttrs.screenBrightness;
81829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
8183fb73f79340375013225618a5d87f46b958f698efMike Lockwood                        if (!syswin && w.mAttrs.buttonBrightness >= 0
8184fb73f79340375013225618a5d87f46b958f698efMike Lockwood                                && buttonBrightness < 0) {
8185fb73f79340375013225618a5d87f46b958f698efMike Lockwood                            buttonBrightness = w.mAttrs.buttonBrightness;
8186fb73f79340375013225618a5d87f46b958f698efMike Lockwood                        }
818746af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood                        if (canBeSeen
818846af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood                                && (attrs.type == WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG
818946af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood                                 || attrs.type == WindowManager.LayoutParams.TYPE_KEYGUARD
819046af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood                                 || attrs.type == WindowManager.LayoutParams.TYPE_SYSTEM_ERROR)) {
81919ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn                            syswin = true;
81929ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn                        }
81939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
81941ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
819525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                    boolean opaqueDrawn = canBeSeen && w.isOpaqueDrawn();
8196e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                    if (opaqueDrawn && w.isFullscreen(innerDw, innerDh)) {
81979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // This window completely covers everything behind it,
81989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // so we want to leave all of them as unblurred (for
81999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // performance reasons).
82009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        obscured = true;
82013b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    } else if (canBeSeen && !obscured &&
82029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            (attrFlags&FLAG_BLUR_BEHIND|FLAG_DIM_BEHIND) != 0) {
82038a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (localLOGV) Slog.v(TAG, "Win " + w
82049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ": blurring=" + blurring
82059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " obscured=" + obscured
82069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " displayed=" + displayed);
82079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if ((attrFlags&FLAG_DIM_BEHIND) != 0) {
82089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (!dimming) {
82098a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                //Slog.i(TAG, "DIM BEHIND: " + w);
82109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                dimming = true;
82110a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                if (mDimAnimator == null) {
82120a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                    mDimAnimator = new DimAnimator(mFxSession);
82139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
821448a7651823030ed3c0f4c084b423430044425feaDianne Hackborn                                mDimAnimator.show(innerDw, innerDh);
82151c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                                mDimAnimator.updateParameters(mContext.getResources(),
82161c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                                        w, currentTime);
82179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
82189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
82199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if ((attrFlags&FLAG_BLUR_BEHIND) != 0) {
82209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (!blurring) {
82218a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                //Slog.i(TAG, "BLUR BEHIND: " + w);
82229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                blurring = true;
82239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (mBlurSurface == null) {
82249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    try {
822506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                                        mBlurSurface = new Surface(mFxSession, 0,
82265d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian                                                "BlurSurface",
82279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                -1, 16, 16,
82289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                PixelFormat.OPAQUE,
82299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                Surface.FX_SURFACE_BLUR);
82309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    } catch (Exception e) {
82318a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                        Slog.e(TAG, "Exception creating Blur surface", e);
82329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    }
8233ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                                    if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BLUR "
8234ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                                            + mBlurSurface + ": CREATE");
82359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
82369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (mBlurSurface != null) {
823716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                    if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BLUR "
823816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                            + mBlurSurface + ": pos=(0,0) (" +
823916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                            dw + "x" + dh + "), layer=" + (w.mAnimLayer-1));
82409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    mBlurSurface.setPosition(0, 0);
82419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    mBlurSurface.setSize(dw, dh);
8242de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                    mBlurSurface.setLayer(w.mAnimLayer-LAYER_OFFSET_BLUR);
824316064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                    if (!mBlurShown) {
824416064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                        try {
824516064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                            if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BLUR "
824616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                                    + mBlurSurface + ": SHOW");
824716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                            mBlurSurface.show();
824816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                        } catch (RuntimeException e) {
824916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                            Slog.w(TAG, "Failure showing blur surface", e);
825016064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                        }
825116064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                        mBlurShown = true;
82529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    }
82539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
82549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
82559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
82569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
82579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8258ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
8259e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                if (obscuredChanged && mWallpaperTarget == w) {
8260e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    // This is the wallpaper target and its obscured state
8261e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    // changed... make sure the current wallaper's visibility
8262e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    // has been updated accordingly.
8263e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    updateWallpaperVisibilityLocked();
8264e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                }
82659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8266ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
82670a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima            if (mDimAnimator != null && mDimAnimator.mDimShown) {
8268de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                animating |= mDimAnimator.updateSurface(dimming, currentTime,
8269de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        mDisplayFrozen || !mPolicy.isScreenOn());
82709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
827106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
82729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!blurring && mBlurShown) {
82738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BLUR " + mBlurSurface
82749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": HIDE");
82759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
82769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mBlurSurface.hide();
82779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IllegalArgumentException e) {
82788a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Illegal argument exception hiding blur surface");
82799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
82809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mBlurShown = false;
82819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
82827916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
82837916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (mBlackFrame != null) {
82847916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                if (mScreenRotationAnimation != null) {
82857916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    mBlackFrame.setMatrix(
82867916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                            mScreenRotationAnimation.getEnterTransformation().getMatrix());
82877916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                } else {
82887916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    mBlackFrame.clearMatrix();
82897916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                }
82907916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
82919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
82928a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.e(TAG, "Unhandled exception in Window Manager", e);
82939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
82949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
82959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Surface.closeTransaction();
829606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
829794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn        if (SHOW_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION performLayoutAndPlaceSurfaces");
829894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn
8299b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        if (mWatermark != null) {
8300b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            mWatermark.drawIfNeeded();
8301b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        }
8302b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn
83038a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_ORIENTATION && mDisplayFrozen) Slog.v(TAG,
83049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "With display frozen, orientationChangeComplete="
83059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + orientationChangeComplete);
83069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (orientationChangeComplete) {
83079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mWindowsFreezingScreen) {
83089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindowsFreezingScreen = false;
83099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT);
83109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8311e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            stopFreezingDisplayLocked();
83129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
831306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
83149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        i = mResizingWindows.size();
83159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (i > 0) {
83169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            do {
83179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
83189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState win = mResizingWindows.get(i);
83199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
8320ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    if (DEBUG_RESIZE || DEBUG_ORIENTATION) Slog.v(TAG,
8321ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                            "Reporting new frame to " + win + ": " + win.mCompatFrame);
8322694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    int diff = 0;
8323e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    boolean configChanged =
8324e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                        win.mConfiguration != mCurConfiguration
8325e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                        && (win.mConfiguration == null
8326694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                || (diff=mCurConfiguration.diff(win.mConfiguration)) != 0);
8327694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    if ((DEBUG_RESIZE || DEBUG_ORIENTATION || DEBUG_CONFIGURATION)
8328694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            && configChanged) {
83298a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.i(TAG, "Sending new config to window " + win + ": "
8330b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                                + win.mSurfaceW + "x" + win.mSurfaceH
8331694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                + " / " + mCurConfiguration + " / 0x"
8332694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                + Integer.toHexString(diff));
8333e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    }
8334694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    win.mConfiguration = mCurConfiguration;
8335b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                    win.mClient.resized(win.mSurfaceW, win.mSurfaceH, win.mLastContentInsets,
8336e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                            win.mLastVisibleInsets, win.mDrawPending,
8337e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                            configChanged ? win.mConfiguration : null);
83389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mContentInsetsChanged = false;
83399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mVisibleInsetsChanged = false;
8340ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    win.mSurfaceResized = false;
83419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
83429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mOrientationChanging = false;
83439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
83449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } while (i > 0);
83459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResizingWindows.clear();
83469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
834706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
83489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Destroy the surface of any windows that are no longer visible.
83497341d7a104b47996445d069a695e155a07184606Dianne Hackborn        boolean wallpaperDestroyed = false;
83509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        i = mDestroySurface.size();
83519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (i > 0) {
83529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            do {
83539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
83549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState win = mDestroySurface.get(i);
83559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mDestroying = false;
83569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mInputMethodWindow == win) {
83579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mInputMethodWindow = null;
83589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
83597341d7a104b47996445d069a695e155a07184606Dianne Hackborn                if (win == mWallpaperTarget) {
83607341d7a104b47996445d069a695e155a07184606Dianne Hackborn                    wallpaperDestroyed = true;
83617341d7a104b47996445d069a695e155a07184606Dianne Hackborn                }
83629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.destroySurfaceLocked();
83639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } while (i > 0);
83649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDestroySurface.clear();
83659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
83669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
83679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Time to remove any exiting tokens?
83689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=mExitingTokens.size()-1; i>=0; i--) {
83699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken token = mExitingTokens.get(i);
83709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!token.hasVisible) {
83719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mExitingTokens.remove(i);
83724c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                if (token.windowType == TYPE_WALLPAPER) {
83734c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mWallpaperTokens.remove(token);
83744c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
83759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
83769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
83779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
83789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Time to remove any exiting applications?
83799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=mExitingAppTokens.size()-1; i>=0; i--) {
83809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken token = mExitingAppTokens.get(i);
83819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!token.hasVisible && !mClosingApps.contains(token)) {
83829bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                // Make sure there is no animation running on this token,
83839bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                // so any windows associated with it will be removed as
83849bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                // soon as their animations are complete
83859bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                token.animation = null;
83869bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                token.animating = false;
8387f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG,
8388f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                        "performLayout: App token exiting now removed" + token);
83899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppTokens.remove(token);
83909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mExitingAppTokens.remove(i);
83919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
83929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
83939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8394a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        boolean needRelayout = false;
8395ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
8396a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        if (!animating && mAppTransitionRunning) {
8397a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // We have finished the animation of an app transition.  To do
8398a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // this, we have delayed a lot of operations like showing and
8399a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // hiding apps, moving apps in Z-order, etc.  The app token list
8400a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // reflects the correct Z-order, but the window list may now
8401a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // be out of sync with it.  So here we will just rebuild the
8402a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // entire app window list.  Fun!
8403a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            mAppTransitionRunning = false;
8404a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            needRelayout = true;
8405a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            rebuildAppWindowListLocked();
840616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn            assignLayersLocked();
8407a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // Clear information about apps that were moving.
8408a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            mToBottomApps.clear();
8409a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        }
8410ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
84119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (focusDisplayed) {
84129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendEmptyMessage(H.REPORT_LOSING_FOCUS);
84139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
84147341d7a104b47996445d069a695e155a07184606Dianne Hackborn        if (wallpaperDestroyed) {
84150586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn            needRelayout = adjustWallpaperWindowsLocked() != 0;
84167341d7a104b47996445d069a695e155a07184606Dianne Hackborn        }
8417a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        if (needRelayout) {
84187341d7a104b47996445d069a695e155a07184606Dianne Hackborn            requestAnimationLocked(0);
84197341d7a104b47996445d069a695e155a07184606Dianne Hackborn        } else if (animating) {
84209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            requestAnimationLocked(currentTime+(1000/60)-SystemClock.uptimeMillis());
84219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8422eb857f12d605659b385d168ef1ea7d4ba5193585Jeff Brown
84233a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        // Finally update all input windows now that the window changes have stabilized.
84242e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown        mInputMonitor.updateInputWindowsLw(true /*force*/);
8425eb857f12d605659b385d168ef1ea7d4ba5193585Jeff Brown
84268e03b7566c42621fda01186b66b019142eb84fbfJeff Brown        setHoldScreenLocked(holdScreen != null);
8427428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn        if (!mDisplayFrozen) {
8428428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            if (screenBrightness < 0 || screenBrightness > 1.0f) {
8429428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                mPowerManager.setScreenBrightnessOverride(-1);
8430428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            } else {
8431428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                mPowerManager.setScreenBrightnessOverride((int)
8432428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        (screenBrightness * Power.BRIGHTNESS_ON));
8433428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            }
8434428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            if (buttonBrightness < 0 || buttonBrightness > 1.0f) {
8435428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                mPowerManager.setButtonBrightnessOverride(-1);
8436428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            } else {
8437428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                mPowerManager.setButtonBrightnessOverride((int)
8438428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        (buttonBrightness * Power.BRIGHTNESS_ON));
8439428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            }
8440fb73f79340375013225618a5d87f46b958f698efMike Lockwood        }
84419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (holdScreen != mHoldingScreenOn) {
84429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHoldingScreenOn = holdScreen;
84439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Message m = mH.obtainMessage(H.HOLD_SCREEN_CHANGED, holdScreen);
84449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendMessage(m);
84459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8446ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
844793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        if (mTurnOnScreen) {
8448b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn            if (DEBUG_VISIBILITY) Slog.v(TAG, "Turning screen on after layout!");
844993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn            mPowerManager.userActivity(SystemClock.uptimeMillis(), false,
845093e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                    LocalPowerManager.BUTTON_EVENT, true);
845193e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn            mTurnOnScreen = false;
845293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        }
8453f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn
845450660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn        if (screenRotationFinished && mScreenRotationAnimation != null) {
845550660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn            mScreenRotationAnimation.kill();
845650660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn            mScreenRotationAnimation = null;
845750660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn        }
845850660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn
845989ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        if (updateRotation) {
846089ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation");
846189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            boolean changed = setRotationUncheckedLocked(
846289ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                    WindowManagerPolicy.USE_LAST_ROTATION, 0, false);
846389ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            if (changed) {
84643e4f9d0452a2592338c15cf1b6d774761b929a28Dianne Hackborn                mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
846589ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            }
846689ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        }
846789ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn
8468f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn        // Check to see if we are now in a state where the screen should
8469f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn        // be enabled, because the window obscured flags have changed.
8470f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn        enableScreenIfNeededLocked();
84719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
847246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
847346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    /**
847446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     * Must be called with the main window manager lock held.
847546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     */
847646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    void setHoldScreenLocked(boolean holding) {
847746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        boolean state = mHoldingScreenWakeLock.isHeld();
847846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        if (holding != state) {
847946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            if (holding) {
84800601eb7953cbf77d92826bef3ca37e208d922de7Daniel Sandler                mPolicy.screenOnStartedLw();
848146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                mHoldingScreenWakeLock.acquire();
848246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            } else {
848346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                mPolicy.screenOnStoppedLw();
848446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                mHoldingScreenWakeLock.release();
848546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            }
848646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
848746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
84889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
84899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void requestAnimationLocked(long delay) {
84909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mAnimationPending) {
84919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAnimationPending = true;
84929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendMessageDelayed(mH.obtainMessage(H.ANIMATE), delay);
84939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
84949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
849506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
84969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
84979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Have the surface flinger show a surface, robustly dealing with
84989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * error conditions.  In particular, if there is not enough memory
84999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to show the surface, then we will try to get rid of other surfaces
85009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in order to succeed.
850106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     *
85029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the surface was successfully shown.
85039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
85049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean showSurfaceRobustlyLocked(WindowState win) {
85059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
85069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.mSurface != null) {
850716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                win.mSurfaceShown = true;
85089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mSurface.show();
850993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                if (win.mTurnOnScreen) {
8510b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                    if (DEBUG_VISIBILITY) Slog.v(TAG,
8511b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                            "Show surface turning screen on: " + win);
851293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                    win.mTurnOnScreen = false;
851393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                    mTurnOnScreen = true;
851493e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                }
85159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
85169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
85179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
851894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            Slog.w(TAG, "Failure showing surface " + win.mSurface + " in " + win, e);
85199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
852006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
8521648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        reclaimSomeSurfaceMemoryLocked(win, "show", true);
852206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
85239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
85249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
852506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
8526648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn    boolean reclaimSomeSurfaceMemoryLocked(WindowState win, String operation, boolean secure) {
85279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Surface surface = win.mSurface;
8528648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        boolean leakedSurface = false;
8529648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        boolean killedApps = false;
853006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
8531ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker        EventLog.writeEvent(EventLogTags.WM_NO_SURFACE_MEMORY, win.toString(),
85329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mSession.mPid, operation);
853306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
85349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mForceRemoves == null) {
85359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mForceRemoves = new ArrayList<WindowState>();
85369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
853706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
85389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long callingIdentity = Binder.clearCallingIdentity();
85399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
85409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // There was some problem...   first, do a sanity check of the
85419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // window list to make sure we haven't left any dangling surfaces
85429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // around.
85439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = mWindows.size();
85448a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.i(TAG, "Out of memory for surface!  Looking for leaks...");
85459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
8546e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState ws = mWindows.get(i);
85479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ws.mSurface != null) {
85489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mSessions.contains(ws.mSession)) {
85498a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "LEAKED SURFACE (session doesn't exist): "
85509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ws + " surface=" + ws.mSurface
85519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " token=" + win.mToken
85529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " pid=" + ws.mSession.mPid
85539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " uid=" + ws.mSession.mUid);
855494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        if (SHOW_TRANSACTIONS) logSurface(ws, "LEAK DESTROY", null);
85550586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                        ws.mSurface.destroy();
855616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                        ws.mSurfaceShown = false;
85579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ws.mSurface = null;
85589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mForceRemoves.add(ws);
85599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        i--;
85609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        N--;
85619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        leakedSurface = true;
856294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    } else if (ws.mAppToken != null && ws.mAppToken.clientHidden) {
85638a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "LEAKED SURFACE (app token hidden): "
85649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ws + " surface=" + ws.mSurface
85659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " token=" + win.mAppToken);
856694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        if (SHOW_TRANSACTIONS) logSurface(ws, "LEAK DESTROY", null);
85670586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                        ws.mSurface.destroy();
856816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                        ws.mSurfaceShown = false;
85699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ws.mSurface = null;
85709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        leakedSurface = true;
85719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
85729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
85739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
857406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
85759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!leakedSurface) {
85768a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "No leaked surfaces; killing applicatons!");
85779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SparseIntArray pidCandidates = new SparseIntArray();
85789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
8579e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    WindowState ws = mWindows.get(i);
85809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ws.mSurface != null) {
85819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pidCandidates.append(ws.mSession.mPid, ws.mSession.mPid);
85829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
85839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
85849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pidCandidates.size() > 0) {
85859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int[] pids = new int[pidCandidates.size()];
85869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i=0; i<pids.length; i++) {
85879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pids[i] = pidCandidates.keyAt(i);
85889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
85899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
8590648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        if (mActivityManager.killPids(pids, "Free memory", secure)) {
85919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            killedApps = true;
85929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
85939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (RemoteException e) {
85949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
85959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
85969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
859706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
85989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (leakedSurface || killedApps) {
85999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We managed to reclaim some memory, so get rid of the trouble
86009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // surface and ask the app to request another one.
86018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Looks like we have reclaimed some memory, clearing surface for retry.");
86029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (surface != null) {
86035fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                    if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) logSurface(win,
86045fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                            "RECOVER DESTROY", null);
86050586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                    surface.destroy();
860616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                    win.mSurfaceShown = false;
86079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mSurface = null;
86089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
860906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
86109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
86119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mClient.dispatchGetNewSurface();
86129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
86139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
86149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
86159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
86169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(callingIdentity);
86179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8618648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn
8619648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        return leakedSurface || killedApps;
86209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
862106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
86223a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown    private boolean updateFocusedWindowLocked(int mode, boolean updateInputWindows) {
86239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState newFocus = computeFocusedWindowLocked();
86249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mCurrentFocus != newFocus) {
86259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // This check makes sure that we don't already have the focus
86269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // change message pending.
86279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.removeMessages(H.REPORT_FOCUS_CHANGE);
86289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendEmptyMessage(H.REPORT_FOCUS_CHANGE);
86298a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (localLOGV) Slog.v(
86309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Changing focus from " + mCurrentFocus + " to " + newFocus);
86319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final WindowState oldFocus = mCurrentFocus;
86329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentFocus = newFocus;
86339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLosingFocus.remove(newFocus);
863406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
86359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final WindowState imWindow = mInputMethodWindow;
86369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (newFocus != imWindow && oldFocus != imWindow) {
8637c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                if (moveInputMethodWindowsIfNeededLocked(
86389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mode != UPDATE_FOCUS_WILL_ASSIGN_LAYERS &&
8639c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                        mode != UPDATE_FOCUS_WILL_PLACE_SURFACES)) {
8640c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                    mLayoutNeeded = true;
8641c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                }
86429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mode == UPDATE_FOCUS_PLACING_SURFACES) {
86433a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    performLayoutLockedInner(true /*initial*/, updateInputWindows);
8644c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                } else if (mode == UPDATE_FOCUS_WILL_PLACE_SURFACES) {
8645c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                    // Client will do the layout, but we need to assign layers
8646c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                    // for handleNewWindowLocked() below.
8647c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                    assignLayersLocked();
86489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
86499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8650349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
8651349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown            if (mode != UPDATE_FOCUS_WILL_ASSIGN_LAYERS) {
8652349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown                // If we defer assigning layers, then the caller is responsible for
8653349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown                // doing this part.
86543a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                finishUpdateFocusedWindowAfterAssignLayersLocked(updateInputWindows);
8655c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            }
86569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
86579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
86589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
86599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8660349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
86613a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown    private void finishUpdateFocusedWindowAfterAssignLayersLocked(boolean updateInputWindows) {
86623a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        mInputMonitor.setInputFocusLw(mCurrentFocus, updateInputWindows);
8663349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    }
86649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
86659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowState computeFocusedWindowLocked() {
86669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState result = null;
86679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState win;
86689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
86699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i = mWindows.size() - 1;
86709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int nextAppIndex = mAppTokens.size()-1;
86719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowToken nextApp = nextAppIndex >= 0
86729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ? mAppTokens.get(nextAppIndex) : null;
86739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
86749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (i >= 0) {
8675e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            win = mWindows.get(i);
86769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
86778a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (localLOGV || DEBUG_FOCUS) Slog.v(
86789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Looking for focus: " + i
86799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " = " + win
86809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", flags=" + win.mAttrs.flags
86819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", canReceive=" + win.canReceiveKeys());
86829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
86839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken thisApp = win.mAppToken;
868406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
86859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If this window's application has been removed, just skip it.
86869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (thisApp != null && thisApp.removed) {
86879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
86889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
86899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
869006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
86919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If there is a focused app, don't allow focus to go to any
86929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // windows below it.  If this is an application window, step
86939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // through the app tokens until we find its app.
86949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (thisApp != null && nextApp != null && thisApp != nextApp
86959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && win.mAttrs.type != TYPE_APPLICATION_STARTING) {
86969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int origAppIndex = nextAppIndex;
86979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (nextAppIndex > 0) {
86989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (nextApp == mFocusedApp) {
86999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Whoops, we are below the focused app...  no focus
87009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // for you!
87018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (localLOGV || DEBUG_FOCUS) Slog.v(
87029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            TAG, "Reached focused app: " + mFocusedApp);
87039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return null;
87049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
87059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    nextAppIndex--;
87069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    nextApp = mAppTokens.get(nextAppIndex);
87079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (nextApp == thisApp) {
87089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
87099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
87109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
87119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (thisApp != nextApp) {
87129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Uh oh, the app token doesn't exist!  This shouldn't
87139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // happen, but if it does we can get totally hosed...
87149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // so restart at the original app.
87159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    nextAppIndex = origAppIndex;
87169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    nextApp = mAppTokens.get(nextAppIndex);
87179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
87189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
87199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
87209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Dispatch to this window if it is wants key events.
87219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.canReceiveKeys()) {
87228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_FOCUS) Slog.v(
87239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        TAG, "Found focus @ " + i + " = " + win);
87249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = win;
87259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
87269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
87279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
87289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            i--;
87299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
87309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
87319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
87329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
87339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
873494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn    private void startFreezingDisplayLocked(boolean inTransaction) {
87359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDisplayFrozen) {
87369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
87379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
873806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
87399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenFrozenLock.acquire();
874006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
87419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDisplayFrozen = true;
8742349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
874300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        mInputMonitor.freezeInputDispatchingLw();
8744349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
8745bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn        if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
8746bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn            mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET;
87473b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            mNextAppTransitionPackage = null;
87489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAppTransitionReady = true;
87499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
875006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
87519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (PROFILE_ORIENTATION) {
87529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            File file = new File("/data/system/frozen");
87539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Debug.startMethodTracing(file.toString(), 8 * 1024 * 1024);
87549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8755a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn
8756a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn        if (CUSTOM_SCREEN_ROTATION) {
8757f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn            if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) {
8758f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                mScreenRotationAnimation.kill();
8759f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                mScreenRotationAnimation = null;
8760f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn            }
8761a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn            if (mScreenRotationAnimation == null) {
8762f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                mScreenRotationAnimation = new ScreenRotationAnimation(mContext,
8763bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                        mFxSession, inTransaction, mCurDisplayWidth, mCurDisplayHeight,
8764bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                        mDisplay.getRotation());
8765a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn            }
8766de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            if (!mScreenRotationAnimation.hasScreenshot()) {
8767de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                Surface.freezeDisplay(0);
8768de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            }
8769a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn        } else {
8770a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn            Surface.freezeDisplay(0);
8771a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn        }
87729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
877306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
87749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void stopFreezingDisplayLocked() {
87759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mDisplayFrozen) {
87769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
87779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
877806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
8779e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        if (mWaitingForConfig || mAppsFreezingScreen > 0 || mWindowsFreezingScreen) {
8780e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            return;
8781e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        }
8782e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
87839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDisplayFrozen = false;
87849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.removeMessages(H.APP_FREEZE_TIMEOUT);
87859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (PROFILE_ORIENTATION) {
87869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Debug.stopMethodTracing();
87879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8788a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn
878989ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        boolean updateRotation = false;
879089ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn
8791de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn        if (CUSTOM_SCREEN_ROTATION && mScreenRotationAnimation != null
8792de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                && mScreenRotationAnimation.hasScreenshot()) {
8793de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            if (mScreenRotationAnimation.dismiss(mFxSession, MAX_ANIMATION_DURATION,
8794bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                    mTransitionAnimationScale, mCurDisplayWidth, mCurDisplayHeight)) {
8795de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                requestAnimationLocked(0);
8796de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            } else {
8797de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                mScreenRotationAnimation = null;
8798de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                updateRotation = true;
8799a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn            }
8800a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn        } else {
8801de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            if (mScreenRotationAnimation != null) {
8802de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                mScreenRotationAnimation.kill();
8803de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                mScreenRotationAnimation = null;
8804de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            }
8805de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            updateRotation = true;
8806a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn            Surface.unfreezeDisplay(0);
8807a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn        }
880806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
880900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        mInputMonitor.thawInputDispatchingLw();
88109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8811420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn        boolean configChanged;
8812420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn
8813b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        // While the display is frozen we don't re-compute the orientation
8814b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        // to avoid inconsistent states.  However, something interesting
8815b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        // could have actually changed during that time so re-evaluate it
8816b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        // now to catch that.
8817420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn        configChanged = updateOrientationFromAppTokensLocked(false);
8818b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate
88199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // A little kludge: a lot could have happened while the
88209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // display was frozen, so now that we are coming back we
88219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // do a gc so that any remote references the system
88229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // processes holds on others can be released if they are
88239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // no longer needed.
88249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.removeMessages(H.FORCE_GC);
88259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.sendMessageDelayed(mH.obtainMessage(H.FORCE_GC),
88269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                2000);
882706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
88289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenFrozenLock.release();
882989ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn
883089ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        if (updateRotation) {
883189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation");
8832420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn            configChanged |= setRotationUncheckedLocked(
883389ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                    WindowManagerPolicy.USE_LAST_ROTATION, 0, false);
8834420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn        }
8835420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn
8836420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn        if (configChanged) {
8837420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn            mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
883889ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        }
88399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
884006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
8841b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn    static int getPropertyInt(String[] tokens, int index, int defUnits, int defDps,
8842b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            DisplayMetrics dm) {
8843b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        if (index < tokens.length) {
8844b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            String str = tokens[index];
8845b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            if (str != null && str.length() > 0) {
8846b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                try {
8847b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                    int val = Integer.parseInt(str);
8848b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                    return val;
8849b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                } catch (Exception e) {
8850b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                }
8851b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            }
8852fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
8853fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        if (defUnits == TypedValue.COMPLEX_UNIT_PX) {
8854fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn            return defDps;
8855fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
8856fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        int val = (int)TypedValue.applyDimension(defUnits, defDps, dm);
8857fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        return val;
8858fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn    }
8859fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
8860fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn    void createWatermark() {
8861fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        if (mWatermark != null) {
8862fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn            return;
8863fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
8864fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
8865b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        File file = new File("/system/etc/setup.conf");
8866b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        FileInputStream in = null;
8867b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        try {
8868b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            in = new FileInputStream(file);
8869b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            DataInputStream ind = new DataInputStream(in);
8870b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            String line = ind.readLine();
8871b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            if (line != null) {
8872b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                String[] toks = line.split("%");
8873b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                if (toks != null && toks.length > 0) {
8874bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                    mWatermark = new Watermark(mRealDisplayMetrics, mFxSession, toks);
8875b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                }
8876b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            }
8877b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        } catch (FileNotFoundException e) {
8878b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        } catch (IOException e) {
8879b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        } finally {
8880b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            if (in != null) {
8881b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                try {
8882b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                    in.close();
8883b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                } catch (IOException e) {
8884b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                }
8885b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            }
8886fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
8887fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn    }
8888fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
88899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8890664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    public void statusBarVisibilityChanged(int visibility) {
889105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown        mInputManager.setSystemUiVisibility(visibility);
8892664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        synchronized (mWindowMap) {
8893664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            final int N = mWindows.size();
8894664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            for (int i = 0; i < N; i++) {
8895664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                WindowState ws = mWindows.get(i);
8896664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                try {
8897664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                    if (ws.getAttrs().hasSystemUiListeners) {
8898664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                        ws.mClient.dispatchSystemUiVisibilityChanged(visibility);
8899664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                    }
8900664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                } catch (RemoteException e) {
8901664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                    // so sorry
8902664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                }
8903664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            }
8904664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        }
8905664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    }
8906664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato
8907a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    void dumpInput(FileDescriptor fd, PrintWriter pw, boolean dumpAll) {
8908a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.println("WINDOW MANAGER INPUT (dumpsys window input)");
890900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        mInputManager.dump(pw);
8910a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    }
8911a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
8912a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    void dumpPolicyLocked(FileDescriptor fd, PrintWriter pw, String[] args, boolean dumpAll) {
8913a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.println("WINDOW MANAGER POLICY STATE (dumpsys window policy)");
8914a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        mPolicy.dump("    ", fd, pw, args);
8915a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    }
8916a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
8917a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    void dumpTokensLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll) {
8918a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.println("WINDOW MANAGER TOKENS (dumpsys window tokens)");
8919a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mTokenMap.size() > 0) {
8920a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  All tokens:");
8921a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            Iterator<WindowToken> it = mTokenMap.values().iterator();
8922a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            while (it.hasNext()) {
8923a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                WindowToken token = it.next();
8924a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print("  Token "); pw.print(token.token);
8925a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (dumpAll) {
8926a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println(':');
8927a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    token.dump(pw, "    ");
8928a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                } else {
8929a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
89309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
89319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8932a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
8933a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mWallpaperTokens.size() > 0) {
8934a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
8935a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  Wallpaper tokens:");
8936a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            for (int i=mWallpaperTokens.size()-1; i>=0; i--) {
8937a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                WindowToken token = mWallpaperTokens.get(i);
8938a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print("  Wallpaper #"); pw.print(i);
8939a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.print(' '); pw.print(token);
8940a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (dumpAll) {
8941a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println(':');
8942a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    token.dump(pw, "    ");
8943a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                } else {
8944a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
89459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
89469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8947a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
8948a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mAppTokens.size() > 0) {
8949a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
8950a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  Application tokens in Z order:");
8951a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            for (int i=mAppTokens.size()-1; i>=0; i--) {
8952a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print("  App #"); pw.print(i); pw.print(": ");
8953a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.println(mAppTokens.get(i));
89549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8955a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
8956a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mFinishedStarting.size() > 0) {
8957a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
8958a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  Finishing start of application tokens:");
8959a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            for (int i=mFinishedStarting.size()-1; i>=0; i--) {
8960a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                WindowToken token = mFinishedStarting.get(i);
8961a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print("  Finished Starting #"); pw.print(i);
8962a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.print(' '); pw.print(token);
8963a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (dumpAll) {
8964a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println(':');
8965a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    token.dump(pw, "    ");
8966a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                } else {
8967a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
89689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
89699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8970a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
8971a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mExitingTokens.size() > 0) {
8972a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
8973a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  Exiting tokens:");
8974a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            for (int i=mExitingTokens.size()-1; i>=0; i--) {
8975a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                WindowToken token = mExitingTokens.get(i);
8976a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print("  Exiting #"); pw.print(i);
8977a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.print(' '); pw.print(token);
8978a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (dumpAll) {
8979a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println(':');
8980a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    token.dump(pw, "    ");
8981a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                } else {
8982a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
89839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
89849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8985a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
8986a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mExitingAppTokens.size() > 0) {
8987a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
8988a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  Exiting application tokens:");
8989a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            for (int i=mExitingAppTokens.size()-1; i>=0; i--) {
8990a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                WindowToken token = mExitingAppTokens.get(i);
8991a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print("  Exiting App #"); pw.print(i);
8992a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.print(' '); pw.print(token);
8993a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (dumpAll) {
8994a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println(':');
89959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    token.dump(pw, "    ");
8996a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                } else {
8997a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
89989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
89999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9000a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9001a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.println();
9002a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mOpeningApps.size() > 0) {
9003a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print("  mOpeningApps="); pw.println(mOpeningApps);
9004a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9005a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mClosingApps.size() > 0) {
9006a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print("  mClosingApps="); pw.println(mClosingApps);
9007a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9008a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mToTopApps.size() > 0) {
9009a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print("  mToTopApps="); pw.println(mToTopApps);
9010a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9011a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mToBottomApps.size() > 0) {
9012a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print("  mToBottomApps="); pw.println(mToBottomApps);
9013a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9014a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    }
9015a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
9016a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    void dumpSessionsLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll) {
9017a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.println("WINDOW MANAGER SESSIONS (dumpsys window sessions)");
9018a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mSessions.size() > 0) {
9019a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            Iterator<Session> it = mSessions.iterator();
9020a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            while (it.hasNext()) {
9021a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                Session s = it.next();
9022a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print("  Session "); pw.print(s); pw.println(':');
9023a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                s.dump(pw, "    ");
9024a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
9025a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9026a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    }
9027a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
9028a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    void dumpWindowsLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll,
9029a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            ArrayList<WindowState> windows) {
9030a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.println("WINDOW MANAGER WINDOWS (dumpsys window windows)");
9031a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        for (int i=mWindows.size()-1; i>=0; i--) {
9032a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            WindowState w = mWindows.get(i);
9033a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (windows == null || windows.contains(w)) {
9034a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print("  Window #"); pw.print(i); pw.print(' ');
9035a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.print(w); pw.println(":");
9036a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                w.dump(pw, "    ", dumpAll);
9037a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
9038a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9039a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mInputMethodDialogs.size() > 0) {
9040a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
9041a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  Input method dialogs:");
9042a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            for (int i=mInputMethodDialogs.size()-1; i>=0; i--) {
9043a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                WindowState w = mInputMethodDialogs.get(i);
9044a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (windows == null || windows.contains(w)) {
9045a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print("  IM Dialog #"); pw.print(i); pw.print(": "); pw.println(w);
90464c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
90474c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
9048a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9049a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mPendingRemove.size() > 0) {
9050a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
9051a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  Remove pending for:");
9052a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            for (int i=mPendingRemove.size()-1; i>=0; i--) {
9053a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                WindowState w = mPendingRemove.get(i);
9054a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (windows == null || windows.contains(w)) {
9055a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print("  Remove #"); pw.print(i); pw.print(' ');
9056a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                            pw.print(w);
9057a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    if (dumpAll) {
9058a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.println(":");
9059a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        w.dump(pw, "    ", true);
9060a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    } else {
9061a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.println();
9062a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    }
90639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
90649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9065a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9066a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mForceRemoves != null && mForceRemoves.size() > 0) {
9067a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
9068a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  Windows force removing:");
9069a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            for (int i=mForceRemoves.size()-1; i>=0; i--) {
9070a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                WindowState w = mForceRemoves.get(i);
9071a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print("  Removing #"); pw.print(i); pw.print(' ');
9072a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.print(w);
9073a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (dumpAll) {
9074a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println(":");
9075a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    w.dump(pw, "    ", true);
9076a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                } else {
9077a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
90789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
90799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9080a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9081a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mDestroySurface.size() > 0) {
9082a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
9083a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  Windows waiting to destroy their surface:");
9084a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            for (int i=mDestroySurface.size()-1; i>=0; i--) {
9085a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                WindowState w = mDestroySurface.get(i);
9086a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (windows == null || windows.contains(w)) {
9087a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print("  Destroy #"); pw.print(i); pw.print(' ');
9088a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                            pw.print(w);
9089a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    if (dumpAll) {
9090a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.println(":");
9091a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        w.dump(pw, "    ", true);
9092a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    } else {
9093a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.println();
9094a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    }
90959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
90969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9097a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9098a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mLosingFocus.size() > 0) {
9099a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
9100a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  Windows losing focus:");
9101a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            for (int i=mLosingFocus.size()-1; i>=0; i--) {
9102a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                WindowState w = mLosingFocus.get(i);
9103a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (windows == null || windows.contains(w)) {
9104a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print("  Losing #"); pw.print(i); pw.print(' ');
9105a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                            pw.print(w);
9106a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    if (dumpAll) {
9107a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.println(":");
9108a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        w.dump(pw, "    ", true);
9109a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    } else {
9110a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.println();
9111a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    }
9112a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                }
9113a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
9114a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9115a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mResizingWindows.size() > 0) {
9116a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
9117a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  Windows waiting to resize:");
9118a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            for (int i=mResizingWindows.size()-1; i>=0; i--) {
9119a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                WindowState w = mResizingWindows.get(i);
9120a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (windows == null || windows.contains(w)) {
9121a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print("  Resizing #"); pw.print(i); pw.print(' ');
9122a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                            pw.print(w);
9123a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    if (dumpAll) {
9124a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.println(":");
9125a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        w.dump(pw, "    ", true);
9126a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    } else {
9127a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.println();
9128a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    }
91299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
91309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9131a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9132a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.println();
9133a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mDisplay != null) {
9134a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print("  Display: init="); pw.print(mInitialDisplayWidth); pw.print("x");
9135a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(mInitialDisplayHeight); pw.print(" base=");
9136a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(mBaseDisplayWidth); pw.print("x"); pw.print(mBaseDisplayHeight);
9137a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" cur=");
9138a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(mCurDisplayWidth); pw.print("x"); pw.print(mCurDisplayHeight);
9139a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" app=");
9140a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(mAppDisplayWidth); pw.print("x"); pw.print(mAppDisplayHeight);
9141a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" raw="); pw.print(mDisplay.getRawWidth());
9142a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print("x"); pw.println(mDisplay.getRawHeight());
9143a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        } else {
9144a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  NO DISPLAY");
9145a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9146a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.print("  mCurConfiguration="); pw.println(this.mCurConfiguration);
9147a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.print("  mCurrentFocus="); pw.println(mCurrentFocus);
9148a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mLastFocus != mCurrentFocus) {
91491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mLastFocus="); pw.println(mLastFocus);
9150a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9151a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.print("  mFocusedApp="); pw.println(mFocusedApp);
9152a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mInputMethodTarget != null) {
91531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mInputMethodTarget="); pw.println(mInputMethodTarget);
9154a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9155a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.print("  mInTouchMode="); pw.print(mInTouchMode);
9156a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print(" mLayoutSeq="); pw.println(mLayoutSeq);
9157a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (dumpAll) {
9158a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (mInputMethodWindow != null) {
9159a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print("  mInputMethodWindow="); pw.println(mInputMethodWindow);
9160a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
9161f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            pw.print("  mWallpaperTarget="); pw.println(mWallpaperTarget);
9162284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            if (mLowerWallpaperTarget != null && mUpperWallpaperTarget != null) {
9163284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                pw.print("  mLowerWallpaperTarget="); pw.println(mLowerWallpaperTarget);
9164284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                pw.print("  mUpperWallpaperTarget="); pw.println(mUpperWallpaperTarget);
9165284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            }
91666c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            if (mWindowDetachedWallpaper != null) {
91676c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                pw.print("  mWindowDetachedWallpaper="); pw.println(mWindowDetachedWallpaper);
91686c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            }
9169a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print("  mLastWallpaperX="); pw.print(mLastWallpaperX);
9170a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" mLastWallpaperY="); pw.println(mLastWallpaperY);
9171a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (mInputMethodAnimLayerAdjustment != 0 ||
9172a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    mWallpaperAnimLayerAdjustment != 0) {
9173a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print("  mInputMethodAnimLayerAdjustment=");
9174a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.print(mInputMethodAnimLayerAdjustment);
9175a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.print("  mWallpaperAnimLayerAdjustment=");
9176a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.println(mWallpaperAnimLayerAdjustment);
9177a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
9178de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            if (mWindowAnimationBackgroundSurface != null) {
9179de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                pw.println("  mWindowAnimationBackgroundSurface:");
9180de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                mWindowAnimationBackgroundSurface.printTo("    ", pw);
9181de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            }
91821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mSystemBooted="); pw.print(mSystemBooted);
91831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(" mDisplayEnabled="); pw.println(mDisplayEnabled);
91841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mLayoutNeeded="); pw.print(mLayoutNeeded);
91851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(" mBlurShown="); pw.println(mBlurShown);
91860a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima            if (mDimAnimator != null) {
9187de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                pw.println("  mDimAnimator:");
9188de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                mDimAnimator.printTo("    ", pw);
91890a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima            } else {
9190a2e92266b3f768f74ab7fcb42972a22d6c739b39Dianne Hackborn                pw.println( "  no DimAnimator ");
91910a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima            }
91921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mDisplayFrozen="); pw.print(mDisplayFrozen);
91931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(" mWindowsFreezingScreen="); pw.print(mWindowsFreezingScreen);
9194e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    pw.print(" mAppsFreezingScreen="); pw.print(mAppsFreezingScreen);
9195e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    pw.print(" mWaitingForConfig="); pw.println(mWaitingForConfig);
91961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mRotation="); pw.print(mRotation);
9197dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                    pw.print(" mRequestedRotation="); pw.print(mRequestedRotation);
9198dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                    pw.print(" mAltOrientation="); pw.println(mAltOrientation);
9199bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn            pw.print("  mLastWindowForcedOrientation"); pw.print(mLastWindowForcedOrientation);
9200bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                    pw.print(" mForcedAppOrientation="); pw.println(mForcedAppOrientation);
920189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            pw.print("  mDeferredRotation="); pw.print(mDeferredRotation);
92029d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn                    pw.print(", mDeferredRotationAnimFlags="); pw.println(mDeferredRotationAnimFlags);
92031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mAnimationPending="); pw.print(mAnimationPending);
92041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(" mWindowAnimationScale="); pw.print(mWindowAnimationScale);
92051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(" mTransitionWindowAnimationScale="); pw.println(mTransitionAnimationScale);
92061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mNextAppTransition=0x");
92071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(Integer.toHexString(mNextAppTransition));
92089d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn                    pw.print(" mAppTransitionReady="); pw.println(mAppTransitionReady);
92099d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn            pw.print("  mAppTransitionRunning="); pw.print(mAppTransitionRunning);
92109d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn                    pw.print(" mAppTransitionTimeout="); pw.println( mAppTransitionTimeout);
92113b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if (mNextAppTransitionPackage != null) {
92123b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                pw.print("  mNextAppTransitionPackage=");
92133b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    pw.print(mNextAppTransitionPackage);
92149d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn                    pw.print(" mNextAppTransitionEnter=0x");
92153b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    pw.print(Integer.toHexString(mNextAppTransitionEnter));
92169d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn                    pw.print(" mNextAppTransitionExit=0x");
92173b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    pw.print(Integer.toHexString(mNextAppTransitionExit));
92183b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            }
92191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mStartingIconInTransition="); pw.print(mStartingIconInTransition);
92201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(", mSkipAppTransitionAnimation="); pw.println(mSkipAppTransitionAnimation);
9221a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9222a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    }
9223a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
9224a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    boolean dumpWindows(FileDescriptor fd, PrintWriter pw, String name, String[] args,
9225a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            int opti, boolean dumpAll) {
9226a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        ArrayList<WindowState> windows = new ArrayList<WindowState>();
9227a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if ("visible".equals(name)) {
9228a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            synchronized(mWindowMap) {
9229a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                for (int i=mWindows.size()-1; i>=0; i--) {
9230a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    WindowState w = mWindows.get(i);
9231a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    if (w.mSurfaceShown) {
9232a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        windows.add(w);
9233a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    }
9234a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                }
92351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
9236a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        } else {
9237a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            int objectId = 0;
9238a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            // See if this is an object ID.
9239a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            try {
9240a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                objectId = Integer.parseInt(name, 16);
9241a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                name = null;
9242a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            } catch (RuntimeException e) {
92431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
9244a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            synchronized(mWindowMap) {
9245a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                for (int i=mWindows.size()-1; i>=0; i--) {
9246a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    WindowState w = mWindows.get(i);
9247a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    if (name != null) {
9248a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        if (w.mAttrs.getTitle().toString().contains(name)) {
9249a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                            windows.add(w);
9250a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        }
9251a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    } else if (System.identityHashCode(w) == objectId) {
9252a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        windows.add(w);
9253a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    }
9254a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                }
9255a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
9256a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9257a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
9258a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (windows.size() <= 0) {
9259a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            return false;
9260a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9261a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
9262a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        synchronized(mWindowMap) {
9263a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            dumpWindowsLocked(fd, pw, dumpAll, windows);
9264a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9265a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        return true;
9266a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    }
9267a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
9268a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    @Override
9269a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
9270a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mContext.checkCallingOrSelfPermission("android.permission.DUMP")
9271a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                != PackageManager.PERMISSION_GRANTED) {
9272a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("Permission Denial: can't dump WindowManager from from pid="
9273a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    + Binder.getCallingPid()
9274a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    + ", uid=" + Binder.getCallingUid());
9275a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            return;
9276a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9277a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
9278a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        boolean dumpAll = false;
9279a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
9280a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        int opti = 0;
9281a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        while (opti < args.length) {
9282a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            String opt = args[opti];
9283a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (opt == null || opt.length() <= 0 || opt.charAt(0) != '-') {
9284a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                break;
9285a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
9286a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            opti++;
9287a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if ("-a".equals(opt)) {
9288a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                dumpAll = true;
9289a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            } else if ("-h".equals(opt)) {
9290a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("Window manager dump options:");
9291a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("  [-a] [-h] [cmd] ...");
9292a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("  cmd may be one of:");
9293a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("    i[input]: input subsystem state");
9294a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("    p[policy]: policy state");
9295a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("    s[essions]: active sessions");
9296a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("    t[okens]: token list");
9297a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("    w[indows]: window list");
9298a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("  cmd may also be a NAME to dump windows.  NAME may");
9299a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("    be a partial substring in a window name, a");
9300a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("    Window hex object identifier, or");
9301a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("    \"all\" for all windows, or");
9302a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("    \"visible\" for the visible windows.");
9303a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("  -a: include all available server state.");
9304a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                return;
930587fc30828209afa25be69ac7053241f4eaeb3378Dianne Hackborn            } else {
9306a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("Unknown argument: " + opt + "; use -h for help");
9307a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
9308a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9309a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
9310a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        // Is the caller requesting to dump a particular piece of data?
9311a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (opti < args.length) {
9312a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            String cmd = args[opti];
9313a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            opti++;
9314a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if ("input".equals(cmd) || "i".equals(cmd)) {
9315a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                dumpInput(fd, pw, true);
9316a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                return;
9317a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            } else if ("policy".equals(cmd) || "p".equals(cmd)) {
9318a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                synchronized(mWindowMap) {
9319a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    dumpPolicyLocked(fd, pw, args, true);
9320a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                }
9321a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                return;
9322a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            } else if ("sessions".equals(cmd) || "s".equals(cmd)) {
9323a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                synchronized(mWindowMap) {
9324a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    dumpSessionsLocked(fd, pw, true);
9325a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                }
9326a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                return;
9327a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            } else if ("tokens".equals(cmd) || "t".equals(cmd)) {
9328a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                synchronized(mWindowMap) {
9329a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    dumpTokensLocked(fd, pw, true);
9330a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                }
9331a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                return;
9332a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            } else if ("windows".equals(cmd) || "w".equals(cmd)) {
9333a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                synchronized(mWindowMap) {
9334a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    dumpWindowsLocked(fd, pw, true, null);
9335a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                }
9336a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                return;
9337a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            } else if ("all".equals(cmd) || "a".equals(cmd)) {
9338a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                synchronized(mWindowMap) {
9339a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    dumpWindowsLocked(fd, pw, true, null);
9340a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                }
9341a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                return;
9342a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            } else {
9343a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                // Dumping a single name?
9344a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (!dumpWindows(fd, pw, cmd, args, opti, dumpAll)) {
9345a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println("Bad window command, or no windows match: " + cmd);
9346a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println("Use -h for help.");
9347a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                }
9348a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                return;
9349a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
9350a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9351a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
9352a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        dumpInput(fd, pw, dumpAll);
9353a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
9354a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        synchronized(mWindowMap) {
9355a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (dumpAll) {
9356a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("-------------------------------------------------------------------------------");
9357a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
9358a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            dumpPolicyLocked(fd, pw, args, dumpAll);
9359a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
9360a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (dumpAll) {
9361a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("-------------------------------------------------------------------------------");
9362a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
9363a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            dumpSessionsLocked(fd, pw, dumpAll);
9364a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
9365a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (dumpAll) {
9366a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("-------------------------------------------------------------------------------");
9367a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
9368a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            dumpTokensLocked(fd, pw, dumpAll);
9369a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
9370a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (dumpAll) {
9371a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("-------------------------------------------------------------------------------");
937287fc30828209afa25be69ac7053241f4eaeb3378Dianne Hackborn            }
9373a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            dumpWindowsLocked(fd, pw, dumpAll, null);
93749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
93759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
93769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9377349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    // Called by the heartbeat to ensure locks are not held indefnitely (for deadlock detection).
93789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void monitor() {
93799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) { }
9380983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood        synchronized (mKeyguardTokenWatcher) { }
9381ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    }
9382ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
93832992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    public interface OnHardKeyboardStatusChangeListener {
93842992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        public void onHardKeyboardStatusChange(boolean available, boolean enabled);
93852992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
93869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
9387