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;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
57284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Millerimport android.content.Intent;
58284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Millerimport android.content.IntentFilter;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ActivityInfo;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager;
611ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshimaimport android.content.res.CompatibilityInfo;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Configuration;
630aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackbornimport android.graphics.Bitmap;
64fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackbornimport android.graphics.Canvas;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Matrix;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PixelFormat;
6744bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackbornimport android.graphics.Point;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Region;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.BatteryStats;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
727580493b014a2c7ea883cd291255798dc72ebbffDianne Hackbornimport android.os.Bundle;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Debug;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
7638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackbornimport android.os.IRemoteCallback;
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;
9538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackbornimport android.util.Pair;
968a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseIntArray;
98fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackbornimport android.util.TypedValue;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Display;
100dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powellimport android.view.Gravity;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IApplicationToken;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IOnKeyguardExitResult;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IRotationWatcher;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindow;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindowManager;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindowSession;
10746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport android.view.InputChannel;
108c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brownimport android.view.InputDevice;
109bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brownimport android.view.InputEvent;
110a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tateimport android.view.InputHandler;
111a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tateimport android.view.InputQueue;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Surface;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SurfaceSession;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerImpl;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerPolicy;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager.LayoutParams;
121df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackbornimport android.view.WindowManagerPolicy.FakeWindow;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Animation;
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.AnimationUtils;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Transformation;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.BufferedWriter;
127b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackbornimport java.io.DataInputStream;
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
130b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackbornimport java.io.FileInputStream;
131b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackbornimport java.io.FileNotFoundException;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStream;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStreamWriter;
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.StringWriter;
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.Socket;
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashSet;
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator;
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** {@hide} */
145ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackbornpublic class WindowManagerService extends IWindowManager.Stub
146df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn        implements Watchdog.Monitor, WindowManagerPolicy.WindowManagerFuncs {
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final String TAG = "WindowManager";
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG = false;
149f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn    static final boolean DEBUG_ADD_REMOVE = false;
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_FOCUS = false;
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_ANIM = false;
1529b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn    static final boolean DEBUG_LAYOUT = false;
153ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn    static final boolean DEBUG_RESIZE = false;
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_LAYERS = false;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_INPUT = false;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_INPUT_METHOD = false;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_VISIBILITY = false;
158bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn    static final boolean DEBUG_WINDOW_MOVEMENT = false;
159f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn    static final boolean DEBUG_TOKEN_MOVEMENT = false;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_ORIENTATION = false;
161bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn    static final boolean DEBUG_APP_ORIENTATION = false;
162694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn    static final boolean DEBUG_CONFIGURATION = false;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_APP_TRANSITIONS = false;
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_STARTING_WINDOW = false;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_REORDER = false;
1667341d7a104b47996445d069a695e155a07184606Dianne Hackborn    static final boolean DEBUG_WALLPAPER = false;
167994ef9296a00523de1df424b4b760b4416ead58bChristopher Tate    static final boolean DEBUG_DRAG = false;
16829aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn    static final boolean DEBUG_SCREEN_ON = false;
169cfb9f2bca39772aecd072e2a30342a67b6319bbbDianne Hackborn    static final boolean DEBUG_SCREENSHOT = false;
17038cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn    static final boolean DEBUG_BOOT = false;
1715fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    static final boolean SHOW_SURFACE_ALLOC = false;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean SHOW_TRANSACTIONS = false;
17336991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn    static final boolean SHOW_LIGHT_TRANSACTIONS = false || SHOW_TRANSACTIONS;
1749bfb707597898f54722460b48588007b682f3e2aDianne Hackborn    static final boolean HIDE_STACK_CRAWLS = true;
17553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean PROFILE_ORIENTATION = false;
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean BLUR = true;
178cfe6524071624b6679e5fa4db847328e8d0317c8Dave Bort    static final boolean localLOGV = DEBUG;
17906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** How much to multiply the policy's type layer, to reserve room
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for multiple windows of the same type and Z-ordering adjustment
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with TYPE_LAYER_OFFSET. */
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int TYPE_LAYER_MULTIPLIER = 10000;
18406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Offset from TYPE_LAYER_MULTIPLIER for moving a group of windows above
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or below others in the same layer. */
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int TYPE_LAYER_OFFSET = 1000;
18806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** How much to increment the layer for each window, to reserve room
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for effect surfaces between them.
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int WINDOW_LAYER_MULTIPLIER = 5;
19306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
194de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn    /**
195de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn     * Dim surface layer is immediately below target window.
196de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn     */
197de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn    static final int LAYER_OFFSET_DIM = 1;
198de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn
199de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn    /**
200de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn     * Blur surface layer is immediately below dim layer.
201de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn     */
202de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn    static final int LAYER_OFFSET_BLUR = 2;
203de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn
2047916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    /**
2057916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn     * Layer at which to put the rotation freeze snapshot.
2067916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn     */
2077916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    static final int FREEZE_LAYER = (TYPE_LAYER_MULTIPLIER * 200) + 1;
2087916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
2097916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    /**
2107916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn     * Layer at which to put the mask for emulated screen sizes.
2117916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn     */
2127916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    static final int MASK_LAYER = TYPE_LAYER_MULTIPLIER * 200;
2137916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** The maximum length we will accept for a loaded animation duration:
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this is 10 seconds.
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int MAX_ANIMATION_DURATION = 10*1000;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Amount of time (in milliseconds) to animate the dim surface from one
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value to another, when no window animation is driving it.
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int DEFAULT_DIM_DURATION = 200;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2240a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima    /** Amount of time (in milliseconds) to animate the fade-in-out transition for
2250a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima     * compatible windows.
2260a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima     */
2270a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima    static final int DEFAULT_FADE_IN_OUT_DURATION = 400;
2280a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima
229a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn    /**
230a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * If true, the window manager will do its own custom freezing and general
231a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * management of the screen during rotation.
232a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     */
233a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn    static final boolean CUSTOM_SCREEN_ROTATION = true;
234a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn
2357fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    // Maximum number of milliseconds to wait for input event injection.
2367fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    // FIXME is this value reasonable?
2377fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    private static final int INJECTION_TIMEOUT_MILLIS = 30 * 1000;
238b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown
239b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown    // Maximum number of milliseconds to wait for input devices to be enumerated before
240b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown    // proceding with safe mode detection.
241b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown    private static final int INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS = 1000;
24228637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller
243349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    // Default input dispatching timeout in nanoseconds.
2446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    static final long DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS = 5000 * 1000000L;
24506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int UPDATE_FOCUS_NORMAL = 0;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int UPDATE_FOCUS_WILL_ASSIGN_LAYERS = 1;
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int UPDATE_FOCUS_PLACING_SURFACES = 2;
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int UPDATE_FOCUS_WILL_PLACE_SURFACES = 3;
25006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String SYSTEM_SECURE = "ro.secure";
25206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy    private static final String SYSTEM_DEBUGGABLE = "ro.debuggable";
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Condition waited on by {@link #reenableKeyguard} to know the call to
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the window policy has finished.
257983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood     * This is set to true only if mKeyguardTokenWatcher.acquired() has
258983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood     * actually disabled the keyguard.
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
260983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood    private boolean mKeyguardDisabled = false;
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
262284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    private static final int ALLOW_DISABLE_YES = 1;
263284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    private static final int ALLOW_DISABLE_NO = 0;
264284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    private static final int ALLOW_DISABLE_UNKNOWN = -1; // check with DevicePolicyManager
265284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    private int mAllowDisableKeyguard = ALLOW_DISABLE_UNKNOWN; // sync'd by mKeyguardTokenWatcher
266284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller
267983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood    final TokenWatcher mKeyguardTokenWatcher = new TokenWatcher(
268983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood            new Handler(), "WindowManagerService.mKeyguardTokenWatcher") {
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void acquired() {
270284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            if (shouldAllowDisableKeyguard()) {
271284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                mPolicy.enableKeyguard(false);
272284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                mKeyguardDisabled = true;
273284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            } else {
274284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                Log.v(TAG, "Not disabling keyguard since device policy is enforced");
275284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            }
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void released() {
278a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn            mPolicy.enableKeyguard(true);
279983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood            synchronized (mKeyguardTokenWatcher) {
280983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood                mKeyguardDisabled = false;
281983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood                mKeyguardTokenWatcher.notifyAll();
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
286284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
287284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        @Override
288284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        public void onReceive(Context context, Intent intent) {
289284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            mPolicy.enableKeyguard(true);
290284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            synchronized(mKeyguardTokenWatcher) {
291284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // lazily evaluate this next time we're asked to disable keyguard
292284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                mAllowDisableKeyguard = ALLOW_DISABLE_UNKNOWN;
293284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                mKeyguardDisabled = false;
294284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            }
295284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        }
296284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    };
297284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Context mContext;
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final boolean mHaveInputMethods;
30106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
30258f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn    final boolean mAllowBootMessages;
30358f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final boolean mLimitedAlphaCompositing;
30506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final WindowManagerPolicy mPolicy = PolicyManager.makeNewWindowManager();
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final IActivityManager mActivityManager;
30906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final IBatteryStats mBatteryStats;
31106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * All currently active sessions with clients.
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final HashSet<Session> mSessions = new HashSet<Session>();
31606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Mapping from an IWindow IBinder to the server's Window object.
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is also used as the lock for all of our state.
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final HashMap<IBinder, WindowState> mWindowMap = new HashMap<IBinder, WindowState>();
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Mapping from a token IBinder to a WindowToken object.
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final HashMap<IBinder, WindowToken> mTokenMap =
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            new HashMap<IBinder, WindowToken>();
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Window tokens that are in the process of exiting, but still
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on screen for animations.
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<WindowToken> mExitingTokens = new ArrayList<WindowToken>();
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Z-ordered (bottom-most first) list of all application tokens, for
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * controlling the ordering of windows in different applications.  This
338f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn     * contains AppWindowToken objects.
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<AppWindowToken> mAppTokens = new ArrayList<AppWindowToken>();
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Application tokens that are in the process of exiting, but still
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on screen for animations.
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<AppWindowToken> mExitingAppTokens = new ArrayList<AppWindowToken>();
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * List of window tokens that have finished starting their application,
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and now need to have the policy remove their windows.
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<AppWindowToken> mFinishedStarting = new ArrayList<AppWindowToken>();
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Z-ordered (bottom-most first) list of all Window objects.
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
357e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    final ArrayList<WindowState> mWindows = new ArrayList<WindowState>();
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
360df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn     * Fake windows added to the window manager.  Note: ordered from top to
361df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn     * bottom, opposite of mWindows.
362df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn     */
363df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn    final ArrayList<FakeWindowImpl> mFakeWindows = new ArrayList<FakeWindowImpl>();
364df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn
365df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn    /**
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Windows that are being resized.  Used so we can tell the client about
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the resize after closing the transaction in which we resized the
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * underlying surface.
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<WindowState> mResizingWindows = new ArrayList<WindowState>();
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Windows whose animations have ended and now must be removed.
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<WindowState> mPendingRemove = new ArrayList<WindowState>();
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
378f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn     * Used when processing mPendingRemove to avoid working on the original array.
379f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn     */
380f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn    WindowState[] mPendingRemoveTmp = new WindowState[20];
381f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn
382f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn    /**
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Windows whose surface should be destroyed.
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<WindowState> mDestroySurface = new ArrayList<WindowState>();
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Windows that have lost input focus and are waiting for the new
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focus window to be displayed before they are told about this.
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ArrayList<WindowState> mLosingFocus = new ArrayList<WindowState>();
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is set when we have run out of memory, and will either be an empty
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * list or contain windows that need to be force removed.
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ArrayList<WindowState> mForceRemoves;
39806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
399f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn    /**
40038e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn     * Windows that clients are waiting to have drawn.
40138e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn     */
40238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn    ArrayList<Pair<WindowState, IRemoteCallback>> mWaitingForDrawn
40338e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn            = new ArrayList<Pair<WindowState, IRemoteCallback>>();
40438e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn
40538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn    /**
406f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn     * Used when rebuilding window list to keep track of windows that have
407f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn     * been removed.
408f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn     */
409f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn    WindowState[] mRebuildTmp = new WindowState[20];
410f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    IInputMethodManager mInputMethodManager;
41206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SurfaceSession mFxSession;
4140a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima    private DimAnimator mDimAnimator = null;
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Surface mBlurSurface;
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mBlurShown;
417fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn    Watermark mWatermark;
4186804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    StrictModeFlash mStrictModeFlash;
419a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn    ScreenRotationAnimation mScreenRotationAnimation;
42006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4217916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    BlackFrame mBlackFrame;
4227916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mTransactionSequence = 0;
42406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final float[] mTmpFloats = new float[9];
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mSafeMode;
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mDisplayEnabled = false;
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mSystemBooted = false;
43029aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn    boolean mForceDisplayEnabled = false;
431661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn    boolean mShowingBootMessages = false;
4321fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn
4331fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn    // This protects the following display size properties, so that
4341fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn    // getDisplaySize() doesn't need to acquire the global lock.  This is
4351fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn    // needed because the window manager sometimes needs to use ActivityThread
4361fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn    // while it has its global state locked (for example to load animation
4371fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn    // resources), but the ActivityThread also needs get the current display
4381fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn    // size sometimes when it has its package lock held.
4391fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn    //
4401fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn    // These will only be modified with both mWindowMap and mDisplaySizeLock
4411fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn    // held (in that order) so the window manager doesn't need to acquire this
4421fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn    // lock when needing these values in its normal operation.
4431fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn    final Object mDisplaySizeLock = new Object();
444b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate    int mInitialDisplayWidth = 0;
445b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate    int mInitialDisplayHeight = 0;
4467916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    int mBaseDisplayWidth = 0;
4477916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    int mBaseDisplayHeight = 0;
44844bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn    int mCurDisplayWidth = 0;
44944bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn    int mCurDisplayHeight = 0;
45081e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn    int mAppDisplayWidth = 0;
45181e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn    int mAppDisplayHeight = 0;
4521fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mRotation = 0;
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mForcedAppOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
455dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn    boolean mAltOrientation = false;
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ArrayList<IRotationWatcher> mRotationWatchers
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new ArrayList<IRotationWatcher>();
45801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown    int mDeferredRotationPauseCount;
45906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mLayoutNeeded = true;
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAnimationPending = false;
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mDisplayFrozen = false;
463e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    boolean mWaitingForConfig = false;
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mWindowsFreezingScreen = false;
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mAppsFreezingScreen = 0;
466bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn    int mLastWindowForcedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
468e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    int mLayoutSeq = 0;
469df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn
470df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn    int mLastStatusBarVisibility = 0;
471df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn
472b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn    // State while inside of layoutAndPlaceSurfacesLocked().
473b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn    boolean mFocusMayChange;
474b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn
475e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    Configuration mCurConfiguration = new Configuration();
476e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // This is held as long as we have the screen frozen, to give us time to
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // perform a rotation animation when turning off shows the lock screen which
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // changes the orientation.
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PowerManager.WakeLock mScreenFrozenLock;
48106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // State management of app transitions.  When we are preparing for a
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // transition, mNextAppTransition will be the kind of transition to
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // perform or TRANSIT_NONE if we are not waiting.  If we are waiting,
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // mOpeningApps and mClosingApps are the lists of tokens that will be
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // made visible or hidden at the next transition.
487bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn    int mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET;
4883b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    String mNextAppTransitionPackage;
4893b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    int mNextAppTransitionEnter;
4903b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    int mNextAppTransitionExit;
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAppTransitionReady = false;
492a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    boolean mAppTransitionRunning = false;
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAppTransitionTimeout = false;
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mStartingIconInTransition = false;
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mSkipAppTransitionAnimation = false;
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<AppWindowToken> mOpeningApps = new ArrayList<AppWindowToken>();
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<AppWindowToken> mClosingApps = new ArrayList<AppWindowToken>();
498a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    final ArrayList<AppWindowToken> mToTopApps = new ArrayList<AppWindowToken>();
499a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    final ArrayList<AppWindowToken> mToBottomApps = new ArrayList<AppWindowToken>();
50006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Display mDisplay;
50206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
5035fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    final DisplayMetrics mDisplayMetrics = new DisplayMetrics();
504bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    final DisplayMetrics mRealDisplayMetrics = new DisplayMetrics();
50548a7651823030ed3c0f4c084b423430044425feaDianne Hackborn    final DisplayMetrics mTmpDisplayMetrics = new DisplayMetrics();
5065fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    final DisplayMetrics mCompatDisplayMetrics = new DisplayMetrics();
5075fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    H mH = new H();
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    WindowState mCurrentFocus = null;
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    WindowState mLastFocus = null;
51206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // This just indicates the window the input method is on top of, not
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // necessarily the window its input is going to.
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    WindowState mInputMethodTarget = null;
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mInputMethodTargetWaitingAnim;
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mInputMethodAnimLayerAdjustment;
51806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    WindowState mInputMethodWindow = null;
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<WindowState> mInputMethodDialogs = new ArrayList<WindowState>();
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5222992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    boolean mHardKeyboardAvailable;
5232992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    boolean mHardKeyboardEnabled;
5242992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    OnHardKeyboardStatusChangeListener mHardKeyboardStatusChangeListener;
5252992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
5264c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    final ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>();
527ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
528759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn    // If non-null, this is the currently visible window that is associated
529759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn    // with the wallpaper.
530759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn    WindowState mWallpaperTarget = null;
5313be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    // If non-null, we are in the middle of animating from one wallpaper target
5323be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    // to another, and this is the lower one in Z-order.
5333be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    WindowState mLowerWallpaperTarget = null;
5343be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    // If non-null, we are in the middle of animating from one wallpaper target
5353be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    // to another, and this is the higher one in Z-order.
5363be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    WindowState mUpperWallpaperTarget = null;
5376c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn    // Window currently running an animation that has requested it be detached
5386c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn    // from the wallpaper.  This means we need to ensure the wallpaper is
5396c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn    // visible behind it in case it animates in a way that would allow it to be
5406c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn    // seen.
5416c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn    WindowState mWindowDetachedWallpaper = null;
542de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn    DimSurface mWindowAnimationBackgroundSurface = null;
543759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn    int mWallpaperAnimLayerAdjustment;
54473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn    float mLastWallpaperX = -1;
54573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn    float mLastWallpaperY = -1;
546bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen    float mLastWallpaperXStep = -1;
547bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen    float mLastWallpaperYStep = -1;
54819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    // This is set when we are waiting for a wallpaper to tell us it is done
54919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    // changing its scroll position.
55019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    WindowState mWaitingOnWallpaper;
55119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    // The last time we had a timeout when waiting for a wallpaper.
55219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    long mLastWallpaperTimeoutTime;
55319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    // We give a wallpaper up to 150ms to finish scrolling.
55419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    static final long WALLPAPER_TIMEOUT = 150;
55519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    // Time we wait after a timeout before trying to wait again.
55619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    static final long WALLPAPER_TIMEOUT_RECOVERY = 10000;
557ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AppWindowToken mFocusedApp = null;
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PowerManagerService mPowerManager;
56106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float mWindowAnimationScale = 1.0f;
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float mTransitionAnimationScale = 1.0f;
56406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
56546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    final InputManager mInputManager;
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Who is holding the screen on.
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Session mHoldingScreenOn;
56946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    PowerManager.WakeLock mHoldingScreenWakeLock;
57006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
57193e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    boolean mTurnOnScreen;
572ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
573a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    DragState mDragState = null;
5746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final InputHandler mDragInputHandler = new BaseInputHandler() {
575a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        @Override
5763915bb845b032dc184dba5e60970b803390ca3edJeff Brown        public void handleMotion(MotionEvent event, InputQueue.FinishedCallback finishedCallback) {
5773915bb845b032dc184dba5e60970b803390ca3edJeff Brown            boolean handled = false;
578a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            try {
5793915bb845b032dc184dba5e60970b803390ca3edJeff Brown                if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0
5803915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        && mDragState != null) {
5813915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    boolean endDrag = false;
5823915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    final float newX = event.getRawX();
5833915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    final float newY = event.getRawY();
5843915bb845b032dc184dba5e60970b803390ca3edJeff Brown
585a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    switch (event.getAction()) {
586a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    case MotionEvent.ACTION_DOWN: {
587a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (DEBUG_DRAG) {
588a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                            Slog.w(TAG, "Unexpected ACTION_DOWN in drag layer");
589a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        }
590a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    } break;
591a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
592a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    case MotionEvent.ACTION_MOVE: {
593a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        synchronized (mWindowMap) {
5942c095f367779ef32130c72849936a2e3013c8492Christopher Tate                            // move the surface and tell the involved window(s) where we are
595a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                            mDragState.notifyMoveLw(newX, newY);
596a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        }
597a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    } break;
598a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
599a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    case MotionEvent.ACTION_UP: {
600a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (DEBUG_DRAG) Slog.d(TAG, "Got UP on move channel; dropping at "
601a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                                + newX + "," + newY);
602a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        synchronized (mWindowMap) {
603d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                            endDrag = mDragState.notifyDropLw(newX, newY);
604a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        }
605a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    } break;
606a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
607a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    case MotionEvent.ACTION_CANCEL: {
608a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (DEBUG_DRAG) Slog.d(TAG, "Drag cancelled!");
609a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        endDrag = true;
610a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    } break;
611a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
612a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
613a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    if (endDrag) {
614a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (DEBUG_DRAG) Slog.d(TAG, "Drag ended; tearing down state");
615a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        // tell all the windows that the drag has ended
6165994359f3009a3ebfbd37d82bb9a665e9b947851Chris Tate                        synchronized (mWindowMap) {
617d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                            mDragState.endDragLw();
6185994359f3009a3ebfbd37d82bb9a665e9b947851Chris Tate                        }
619a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
6203915bb845b032dc184dba5e60970b803390ca3edJeff Brown
6213915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    handled = true;
622a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                }
623a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            } catch (Exception e) {
624a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                Slog.e(TAG, "Exception caught by drag handleMotion", e);
625a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            } finally {
6263915bb845b032dc184dba5e60970b803390ca3edJeff Brown                finishedCallback.finished(handled);
627a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            }
628a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        }
629a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    };
630a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
631a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    /**
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Whether the UI is currently running in touch mode (not showing
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * navigational focus because the user is directly pressing the screen).
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
635e99adc70c8e0a64cb8d13a2ec4c125adaf18904dMichael Jurka    boolean mInTouchMode = true;
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ViewServer mViewServer;
638dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    private ArrayList<WindowChangeListener> mWindowChangeListeners =
639dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        new ArrayList<WindowChangeListener>();
640dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    private boolean mWindowsChanged = false;
641dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev
642dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    public interface WindowChangeListener {
643dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        public void windowsChanged();
6446e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        public void focusChanged();
645dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    }
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
647c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn    final Configuration mTempConfiguration = new Configuration();
6481ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
6492f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn    // The desired scaling factor for compatible apps.
650e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    float mCompatibleScreenScale;
6511ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static WindowManagerService main(Context context,
65358f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn            PowerManagerService pm, boolean haveInputMethods, boolean allowBootMsgs) {
65458f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        WMThread thr = new WMThread(context, pm, haveInputMethods, allowBootMsgs);
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thr.start();
65606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (thr) {
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (thr.mService == null) {
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    thr.wait();
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (InterruptedException e) {
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
66406e57b5d46c87e9dd7bca1386b63b3a8522f51efJozef BABJAK            return thr.mService;
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
66706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class WMThread extends Thread {
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowManagerService mService;
67006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Context mContext;
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final PowerManagerService mPM;
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final boolean mHaveInputMethods;
67458f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        private final boolean mAllowBootMessages;
67506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public WMThread(Context context, PowerManagerService pm,
67758f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn                boolean haveInputMethods, boolean allowBootMsgs) {
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super("WindowManager");
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mContext = context;
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPM = pm;
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHaveInputMethods = haveInputMethods;
68258f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn            mAllowBootMessages = allowBootMsgs;
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
68406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void run() {
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Looper.prepare();
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowManagerService s = new WindowManagerService(mContext, mPM,
68858f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn                    mHaveInputMethods, mAllowBootMessages);
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            android.os.Process.setThreadPriority(
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    android.os.Process.THREAD_PRIORITY_DISPLAY);
691160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate            android.os.Process.setCanSelfBackground(false);
69206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mService = s;
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifyAll();
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
69706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
698ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // For debug builds, log event loop stalls to dropbox for analysis.
699ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            if (StrictMode.conditionallyEnableDebugLogging()) {
700ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick                Slog.i(TAG, "Enabled StrictMode logging for WMThread's Looper");
701ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            }
702ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Looper.loop();
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class PolicyThread extends Thread {
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final WindowManagerPolicy mPolicy;
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final WindowManagerService mService;
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Context mContext;
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final PowerManagerService mPM;
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean mRunning = false;
71306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PolicyThread(WindowManagerPolicy policy,
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowManagerService service, Context context,
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PowerManagerService pm) {
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super("WindowManagerPolicy");
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPolicy = policy;
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mService = service;
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mContext = context;
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPM = pm;
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
72306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void run() {
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Looper.prepare();
726ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn            WindowManagerPolicyThread.set(this, Looper.myLooper());
727ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Looper.myLooper().setMessageLogging(new LogPrinter(
7298a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            //        Log.VERBOSE, "WindowManagerPolicy", Log.LOG_ID_SYSTEM));
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            android.os.Process.setThreadPriority(
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    android.os.Process.THREAD_PRIORITY_FOREGROUND);
732160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate            android.os.Process.setCanSelfBackground(false);
733df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            mPolicy.init(mContext, mService, mService, mPM);
73406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRunning = true;
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifyAll();
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
73906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
740ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // For debug builds, log event loop stalls to dropbox for analysis.
741ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            if (StrictMode.conditionallyEnableDebugLogging()) {
742ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick                Slog.i(TAG, "Enabled StrictMode for PolicyThread's Looper");
743ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            }
744ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Looper.loop();
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowManagerService(Context context, PowerManagerService pm,
75058f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn            boolean haveInputMethods, boolean showBootMsgs) {
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHaveInputMethods = haveInputMethods;
75358f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn        mAllowBootMessages = showBootMsgs;
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLimitedAlphaCompositing = context.getResources().getBoolean(
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.bool.config_sf_limitedAlpha);
75606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPowerManager = pm;
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPowerManager.setPolicy(mPolicy);
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PowerManager pmc = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenFrozenLock = pmc.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SCREEN_FROZEN");
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenFrozenLock.setReferenceCounted(false);
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mActivityManager = ActivityManagerNative.getDefault();
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryStats = BatteryStatsService.getService();
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Get persisted window scale setting
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowAnimationScale = Settings.System.getFloat(context.getContentResolver(),
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Settings.System.WINDOW_ANIMATION_SCALE, mWindowAnimationScale);
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTransitionAnimationScale = Settings.System.getFloat(context.getContentResolver(),
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Settings.System.TRANSITION_ANIMATION_SCALE, mTransitionAnimationScale);
77206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
773284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        // Track changes to DevicePolicyManager state so we can enable/disable keyguard.
774284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        IntentFilter filter = new IntentFilter();
775284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
776284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        mContext.registerReceiver(mBroadcastReceiver, filter);
777284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller
77846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mHoldingScreenWakeLock = pmc.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK,
77946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                "KEEP_SCREEN_ON_FLAG");
78046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mHoldingScreenWakeLock.setReferenceCounted(false);
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
782e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        mInputManager = new InputManager(context, this);
78306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PolicyThread thr = new PolicyThread(mPolicy, this, context, pm);
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thr.start();
78606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (thr) {
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (!thr.mRunning) {
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    thr.wait();
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (InterruptedException e) {
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
79506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
79600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        mInputManager.start();
79706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Add ourself to the Watchdog monitors.
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Watchdog.getInstance().addMonitor(this);
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws RemoteException {
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return super.onTransact(code, data, reply, flags);
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // The window manager only throws security exceptions, so let's
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // log all others.
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!(e instanceof SecurityException)) {
8118962028b6e2f4176e6ceded281e584d223e44982Dianne Hackborn                Log.wtf(TAG, "Window Manager Crash", e);
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw e;
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
817e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    private void placeWindowAfter(WindowState pos, WindowState window) {
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int i = mWindows.indexOf(pos);
819f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Adding window " + window + " at "
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + (i+1) + " of " + mWindows.size() + " (after " + pos + ")");
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindows.add(i+1, window);
823dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        mWindowsChanged = true;
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
826e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    private void placeWindowBefore(WindowState pos, WindowState window) {
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int i = mWindows.indexOf(pos);
828f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Adding window " + window + " at "
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + i + " of " + mWindows.size() + " (before " + pos + ")");
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindows.add(i, window);
832dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        mWindowsChanged = true;
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //This method finds out the index of a window that has the same app token as
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //win. used for z ordering the windows in mWindows
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int findIdxBasedOnAppTokens(WindowState win) {
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //use a local variable to cache mWindows
839e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        ArrayList<WindowState> localmWindows = mWindows;
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int jmax = localmWindows.size();
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(jmax == 0) {
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return -1;
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int j = (jmax-1); j >= 0; j--) {
845e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState wentry = localmWindows.get(j);
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(wentry.mAppToken == win.mAppToken) {
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return j;
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
85206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void addWindowToListInOrderLocked(WindowState win, boolean addToToken) {
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final IWindow client = win.mClient;
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final WindowToken token = win.mToken;
856e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        final ArrayList<WindowState> localmWindows = mWindows;
85706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = localmWindows.size();
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final WindowState attached = win.mAttachedWindow;
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i;
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (attached == null) {
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int tokenWindowsPos = token.windows.size();
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token.appWindowToken != null) {
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int index = tokenWindowsPos-1;
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (index >= 0) {
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If this application has existing windows, we
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // simply place the new window on top of them... but
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // keep the starting window on top.
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (win.mAttrs.type == TYPE_BASE_APPLICATION) {
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Base windows go behind everything else.
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        placeWindowBefore(token.windows.get(0), win);
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        tokenWindowsPos = 0;
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        AppWindowToken atoken = win.mAppToken;
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (atoken != null &&
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                token.windows.get(index) == atoken.startingWindow) {
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            placeWindowBefore(token.windows.get(index), win);
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            tokenWindowsPos--;
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int newIdx =  findIdxBasedOnAppTokens(win);
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if(newIdx != -1) {
88206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                                //there is a window above this one associated with the same
88306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                                //apptoken note that the window could be a floating window
88406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                                //that was created later or a window at the top of the list of
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                //windows associated with this token.
886f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) {
887f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                    Slog.v(TAG, "Adding window " + win + " at "
888f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                            + (newIdx+1) + " of " + N);
889f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                }
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                localmWindows.add(newIdx+1, win);
891dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                                mWindowsChanged = true;
89206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                            }
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
8968a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (localLOGV) Slog.v(
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        TAG, "Figuring out where to add app window "
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + client.asBinder() + " (token=" + token + ")");
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Figure out where the window should go, based on the
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // order of applications.
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int NA = mAppTokens.size();
902e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    WindowState pos = null;
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (i=NA-1; i>=0; i--) {
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        AppWindowToken t = mAppTokens.get(i);
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (t == token) {
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            i--;
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            break;
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
909ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
910a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // We haven't reached the token yet; if this token
911a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // is not going to the bottom and has windows, we can
912a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // use it as an anchor for when we do reach the token.
913a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        if (!t.sendingToBottom && t.windows.size() > 0) {
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            pos = t.windows.get(0);
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // We now know the index into the apps.  If we found
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // an app window above, that gives us the position; else
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // we need to look some more.
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (pos != null) {
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Move behind any windows attached to this one.
922e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                        WindowToken atoken = mTokenMap.get(pos.mClient.asBinder());
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (atoken != null) {
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            final int NC = atoken.windows.size();
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (NC > 0) {
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                WindowState bottom = atoken.windows.get(0);
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (bottom.mSubLayer < 0) {
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    pos = bottom;
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        placeWindowBefore(pos, win);
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
934a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // Continue looking down until we find the first
935a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // token that has windows.
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        while (i >= 0) {
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AppWindowToken t = mAppTokens.get(i);
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            final int NW = t.windows.size();
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (NW > 0) {
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pos = t.windows.get(NW-1);
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                break;
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            i--;
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (pos != null) {
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Move in front of any windows attached to this
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // one.
948e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                            WindowToken atoken = mTokenMap.get(pos.mClient.asBinder());
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (atoken != null) {
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                final int NC = atoken.windows.size();
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (NC > 0) {
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    WindowState top = atoken.windows.get(NC-1);
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    if (top.mSubLayer >= 0) {
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        pos = top;
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    }
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            placeWindowAfter(pos, win);
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Just search for the start of this layer.
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            final int myLayer = win.mBaseLayer;
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            for (i=0; i<N; i++) {
963e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                                WindowState w = localmWindows.get(i);
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (w.mBaseLayer > myLayer) {
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    break;
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
968f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) {
969f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                Slog.v(TAG, "Adding window " + win + " at "
970f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                        + i + " of " + N);
971f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            }
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            localmWindows.add(i, win);
973dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                            mWindowsChanged = true;
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Figure out where window should go, based on layer.
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int myLayer = win.mBaseLayer;
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (i=N-1; i>=0; i--) {
981e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    if (localmWindows.get(i).mBaseLayer <= myLayer) {
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        i++;
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (i < 0) i = 0;
987f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(
9889bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                        TAG, "Adding window " + win + " at "
9899bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                        + i + " of " + N);
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                localmWindows.add(i, win);
991dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                mWindowsChanged = true;
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (addToToken) {
994f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token);
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                token.windows.add(tokenWindowsPos, win);
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Figure out this window's ordering relative to the window
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // it is attached to.
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int NA = token.windows.size();
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int sublayer = win.mSubLayer;
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int largestSublayer = Integer.MIN_VALUE;
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowState windowWithLargestSublayer = null;
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (i=0; i<NA; i++) {
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState w = token.windows.get(i);
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int wSublayer = w.mSubLayer;
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wSublayer >= largestSublayer) {
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    largestSublayer = wSublayer;
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    windowWithLargestSublayer = w;
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sublayer < 0) {
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // For negative sublayers, we go below all windows
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // in the same sublayer.
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wSublayer >= sublayer) {
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (addToToken) {
1017f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token);
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            token.windows.add(i, win);
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        placeWindowBefore(
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wSublayer >= 0 ? attached : w, win);
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // For positive sublayers, we go above all windows
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // in the same sublayer.
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wSublayer > sublayer) {
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (addToToken) {
1029f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token);
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            token.windows.add(i, win);
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        placeWindowBefore(w, win);
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (i >= NA) {
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (addToToken) {
1039f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token);
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    token.windows.add(win);
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sublayer < 0) {
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    placeWindowBefore(attached, win);
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    placeWindowAfter(largestSublayer >= 0
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     ? windowWithLargestSublayer
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     : attached,
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     win);
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
105206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (win.mAppToken != null && addToToken) {
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mAppToken.allAppWindows.add(win);
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
105706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static boolean canBeImeTarget(WindowState w) {
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int fl = w.mAttrs.flags
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                & (FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM);
1061e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn        if (fl == 0 || fl == (FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM)
1062e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                || w.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) {
1063e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn            if (DEBUG_INPUT_METHOD) {
1064e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                Slog.i(TAG, "isVisibleOrAdding " + w + ": " + w.isVisibleOrAdding());
1065e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                if (!w.isVisibleOrAdding()) {
1066e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    Slog.i(TAG, "  mSurface=" + w.mSurface + " reportDestroy=" + w.mReportDestroySurface
1067e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            + " relayoutCalled=" + w.mRelayoutCalled + " viewVis=" + w.mViewVisibility
1068e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            + " policyVis=" + w.mPolicyVisibility + " attachHid=" + w.mAttachedHidden
1069e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            + " exiting=" + w.mExiting + " destroying=" + w.mDestroying);
1070e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    if (w.mAppToken != null) {
1071e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        Slog.i(TAG, "  mAppToken.hiddenRequested=" + w.mAppToken.hiddenRequested);
1072e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    }
1073e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                }
1074e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn            }
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return w.isVisibleOrAdding();
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
107906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int findDesiredInputMethodWindowIndexLocked(boolean willMove) {
1081e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        final ArrayList<WindowState> localmWindows = mWindows;
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = localmWindows.size();
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState w = null;
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i = N;
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (i > 0) {
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            i--;
1087e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            w = localmWindows.get(i);
108806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1089e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn            if (DEBUG_INPUT_METHOD && willMove) Slog.i(TAG, "Checking window @" + i
1090e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    + " " + w + " fl=0x" + Integer.toHexString(w.mAttrs.flags));
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (canBeImeTarget(w)) {
10928a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                //Slog.i(TAG, "Putting input method here!");
109306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Yet more tricksyness!  If this window is a "starting"
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // window, we do actually want to be on top of it, but
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // it is not -really- where input will go.  So if the caller
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // is not actually looking to move the IME, look down below
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // for a real window to target...
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!willMove
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && w.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && i > 0) {
1102e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    WindowState wb = localmWindows.get(i-1);
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wb.mAppToken == w.mAppToken && canBeImeTarget(wb)) {
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        i--;
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w = wb;
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
111106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1112e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn        if (DEBUG_INPUT_METHOD && willMove) Slog.v(TAG, "Proposed new IME target: " + w);
1113e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn
11147eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        // Now, a special case -- if the last target's window is in the
11157eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        // process of exiting, and is above the new target, keep on the
11167eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        // last target to avoid flicker.  Consider for example a Dialog with
11177eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        // the IME shown: when the Dialog is dismissed, we want to keep
11187eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        // the IME above it until it is completely gone so it doesn't drop
11197eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        // behind the dialog or its full-screen scrim.
11207eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        if (mInputMethodTarget != null && w != null
11217eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn                && mInputMethodTarget.isDisplayedLw()
11227eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn                && mInputMethodTarget.mExiting) {
11237eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn            if (mInputMethodTarget.mAnimLayer > w.mAnimLayer) {
11247eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn                w = mInputMethodTarget;
11257eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn                i = localmWindows.indexOf(w);
1126e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Current target higher, switching to: " + w);
11277eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn            }
11287eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        }
112906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
11308a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Desired input method target="
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + w + " willMove=" + willMove);
113206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (willMove && w != null) {
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final WindowState curTarget = mInputMethodTarget;
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (curTarget != null && curTarget.mAppToken != null) {
113606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Now some fun for dealing with window animations that
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // modify the Z order.  We need to look at all windows below
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // the current target that are in this app, finding the highest
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // visible one in layering.
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AppWindowToken token = curTarget.mAppToken;
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState highestTarget = null;
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int highestPos = 0;
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (token.animating || token.animation != null) {
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int pos = 0;
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pos = localmWindows.indexOf(curTarget);
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    while (pos >= 0) {
1148e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                        WindowState win = localmWindows.get(pos);
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (win.mAppToken != token) {
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            break;
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!win.mRemoved) {
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (highestTarget == null || win.mAnimLayer >
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    highestTarget.mAnimLayer) {
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                highestTarget = win;
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                highestPos = pos;
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pos--;
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
116206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (highestTarget != null) {
11648a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_INPUT_METHOD) Slog.v(TAG, "mNextAppTransition="
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mNextAppTransition + " " + highestTarget
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " animating=" + highestTarget.isAnimating()
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " layer=" + highestTarget.mAnimLayer
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " new layer=" + w.mAnimLayer);
116906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1170bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                    if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // If we are currently setting up for an animation,
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // hold everything until we can find out what will happen.
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mInputMethodTargetWaitingAnim = true;
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mInputMethodTarget = highestTarget;
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return highestPos + 1;
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (highestTarget.isAnimating() &&
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            highestTarget.mAnimLayer > w.mAnimLayer) {
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // If the window we are currently targeting is involved
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // with an animation, and it is on top of the next target
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // we will be over, then hold off on moving until
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // that is done.
1182e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        mInputMethodTargetWaitingAnim = true;
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mInputMethodTarget = highestTarget;
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return highestPos + 1;
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
118906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
11908a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //Slog.i(TAG, "Placing input method @" + (i+1));
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (w != null) {
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (willMove) {
1193b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (DEBUG_INPUT_METHOD) {
1194b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    RuntimeException e = null;
1195b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (!HIDE_STACK_CRAWLS) {
1196b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        e = new RuntimeException();
1197b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        e.fillInStackTrace();
1198b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
1199b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    Slog.w(TAG, "Moving IM target from "
1200b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + mInputMethodTarget + " to " + w, e);
1201b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                }
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInputMethodTarget = w;
1203e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                mInputMethodTargetWaitingAnim = false;
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (w.mAppToken != null) {
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    setInputMethodAnimLayerAdjustment(w.mAppToken.animLayerAdjustment);
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    setInputMethodAnimLayerAdjustment(0);
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return i+1;
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (willMove) {
1213b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            if (DEBUG_INPUT_METHOD) {
1214b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                RuntimeException e = null;
1215b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (!HIDE_STACK_CRAWLS) {
1216b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    e = new RuntimeException();
1217b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    e.fillInStackTrace();
1218b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                }
1219b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                Slog.w(TAG, "Moving IM target from "
1220b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + mInputMethodTarget + " to null", e);
1221b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            }
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInputMethodTarget = null;
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setInputMethodAnimLayerAdjustment(0);
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
122706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void addInputMethodWindowToListLocked(WindowState win) {
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = findDesiredInputMethodWindowIndexLocked(true);
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pos >= 0) {
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mTargetAppToken = mInputMethodTarget.mAppToken;
1232f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            if (DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(
12339bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    TAG, "Adding input method window " + win + " at " + pos);
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindows.add(pos, win);
1235dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            mWindowsChanged = true;
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            moveInputMethodDialogsLocked(pos+1);
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        win.mTargetAppToken = null;
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        addWindowToListInOrderLocked(win, true);
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        moveInputMethodDialogsLocked(pos);
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
124306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setInputMethodAnimLayerAdjustment(int adj) {
12458a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_LAYERS) Slog.v(TAG, "Setting im layer adj to " + adj);
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInputMethodAnimLayerAdjustment = adj;
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState imw = mInputMethodWindow;
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (imw != null) {
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            imw.mAnimLayer = imw.mLayer + adj;
12508a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + imw
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " anim layer: " + imw.mAnimLayer);
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int wi = imw.mChildWindows.size();
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (wi > 0) {
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wi--;
1255e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState cw = imw.mChildWindows.get(wi);
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cw.mAnimLayer = cw.mLayer + adj;
12578a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + cw
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " anim layer: " + cw.mAnimLayer);
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int di = mInputMethodDialogs.size();
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (di > 0) {
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            di --;
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            imw = mInputMethodDialogs.get(di);
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            imw.mAnimLayer = imw.mLayer + adj;
12668a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + imw
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " anim layer: " + imw.mAnimLayer);
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
127006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int tmpRemoveWindowLocked(int interestingPos, WindowState win) {
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int wpos = mWindows.indexOf(win);
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wpos >= 0) {
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wpos < interestingPos) interestingPos--;
12758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Temp removing at " + wpos + ": " + win);
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindows.remove(wpos);
1277dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            mWindowsChanged = true;
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NC = win.mChildWindows.size();
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (NC > 0) {
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                NC--;
1281e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState cw = win.mChildWindows.get(NC);
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int cpos = mWindows.indexOf(cw);
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (cpos >= 0) {
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (cpos < interestingPos) interestingPos--;
12858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Temp removing child at "
12869bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                            + cpos + ": " + cw);
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mWindows.remove(cpos);
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return interestingPos;
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
129306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void reAddWindowToListInOrderLocked(WindowState win) {
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        addWindowToListInOrderLocked(win, false);
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // This is a hack to get all of the child windows added as well
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // at the right position.  Child windows should be rare and
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this case should be rare, so it shouldn't be that big a deal.
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int wpos = mWindows.indexOf(win);
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wpos >= 0) {
13018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "ReAdd removing from " + wpos
13029bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    + ": " + win);
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindows.remove(wpos);
1304dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            mWindowsChanged = true;
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reAddWindowLocked(wpos, win);
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
130806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void logWindowList(String prefix) {
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int N = mWindows.size();
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (N > 0) {
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            N--;
13138a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.v(TAG, prefix + "#" + N + ": " + mWindows.get(N));
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
131606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void moveInputMethodDialogsLocked(int pos) {
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ArrayList<WindowState> dialogs = mInputMethodDialogs;
131906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = dialogs.size();
13218a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Removing " + N + " dialogs w/pos=" + pos);
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos = tmpRemoveWindowLocked(pos, dialogs.get(i));
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_INPUT_METHOD) {
13268a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.v(TAG, "Window list w/pos=" + pos);
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            logWindowList("  ");
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
132906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pos >= 0) {
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final AppWindowToken targetAppToken = mInputMethodTarget.mAppToken;
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (pos < mWindows.size()) {
1333e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState wp = mWindows.get(pos);
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wp == mInputMethodWindow) {
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pos++;
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Adding " + N + " dialogs at pos=" + pos);
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState win = dialogs.get(i);
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mTargetAppToken = targetAppToken;
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pos = reAddWindowLocked(pos, win);
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_INPUT_METHOD) {
13458a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.v(TAG, "Final window list:");
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                logWindowList("  ");
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowState win = dialogs.get(i);
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mTargetAppToken = null;
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reAddWindowToListInOrderLocked(win);
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_INPUT_METHOD) {
13558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.v(TAG, "No IM target, final list:");
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                logWindowList("  ");
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
136006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean moveInputMethodWindowsIfNeededLocked(boolean needAssignLayers) {
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final WindowState imWin = mInputMethodWindow;
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int DN = mInputMethodDialogs.size();
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (imWin == null && DN == 0) {
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
136706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int imPos = findDesiredInputMethodWindowIndexLocked(true);
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (imPos >= 0) {
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // In this case, the input method windows are to be placed
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // immediately above the window they are targeting.
137206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // First check to see if the input method windows are already
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // located here, and contiguous.
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = mWindows.size();
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowState firstImWin = imPos < N
1377e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    ? mWindows.get(imPos) : null;
137806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Figure out the actual input method window that should be
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // at the bottom of their stack.
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowState baseImWin = imWin != null
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? imWin : mInputMethodDialogs.get(0);
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (baseImWin.mChildWindows.size() > 0) {
1384e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState cw = baseImWin.mChildWindows.get(0);
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (cw.mSubLayer < 0) baseImWin = cw;
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
138706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (firstImWin == baseImWin) {
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // The windows haven't moved...  but are they still contiguous?
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // First find the top IM window.
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int pos = imPos+1;
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (pos < N) {
1393e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    if (!(mWindows.get(pos)).mIsImWindow) {
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pos++;
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pos++;
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Now there should be no more input method windows above.
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (pos < N) {
1401e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    if ((mWindows.get(pos)).mIsImWindow) {
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pos++;
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pos >= N) {
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // All is good!
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
141106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imWin != null) {
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_INPUT_METHOD) {
14148a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "Moving IM from " + imPos);
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    logWindowList("  ");
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imPos = tmpRemoveWindowLocked(imPos, imWin);
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_INPUT_METHOD) {
14197eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn                    Slog.v(TAG, "List after removing with new pos " + imPos + ":");
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    logWindowList("  ");
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imWin.mTargetAppToken = mInputMethodTarget.mAppToken;
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reAddWindowLocked(imPos, imWin);
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_INPUT_METHOD) {
14258a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "List after moving IM to " + imPos + ":");
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    logWindowList("  ");
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DN > 0) moveInputMethodDialogsLocked(imPos+1);
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                moveInputMethodDialogsLocked(imPos);
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
143206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // In this case, the input method windows go in a fixed layer,
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // because they aren't currently associated with a focus window.
143606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imWin != null) {
14388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Moving IM from " + imPos);
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                tmpRemoveWindowLocked(0, imWin);
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imWin.mTargetAppToken = null;
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reAddWindowToListInOrderLocked(imWin);
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_INPUT_METHOD) {
14438a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "List with no IM target:");
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    logWindowList("  ");
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DN > 0) moveInputMethodDialogsLocked(-1);;
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                moveInputMethodDialogsLocked(-1);;
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
145006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
145206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (needAssignLayers) {
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assignLayersLocked();
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
145606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
145906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void adjustInputMethodDialogsLocked() {
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        moveInputMethodDialogsLocked(findDesiredInputMethodWindowIndexLocked(true));
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
146306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
146425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn    final boolean isWallpaperVisible(WindowState wallpaperTarget) {
14658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper vis: target obscured="
146625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                + (wallpaperTarget != null ? Boolean.toString(wallpaperTarget.mObscured) : "??")
146725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                + " anim=" + ((wallpaperTarget != null && wallpaperTarget.mAppToken != null)
146825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        ? wallpaperTarget.mAppToken.animation : null)
146925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                + " upper=" + mUpperWallpaperTarget
147025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                + " lower=" + mLowerWallpaperTarget);
147125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn        return (wallpaperTarget != null
147225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        && (!wallpaperTarget.mObscured || (wallpaperTarget.mAppToken != null
147325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                && wallpaperTarget.mAppToken.animation != null)))
147425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                || mUpperWallpaperTarget != null
147525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                || mLowerWallpaperTarget != null;
147625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn    }
1477ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
14780586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    static final int ADJUST_WALLPAPER_LAYERS_CHANGED = 1<<1;
14790586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    static final int ADJUST_WALLPAPER_VISIBILITY_CHANGED = 1<<2;
1480ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
14810586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    int adjustWallpaperWindowsLocked() {
14820586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn        int changed = 0;
1483ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
148481e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        final int dw = mAppDisplayWidth;
148581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        final int dh = mAppDisplayHeight;
1486ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
14874c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // First find top-most window that has asked to be on top of the
14884c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // wallpaper; all wallpapers go behind it.
1489e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        final ArrayList<WindowState> localmWindows = mWindows;
14904c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        int N = localmWindows.size();
14914c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        WindowState w = null;
1492f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn        WindowState foundW = null;
1493f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn        int foundI = 0;
14943b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        WindowState topCurW = null;
14953b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        int topCurI = 0;
14966c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn        int windowDetachedI = -1;
14974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        int i = N;
14984c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        while (i > 0) {
14994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            i--;
1500e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            w = localmWindows.get(i);
15013b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if ((w.mAttrs.type == WindowManager.LayoutParams.TYPE_WALLPAPER)) {
15023b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                if (topCurW == null) {
15033b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    topCurW = w;
15043b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    topCurI = i;
15053b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                }
15063b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                continue;
15073b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            }
15083b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            topCurW = null;
15096c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            if (w != mWindowDetachedWallpaper && w.mAppToken != null) {
15103be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                // If this window's app token is hidden and not animating,
15113be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                // it is of no interest to us.
15123be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                if (w.mAppToken.hidden && w.mAppToken.animation == null) {
15138a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WALLPAPER) Slog.v(TAG,
15146c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                            "Skipping not hidden or animating token: " + w);
15153be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    continue;
1516f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                }
1517f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            }
15188a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WALLPAPER) Slog.v(TAG, "Win " + w + ": readyfordisplay="
15193be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    + w.isReadyForDisplay() + " drawpending=" + w.mDrawPending
15203be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    + " commitdrawpending=" + w.mCommitDrawPending);
15217341d7a104b47996445d069a695e155a07184606Dianne Hackborn            if ((w.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0 && w.isReadyForDisplay()
15226c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                    && (mWallpaperTarget == w
15236c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                            || (!w.mDrawPending && !w.mCommitDrawPending))) {
15248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WALLPAPER) Slog.v(TAG,
15253be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        "Found wallpaper activity: #" + i + "=" + w);
1526f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                foundW = w;
1527f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                foundI = i;
15283b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                if (w == mWallpaperTarget && ((w.mAppToken != null
15293b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        && w.mAppToken.animation != null)
15303b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        || w.mAnimation != null)) {
15313be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    // The current wallpaper target is animating, so we'll
15323be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    // look behind it for another possible target and figure
15333be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    // out what is going on below.
15348a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WALLPAPER) Slog.v(TAG, "Win " + w
15353be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            + ": token animating, looking behind.");
1536f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                    continue;
1537f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                }
15384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                break;
15396c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            } else if (w == mWindowDetachedWallpaper) {
15406c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                windowDetachedI = i;
15414c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
15424c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
15434c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
15446c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn        if (foundW == null && windowDetachedI >= 0) {
15456c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            if (DEBUG_WALLPAPER) Slog.v(TAG,
15466c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                    "Found animating detached wallpaper activity: #" + i + "=" + w);
15476c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            foundW = w;
15486c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            foundI = windowDetachedI;
15496c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn        }
15506c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn
1551bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn        if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
1552f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // If we are currently waiting for an app transition, and either
1553f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // the current target or the next target are involved with it,
1554f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // then hold off on doing anything with the wallpaper.
1555f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // Note that we are checking here for just whether the target
1556f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // is part of an app token...  which is potentially overly aggressive
1557f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // (the app token may not be involved in the transition), but good
1558f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // enough (we'll just wait until whatever transition is pending
1559f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // executes).
1560f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            if (mWallpaperTarget != null && mWallpaperTarget.mAppToken != null) {
15618a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WALLPAPER) Slog.v(TAG,
15623be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        "Wallpaper not changing: waiting for app anim in current target");
15630586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                return 0;
1564f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            }
1565f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            if (foundW != null && foundW.mAppToken != null) {
15668a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WALLPAPER) Slog.v(TAG,
15673be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        "Wallpaper not changing: waiting for app anim in found target");
15680586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                return 0;
1569f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            }
15707341d7a104b47996445d069a695e155a07184606Dianne Hackborn        }
1571ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1572f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn        if (mWallpaperTarget != foundW) {
1573f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            if (DEBUG_WALLPAPER) {
15748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.v(TAG, "New wallpaper target: " + foundW
15753be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        + " oldTarget: " + mWallpaperTarget);
15763be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            }
1577ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
15783be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            mLowerWallpaperTarget = null;
15793be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            mUpperWallpaperTarget = null;
1580ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
15813be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            WindowState oldW = mWallpaperTarget;
15823be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            mWallpaperTarget = foundW;
1583ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
15843be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            // Now what is happening...  if the current and new targets are
15853be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            // animating, then we are in our super special mode!
15863b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if (foundW != null && oldW != null) {
15873b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                boolean oldAnim = oldW.mAnimation != null
15883b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        || (oldW.mAppToken != null && oldW.mAppToken.animation != null);
15893b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                boolean foundAnim = foundW.mAnimation != null
15903b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        || (foundW.mAppToken != null && foundW.mAppToken.animation != null);
15913be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                if (DEBUG_WALLPAPER) {
15928a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "New animation: " + foundAnim
15933b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            + " old animation: " + oldAnim);
15943be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                }
15953b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                if (foundAnim && oldAnim) {
15963be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    int oldI = localmWindows.indexOf(oldW);
15973be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    if (DEBUG_WALLPAPER) {
15988a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.v(TAG, "New i: " + foundI + " old i: " + oldI);
15993be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    }
16003be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    if (oldI >= 0) {
16013be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        if (DEBUG_WALLPAPER) {
16028a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            Slog.v(TAG, "Animating wallpapers: old#" + oldI
16033be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                                    + "=" + oldW + "; new#" + foundI
16043be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                                    + "=" + foundW);
16053be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        }
1606ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16073be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        // Set the new target correctly.
16083b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        if (foundW.mAppToken != null && foundW.mAppToken.hiddenRequested) {
16093be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            if (DEBUG_WALLPAPER) {
16108a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.v(TAG, "Old wallpaper still the target.");
16113be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            }
16123be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            mWallpaperTarget = oldW;
16133be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        }
1614ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16153be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        // Now set the upper and lower wallpaper targets
16163be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        // correctly, and make sure that we are positioning
16173be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        // the wallpaper below the lower.
16183be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        if (foundI > oldI) {
16193be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            // The new target is on top of the old one.
16203be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            if (DEBUG_WALLPAPER) {
16218a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.v(TAG, "Found target above old target.");
16223be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            }
16233be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            mUpperWallpaperTarget = foundW;
16243be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            mLowerWallpaperTarget = oldW;
16253be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            foundW = oldW;
16263be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            foundI = oldI;
16273be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        } else {
16283be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            // The new target is below the old one.
16293be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            if (DEBUG_WALLPAPER) {
16308a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.v(TAG, "Found target below old target.");
16313be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            }
16323be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            mUpperWallpaperTarget = oldW;
16333be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            mLowerWallpaperTarget = foundW;
16343be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        }
16353be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    }
16363be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                }
16373be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            }
1638ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16396b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn        } else if (mLowerWallpaperTarget != null) {
16403be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            // Is it time to stop animating?
16416b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn            boolean lowerAnimating = mLowerWallpaperTarget.mAnimation != null
16426b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn                    || (mLowerWallpaperTarget.mAppToken != null
16436b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn                            && mLowerWallpaperTarget.mAppToken.animation != null);
16446b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn            boolean upperAnimating = mUpperWallpaperTarget.mAnimation != null
16456b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn                    || (mUpperWallpaperTarget.mAppToken != null
16466b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn                            && mUpperWallpaperTarget.mAppToken.animation != null);
16476b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn            if (!lowerAnimating || !upperAnimating) {
16483be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                if (DEBUG_WALLPAPER) {
16498a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "No longer animating wallpaper targets!");
16503be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                }
16513be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                mLowerWallpaperTarget = null;
16523be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                mUpperWallpaperTarget = null;
1653f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            }
1654f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn        }
1655ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1656f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn        boolean visible = foundW != null;
1657759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        if (visible) {
16587341d7a104b47996445d069a695e155a07184606Dianne Hackborn            // The window is visible to the compositor...  but is it visible
16597341d7a104b47996445d069a695e155a07184606Dianne Hackborn            // to the user?  That is what the wallpaper cares about.
166025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn            visible = isWallpaperVisible(foundW);
16618a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper visibility: " + visible);
1662ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16637341d7a104b47996445d069a695e155a07184606Dianne Hackborn            // If the wallpaper target is animating, we may need to copy
1664f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // its layer adjustment.  Only do this if we are not transfering
1665f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // between two wallpaper targets.
1666f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            mWallpaperAnimLayerAdjustment =
16673be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    (mLowerWallpaperTarget == null && foundW.mAppToken != null)
1668f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                    ? foundW.mAppToken.animLayerAdjustment : 0;
1669ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16706136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn            final int maxLayer = mPolicy.getMaxWallpaperLayer()
16716136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                    * TYPE_LAYER_MULTIPLIER
16726136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                    + TYPE_LAYER_OFFSET;
1673ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16744c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            // Now w is the window we are supposed to be behind...  but we
16754c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            // need to be sure to also be behind any of its attached windows,
16766136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn            // AND any starting window associated with it, AND below the
16776136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn            // maximum layer the policy allows for wallpapers.
1678f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            while (foundI > 0) {
1679e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState wb = localmWindows.get(foundI-1);
16806136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                if (wb.mBaseLayer < maxLayer &&
16816136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                        wb.mAttachedWindow != foundW &&
1682428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        (foundW.mAttachedWindow == null ||
1683428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                                wb.mAttachedWindow != foundW.mAttachedWindow) &&
16844c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                        (wb.mAttrs.type != TYPE_APPLICATION_STARTING ||
1685428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                                foundW.mToken == null || wb.mToken != foundW.mToken)) {
16864c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    // This window is not related to the previous one in any
16874c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    // interesting way, so stop here.
16884c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    break;
16894c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
1690f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                foundW = wb;
1691f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                foundI--;
16924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
169325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn        } else {
16948a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WALLPAPER) Slog.v(TAG, "No wallpaper target");
16954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
1696ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16973b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        if (foundW == null && topCurW != null) {
16983b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            // There is no wallpaper target, so it goes at the bottom.
16993b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            // We will assume it is the same place as last time, if known.
17003b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            foundW = topCurW;
17013b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            foundI = topCurI+1;
17023b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        } else {
17033b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            // Okay i is the position immediately above the wallpaper.  Look at
17043b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            // what is below it for later.
1705e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            foundW = foundI > 0 ? localmWindows.get(foundI-1) : null;
17063b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        }
1707ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1708284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        if (visible) {
170973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            if (mWallpaperTarget.mWallpaperX >= 0) {
171073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                mLastWallpaperX = mWallpaperTarget.mWallpaperX;
1711bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                mLastWallpaperXStep = mWallpaperTarget.mWallpaperXStep;
171273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            }
171373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            if (mWallpaperTarget.mWallpaperY >= 0) {
171473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                mLastWallpaperY = mWallpaperTarget.mWallpaperY;
1715bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                mLastWallpaperYStep = mWallpaperTarget.mWallpaperYStep;
171673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            }
1717284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        }
1718ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
17194c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // Start stepping backwards from here, ensuring that our wallpaper windows
17204c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // are correctly placed.
17214c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        int curTokenIndex = mWallpaperTokens.size();
17224c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        while (curTokenIndex > 0) {
17234c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            curTokenIndex--;
17244c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            WindowToken token = mWallpaperTokens.get(curTokenIndex);
17250586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn            if (token.hidden == visible) {
17260586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                changed |= ADJUST_WALLPAPER_VISIBILITY_CHANGED;
17270586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                token.hidden = !visible;
17280586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                // Need to do a layout to ensure the wallpaper now has the
17290586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                // correct size.
17300586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                mLayoutNeeded = true;
17310586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn            }
1732ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
17334c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            int curWallpaperIndex = token.windows.size();
17344c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            while (curWallpaperIndex > 0) {
17354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                curWallpaperIndex--;
17364c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                WindowState wallpaper = token.windows.get(curWallpaperIndex);
1737ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
173872c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                if (visible) {
173919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    updateWallpaperOffsetLocked(wallpaper, dw, dh, false);
174072c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                }
1741ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1742759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                // First, make sure the client has the current visibility
1743759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                // state.
1744759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                if (wallpaper.mWallpaperVisible != visible) {
1745759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    wallpaper.mWallpaperVisible = visible;
1746759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    try {
17478a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_VISIBILITY || DEBUG_WALLPAPER) Slog.v(TAG,
1748759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                                "Setting visibility of wallpaper " + wallpaper
1749759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                                + ": " + visible);
1750759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                        wallpaper.mClient.dispatchAppVisibility(visible);
1751759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    } catch (RemoteException e) {
1752759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    }
1753759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                }
1754ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1755759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                wallpaper.mAnimLayer = wallpaper.mLayer + mWallpaperAnimLayerAdjustment;
17568a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper win "
17577341d7a104b47996445d069a695e155a07184606Dianne Hackborn                        + wallpaper + " anim layer: " + wallpaper.mAnimLayer);
1758ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
17594c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // First, if this window is at the current index, then all
17604c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // is well.
1761f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                if (wallpaper == foundW) {
1762f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                    foundI--;
1763f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                    foundW = foundI > 0
1764e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                            ? localmWindows.get(foundI-1) : null;
17654c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    continue;
17664c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
1767ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
17684c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // The window didn't match...  the current wallpaper window,
17694c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // wherever it is, is in the wrong place, so make sure it is
17704c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // not in the list.
17714c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                int oldIndex = localmWindows.indexOf(wallpaper);
17724c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                if (oldIndex >= 0) {
17738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Wallpaper removing at "
17749bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                            + oldIndex + ": " + wallpaper);
17754c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    localmWindows.remove(oldIndex);
1776dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                    mWindowsChanged = true;
1777f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                    if (oldIndex < foundI) {
1778f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                        foundI--;
17794c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    }
17804c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
1781ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
17824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // Now stick it in.
1783f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (DEBUG_WALLPAPER || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) {
1784f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    Slog.v(TAG, "Moving wallpaper " + wallpaper
1785f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            + " from " + oldIndex + " to " + foundI);
1786f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                }
1787ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1788f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                localmWindows.add(foundI, wallpaper);
1789dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                mWindowsChanged = true;
17900586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                changed |= ADJUST_WALLPAPER_LAYERS_CHANGED;
17914c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
17924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
1793ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
17944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return changed;
17954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
17964c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
1797c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn    void setWallpaperAnimLayerAdjustmentLocked(int adj) {
17988a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG,
17997341d7a104b47996445d069a695e155a07184606Dianne Hackborn                "Setting wallpaper layer adj to " + adj);
1800759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        mWallpaperAnimLayerAdjustment = adj;
1801759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        int curTokenIndex = mWallpaperTokens.size();
1802759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        while (curTokenIndex > 0) {
1803759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            curTokenIndex--;
1804759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            WindowToken token = mWallpaperTokens.get(curTokenIndex);
1805759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            int curWallpaperIndex = token.windows.size();
1806759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            while (curWallpaperIndex > 0) {
1807759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                curWallpaperIndex--;
1808759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                WindowState wallpaper = token.windows.get(curWallpaperIndex);
1809759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                wallpaper.mAnimLayer = wallpaper.mLayer + adj;
18108a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper win "
18117341d7a104b47996445d069a695e155a07184606Dianne Hackborn                        + wallpaper + " anim layer: " + wallpaper.mAnimLayer);
1812759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            }
1813759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        }
1814759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn    }
1815759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn
181619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    boolean updateWallpaperOffsetLocked(WindowState wallpaperWin, int dw, int dh,
181719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            boolean sync) {
181872c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn        boolean changed = false;
18197341d7a104b47996445d069a695e155a07184606Dianne Hackborn        boolean rawChanged = false;
182073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        float wpx = mLastWallpaperX >= 0 ? mLastWallpaperX : 0.5f;
1821bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen        float wpxs = mLastWallpaperXStep >= 0 ? mLastWallpaperXStep : -1.0f;
1822ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        int availw = wallpaperWin.mFrame.right-wallpaperWin.mFrame.left-dw;
182373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        int offset = availw > 0 ? -(int)(availw*wpx+.5f) : 0;
182473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        changed = wallpaperWin.mXOffset != offset;
182573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        if (changed) {
18268a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WALLPAPER) Slog.v(TAG, "Update wallpaper "
182773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                    + wallpaperWin + " x: " + offset);
182873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            wallpaperWin.mXOffset = offset;
182973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        }
1830bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen        if (wallpaperWin.mWallpaperX != wpx || wallpaperWin.mWallpaperXStep != wpxs) {
183173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            wallpaperWin.mWallpaperX = wpx;
1832bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen            wallpaperWin.mWallpaperXStep = wpxs;
183373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            rawChanged = true;
1834c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        }
1835ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
183673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        float wpy = mLastWallpaperY >= 0 ? mLastWallpaperY : 0.5f;
1837bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen        float wpys = mLastWallpaperYStep >= 0 ? mLastWallpaperYStep : -1.0f;
183873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        int availh = wallpaperWin.mFrame.bottom-wallpaperWin.mFrame.top-dh;
183973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        offset = availh > 0 ? -(int)(availh*wpy+.5f) : 0;
184073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        if (wallpaperWin.mYOffset != offset) {
18418a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WALLPAPER) Slog.v(TAG, "Update wallpaper "
184273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                    + wallpaperWin + " y: " + offset);
184373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            changed = true;
184473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            wallpaperWin.mYOffset = offset;
184573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        }
1846bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen        if (wallpaperWin.mWallpaperY != wpy || wallpaperWin.mWallpaperYStep != wpys) {
184773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            wallpaperWin.mWallpaperY = wpy;
1848bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen            wallpaperWin.mWallpaperYStep = wpys;
184973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            rawChanged = true;
185072c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn        }
1851ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1852a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase        if (rawChanged && (wallpaperWin.getAttrs().privateFlags &
1853a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                    WindowManager.LayoutParams.PRIVATE_FLAG_WANTS_OFFSET_NOTIFICATIONS) != 0) {
185472c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn            try {
18558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WALLPAPER) Slog.v(TAG, "Report new wp offset "
1856e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                        + wallpaperWin + " x=" + wallpaperWin.mWallpaperX
1857e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                        + " y=" + wallpaperWin.mWallpaperY);
185819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                if (sync) {
18597580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    mWaitingOnWallpaper = wallpaperWin;
186019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                }
186172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                wallpaperWin.mClient.dispatchWallpaperOffsets(
1862bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                        wallpaperWin.mWallpaperX, wallpaperWin.mWallpaperY,
1863bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                        wallpaperWin.mWallpaperXStep, wallpaperWin.mWallpaperYStep, sync);
186419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                if (sync) {
18657580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    if (mWaitingOnWallpaper != null) {
18667580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        long start = SystemClock.uptimeMillis();
18677580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        if ((mLastWallpaperTimeoutTime+WALLPAPER_TIMEOUT_RECOVERY)
18687580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                < start) {
18697580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                            try {
18708a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_WALLPAPER) Slog.v(TAG,
18717580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                        "Waiting for offset complete...");
18727580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                mWindowMap.wait(WALLPAPER_TIMEOUT);
18737580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                            } catch (InterruptedException e) {
18747580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                            }
18758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_WALLPAPER) Slog.v(TAG, "Offset complete!");
18767580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                            if ((start+WALLPAPER_TIMEOUT)
18777580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                    < SystemClock.uptimeMillis()) {
18788a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.i(TAG, "Timeout waiting for wallpaper to offset: "
18797580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                        + wallpaperWin);
18807580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                mLastWallpaperTimeoutTime = start;
188119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                            }
188219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                        }
18837580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        mWaitingOnWallpaper = null;
188419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    }
188519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                }
188672c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn            } catch (RemoteException e) {
188772c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn            }
1888c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        }
1889ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1890c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        return changed;
1891c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn    }
1892ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
189319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    void wallpaperOffsetsComplete(IBinder window) {
18947580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        synchronized (mWindowMap) {
189519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            if (mWaitingOnWallpaper != null &&
189619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    mWaitingOnWallpaper.mClient.asBinder() == window) {
189719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                mWaitingOnWallpaper = null;
18987580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                mWindowMap.notifyAll();
189919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            }
190019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn        }
190119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    }
1902ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1903a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase    void updateWallpaperOffsetLocked(WindowState changingTarget, boolean sync) {
190481e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        final int dw = mAppDisplayWidth;
190581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        final int dh = mAppDisplayHeight;
1906ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1907c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        WindowState target = mWallpaperTarget;
1908c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        if (target != null) {
190973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            if (target.mWallpaperX >= 0) {
191073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                mLastWallpaperX = target.mWallpaperX;
191173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            } else if (changingTarget.mWallpaperX >= 0) {
191273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                mLastWallpaperX = changingTarget.mWallpaperX;
191373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            }
191473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            if (target.mWallpaperY >= 0) {
191573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                mLastWallpaperY = target.mWallpaperY;
191673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            } else if (changingTarget.mWallpaperY >= 0) {
191773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                mLastWallpaperY = changingTarget.mWallpaperY;
191873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            }
191973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        }
1920ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
192173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        int curTokenIndex = mWallpaperTokens.size();
192273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        while (curTokenIndex > 0) {
192373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            curTokenIndex--;
192473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            WindowToken token = mWallpaperTokens.get(curTokenIndex);
192573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            int curWallpaperIndex = token.windows.size();
192673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            while (curWallpaperIndex > 0) {
192773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                curWallpaperIndex--;
192873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                WindowState wallpaper = token.windows.get(curWallpaperIndex);
192973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                if (updateWallpaperOffsetLocked(wallpaper, dw, dh, sync)) {
193073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                    wallpaper.computeShownFrameLocked();
1931a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                    // No need to lay out the windows - we can just set the wallpaper position
1932a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                    // directly.
1933a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                    if (wallpaper.mSurfaceX != wallpaper.mShownFrame.left
1934a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                            || wallpaper.mSurfaceY != wallpaper.mShownFrame.top) {
1935a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                        Surface.openTransaction();
1936a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                        try {
1937a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                            if (SHOW_TRANSACTIONS) logSurface(wallpaper,
1938a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                                    "POS " + wallpaper.mShownFrame.left
1939a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                                    + ", " + wallpaper.mShownFrame.top, null);
1940a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                            wallpaper.mSurfaceX = wallpaper.mShownFrame.left;
1941a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                            wallpaper.mSurfaceY = wallpaper.mShownFrame.top;
1942a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                            wallpaper.mSurface.setPosition(wallpaper.mShownFrame.left,
1943a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                                    wallpaper.mShownFrame.top);
1944a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                        } catch (RuntimeException e) {
1945a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                            Slog.w(TAG, "Error positioning surface of " + wallpaper
1946a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                                    + " pos=(" + wallpaper.mShownFrame.left
1947a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                                    + "," + wallpaper.mShownFrame.top + ")", e);
1948a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                        }
1949a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                        Surface.closeTransaction();
1950a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase                    }
195173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                    // We only want to be synchronous with one wallpaper.
195273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                    sync = false;
1953c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn                }
1954c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn            }
1955c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        }
1956c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn    }
1957ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1958e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn    void updateWallpaperVisibilityLocked() {
195925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn        final boolean visible = isWallpaperVisible(mWallpaperTarget);
196081e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        final int dw = mAppDisplayWidth;
196181e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        final int dh = mAppDisplayHeight;
1962ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1963e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn        int curTokenIndex = mWallpaperTokens.size();
1964e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn        while (curTokenIndex > 0) {
1965e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            curTokenIndex--;
1966e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            WindowToken token = mWallpaperTokens.get(curTokenIndex);
19670586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn            if (token.hidden == visible) {
19680586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                token.hidden = !visible;
19690586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                // Need to do a layout to ensure the wallpaper now has the
19700586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                // correct size.
19710586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                mLayoutNeeded = true;
19720586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn            }
1973ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1974e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            int curWallpaperIndex = token.windows.size();
1975e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            while (curWallpaperIndex > 0) {
1976e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                curWallpaperIndex--;
1977e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                WindowState wallpaper = token.windows.get(curWallpaperIndex);
1978e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                if (visible) {
197919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    updateWallpaperOffsetLocked(wallpaper, dw, dh, false);
1980e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                }
1981ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1982e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                if (wallpaper.mWallpaperVisible != visible) {
1983e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    wallpaper.mWallpaperVisible = visible;
1984e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    try {
19858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_VISIBILITY || DEBUG_WALLPAPER) Slog.v(TAG,
198625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                "Updating visibility of wallpaper " + wallpaper
1987e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                                + ": " + visible);
1988e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                        wallpaper.mClient.dispatchAppVisibility(visible);
1989e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    } catch (RemoteException e) {
1990e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    }
1991e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                }
1992e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            }
1993e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn        }
1994e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn    }
199590d2db3d21d07c2a4b4cbbc558f5ec59d20098c3Dianne Hackborn
19969a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    public int addWindow(Session session, IWindow client, int seq,
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowManager.LayoutParams attrs, int viewVisibility,
199846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            Rect outContentInsets, InputChannel outInputChannel) {
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int res = mPolicy.checkAddPermission(attrs);
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (res != WindowManagerImpl.ADD_OKAY) {
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return res;
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
200306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean reportNewConfig = false;
20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState attachedWindow = null;
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState win = null;
20075132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn        long origId;
200806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDisplay == null) {
20115132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn                throw new IllegalStateException("Display has not been initialialized");
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
201306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mWindowMap.containsKey(client.asBinder())) {
20158a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Window " + client + " is already added");
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return WindowManagerImpl.ADD_DUPLICATE_ADD;
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (attrs.type >= FIRST_SUB_WINDOW && attrs.type <= LAST_SUB_WINDOW) {
2020e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                attachedWindow = windowForClientLocked(null, attrs.token, false);
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attachedWindow == null) {
20228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add window with token that is not a window: "
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          + attrs.token + ".  Aborting.");
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN;
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attachedWindow.mAttrs.type >= FIRST_SUB_WINDOW
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && attachedWindow.mAttrs.type <= LAST_SUB_WINDOW) {
20288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add window with token that is a sub-window: "
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + attrs.token + ".  Aborting.");
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN;
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean addToken = false;
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken token = mTokenMap.get(attrs.token);
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token == null) {
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attrs.type >= FIRST_APPLICATION_WINDOW
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && attrs.type <= LAST_APPLICATION_WINDOW) {
20398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add application window with unknown token "
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          + attrs.token + ".  Aborting.");
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_BAD_APP_TOKEN;
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attrs.type == TYPE_INPUT_METHOD) {
20448a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add input method window with unknown token "
20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          + attrs.token + ".  Aborting.");
20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_BAD_APP_TOKEN;
20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                if (attrs.type == TYPE_WALLPAPER) {
20498a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add wallpaper window with unknown token "
20504c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                          + attrs.token + ".  Aborting.");
20514c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    return WindowManagerImpl.ADD_BAD_APP_TOKEN;
20524c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
20536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                token = new WindowToken(this, attrs.token, -1, false);
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                addToken = true;
20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (attrs.type >= FIRST_APPLICATION_WINDOW
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && attrs.type <= LAST_APPLICATION_WINDOW) {
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AppWindowToken atoken = token.appWindowToken;
20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (atoken == null) {
20598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add window with non-application token "
20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          + token + ".  Aborting.");
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_NOT_APP_TOKEN;
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (atoken.removed) {
20638a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add window with exiting application token "
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          + token + ".  Aborting.");
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_APP_EXITING;
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attrs.type == TYPE_APPLICATION_STARTING && atoken.firstWindowDrawn) {
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // No need for this guy!
20698a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (localLOGV) Slog.v(
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            TAG, "**** NO NEED TO START: " + attrs.getTitle());
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_STARTING_NOT_NEEDED;
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (attrs.type == TYPE_INPUT_METHOD) {
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (token.windowType != TYPE_INPUT_METHOD) {
20758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add input method window with bad token "
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + attrs.token + ".  Aborting.");
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      return WindowManagerImpl.ADD_BAD_APP_TOKEN;
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20794c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            } else if (attrs.type == TYPE_WALLPAPER) {
20804c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                if (token.windowType != TYPE_WALLPAPER) {
20818a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add wallpaper window with bad token "
20824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                            + attrs.token + ".  Aborting.");
20834c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                      return WindowManagerImpl.ADD_BAD_APP_TOKEN;
20844c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            win = new WindowState(this, session, client, token,
20889a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                    attachedWindow, seq, attrs, viewVisibility);
20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.mDeathRecipient == null) {
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Client has apparently died, so there is no reason to
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // continue.
20928a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Adding window client " + client.asBinder()
20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " that is dead, aborting.");
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return WindowManagerImpl.ADD_APP_EXITING;
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPolicy.adjustWindowParamsLw(win.mAttrs);
209806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            res = mPolicy.prepareAddWindowLw(win, attrs);
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res != WindowManagerImpl.ADD_OKAY) {
21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return res;
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
210346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2104cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            if (outInputChannel != null && (attrs.inputFeatures
2105cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    & WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL) == 0) {
210600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                String name = win.makeInputChannelName();
210700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                InputChannel[] inputChannels = InputChannel.openInputChannelPair(name);
2108cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                win.setInputChannel(inputChannels[0]);
21090a0ab128a65900a23f1018a14f5cbecec6443dd3Jeff Brown                inputChannels[1].transferTo(outInputChannel);
211000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown
2111928e054931d357326613c78e62f4d850b7c442ffJeff Brown                mInputManager.registerInputChannel(win.mInputChannel, win.mInputWindowHandle);
211246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            }
21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // From now on, no exceptions or errors allowed!
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            res = WindowManagerImpl.ADD_OKAY;
211706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21185132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            origId = Binder.clearCallingIdentity();
211906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (addToken) {
21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTokenMap.put(attrs.token, token);
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.attach();
21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowMap.put(client.asBinder(), win);
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (attrs.type == TYPE_APPLICATION_STARTING &&
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    token.appWindowToken != null) {
21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                token.appWindowToken.startingWindow = win;
21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean imMayMove = true;
213206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (attrs.type == TYPE_INPUT_METHOD) {
21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInputMethodWindow = win;
21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                addInputMethodWindowToListLocked(win);
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imMayMove = false;
21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (attrs.type == TYPE_INPUT_METHOD_DIALOG) {
21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInputMethodDialogs.add(win);
21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                addWindowToListInOrderLocked(win, true);
21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                adjustInputMethodDialogsLocked();
21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imMayMove = false;
21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                addWindowToListInOrderLocked(win, true);
214419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                if (attrs.type == TYPE_WALLPAPER) {
214519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    mLastWallpaperTimeoutTime = 0;
214619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    adjustWallpaperWindowsLocked();
214719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                } else if ((attrs.flags&FLAG_SHOW_WALLPAPER) != 0) {
21484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    adjustWallpaperWindowsLocked();
21494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
215106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mEnterAnimationPending = true;
215306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPolicy.getContentInsetHintLw(attrs, outContentInsets);
215506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mInTouchMode) {
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                res |= WindowManagerImpl.ADD_FLAG_IN_TOUCH_MODE;
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win == null || win.mAppToken == null || !win.mAppToken.clientHidden) {
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                res |= WindowManagerImpl.ADD_FLAG_APP_VISIBLE;
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
216206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21632e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown            mInputMonitor.setUpdateInputWindowsNeededLw();
21642e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown
2165c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            boolean focusChanged = false;
21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.canReceiveKeys()) {
21673a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                focusChanged = updateFocusedWindowLocked(UPDATE_FOCUS_WILL_ASSIGN_LAYERS,
21683a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        false /*updateInputWindows*/);
2169349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown                if (focusChanged) {
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    imMayMove = false;
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
217306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imMayMove) {
217506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                moveInputMethodWindowsIfNeededLocked(false);
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
217706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assignLayersLocked();
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Don't do layout here, the window must call
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // relayout to be displayed, so we'll do it there.
218106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //dump();
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2184c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            if (focusChanged) {
21853a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                finishUpdateFocusedWindowAfterAssignLayersLocked(false /*updateInputWindows*/);
2186c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            }
21872e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown            mInputMonitor.updateInputWindowsLw(false /*force*/);
21883a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown
21898a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (localLOGV) Slog.v(
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "New client " + client.asBinder()
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ": window=" + win);
2192e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
219394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            if (win.isVisibleOrAdding() && updateOrientationFromAppTokensLocked(false)) {
2194e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                reportNewConfig = true;
2195e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (reportNewConfig) {
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendNewConfiguration();
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22015132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
220306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return res;
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
220606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeWindow(Session session, IWindow client) {
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
2209e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            WindowState win = windowForClientLocked(session, client, false);
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win == null) {
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            removeWindowLocked(session, win);
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
221606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeWindowLocked(Session session, WindowState win) {
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22198a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (localLOGV || DEBUG_FOCUS) Slog.v(
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Remove " + win + " client="
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + Integer.toHexString(System.identityHashCode(
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mClient.asBinder()))
22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + ", surface=" + win.mSurface);
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long origId = Binder.clearCallingIdentity();
2226c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
2227c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        win.disposeInputChannel();
222806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
22298a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_APP_TRANSITIONS) Slog.v(
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Remove " + win + ": mSurface=" + win.mSurface
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " mExiting=" + win.mExiting
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " isAnimating=" + win.isAnimating()
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " app-animation="
22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + (win.mAppToken != null ? win.mAppToken.animation : null)
22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " inPendingTransaction="
22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + (win.mAppToken != null ? win.mAppToken.inPendingTransaction : false)
22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " mDisplayFrozen=" + mDisplayFrozen);
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Visibility of the removed window. Will be used later to update orientation later on.
22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean wasVisible = false;
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // First, see if we need to run an animation.  If we do, we have
22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // to hold off on removing the window until the animation is done.
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // If the display is frozen, just remove immediately, since the
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // animation wouldn't be seen.
2244bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn        if (win.mSurface != null && !mDisplayFrozen && mDisplayEnabled
2245bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn                && mPolicy.isScreenOnFully()) {
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If we are not currently running the exit animation, we
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // need to see about starting one.
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wasVisible=win.isWinVisibleLw()) {
224906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int transit = WindowManagerPolicy.TRANSIT_EXIT;
22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.getAttrs().type == TYPE_APPLICATION_STARTING) {
22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    transit = WindowManagerPolicy.TRANSIT_PREVIEW_DONE;
22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Try starting an animation.
22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (applyAnimationLocked(win, transit, false)) {
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mExiting = true;
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.mExiting || win.isAnimating()) {
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // The exit animation is running... wait for it!
22618a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                //Slog.i(TAG, "*** Running exit animation...");
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mExiting = true;
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mRemoveOnExit = true;
22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutNeeded = true;
22653a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
22663a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        false /*updateInputWindows*/);
22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                performLayoutAndPlaceSurfacesLocked();
22682e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                mInputMonitor.updateInputWindowsLw(false /*force*/);
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.mAppToken != null) {
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mAppToken.updateReportedVisibilityLocked();
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //dump();
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.restoreCallingIdentity(origId);
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        removeWindowInnerLocked(session, win);
22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Removing a visible window will effect the computed orientation
22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // So just update orientation if needed.
2281c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        if (wasVisible && computeForcedAppOrientationLocked()
2282e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                != mForcedAppOrientation
228394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                && updateOrientationFromAppTokensLocked(false)) {
2284e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22863a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/);
22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
228906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void removeWindowInnerLocked(Session session, WindowState win) {
2291f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        if (win.mRemoved) {
2292f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            // Nothing to do.
2293f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            return;
2294f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        }
2295f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn
2296f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        for (int i=win.mChildWindows.size()-1; i>=0; i--) {
2297f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            WindowState cwin = win.mChildWindows.get(i);
2298f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            Slog.w(TAG, "Force-removing child win " + cwin + " from container "
2299f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    + win);
2300f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            removeWindowInnerLocked(cwin.mSession, cwin);
2301f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        }
2302f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn
23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        win.mRemoved = true;
230406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mInputMethodTarget == win) {
23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            moveInputMethodWindowsIfNeededLocked(false);
23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
230806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
2309bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        if (false) {
2310bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn            RuntimeException e = new RuntimeException("here");
2311bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn            e.fillInStackTrace();
23128a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Removing window " + win, e);
2313bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        }
2314ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPolicy.removeWindowLw(win);
23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        win.removeLocked();
23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2318f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        if (DEBUG_ADD_REMOVE) Slog.v(TAG, "removeWindowInnerLocked: " + win);
23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowMap.remove(win.mClient.asBinder());
23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindows.remove(win);
2321f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        mPendingRemove.remove(win);
2322dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        mWindowsChanged = true;
23238a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Final remove of window: " + win);
23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mInputMethodWindow == win) {
23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInputMethodWindow = null;
23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (win.mAttrs.type == TYPE_INPUT_METHOD_DIALOG) {
23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInputMethodDialogs.remove(win);
23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
233006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final WindowToken token = win.mToken;
23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final AppWindowToken atoken = win.mAppToken;
2333f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Removing " + win + " from " + token);
23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        token.windows.remove(win);
23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (atoken != null) {
23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            atoken.allAppWindows.remove(win);
23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (localLOGV) Slog.v(
23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "**** Removing window " + win + ": count="
23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + token.windows.size());
23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (token.windows.size() == 0) {
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!token.explicit) {
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTokenMap.remove(token.token);
23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (atoken != null) {
23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                atoken.firstWindowDrawn = false;
23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (atoken != null) {
23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (atoken.startingWindow == win) {
23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                atoken.startingWindow = null;
23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (atoken.allAppWindows.size() == 0 && atoken.startingData != null) {
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this is the last window and we had requested a starting
23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // transition window, well there is no point now.
23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                atoken.startingData = null;
23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (atoken.allAppWindows.size() == 1 && atoken.startingView != null) {
23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this is the last window except for a starting transition
23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // window, we need to get rid of the starting transition.
23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_STARTING_WINDOW) {
23608a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "Schedule remove starting " + token
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + ": no more real windows");
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Message m = mH.obtainMessage(H.REMOVE_STARTING, atoken);
23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mH.sendMessage(m);
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
236706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
236819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn        if (win.mAttrs.type == TYPE_WALLPAPER) {
236919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            mLastWallpaperTimeoutTime = 0;
237019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            adjustWallpaperWindowsLocked();
237119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn        } else if ((win.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0) {
2372e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            adjustWallpaperWindowsLocked();
2373e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn        }
2374ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mInLayout) {
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assignLayersLocked();
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLayoutNeeded = true;
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            performLayoutAndPlaceSurfacesLocked();
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.mAppToken != null) {
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mAppToken.updateReportedVisibilityLocked();
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2383c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
23842e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown        mInputMonitor.updateInputWindowsLw(true /*force*/);
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    static void logSurface(WindowState w, String msg, RuntimeException where) {
2388b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        String str = "  SURFACE " + Integer.toHexString(w.hashCode())
2389b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                + ": " + msg + " / " + w.mAttrs.getTitle();
2390b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        if (where != null) {
2391b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            Slog.i(TAG, str, where);
2392b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        } else {
2393b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            Slog.i(TAG, str);
2394b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        }
2395b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn    }
2396b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
23976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void setTransparentRegionWindow(Session session, IWindow client, Region region) {
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long origId = Binder.clearCallingIdentity();
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mWindowMap) {
2401e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                WindowState w = windowForClientLocked(session, client, false);
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((w != null) && (w.mSurface != null)) {
240336991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn                    if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
240494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                            ">>> OPEN TRANSACTION setTransparentRegion");
24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Surface.openTransaction();
24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
2407b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        if (SHOW_TRANSACTIONS) logSurface(w,
2408b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                "transparentRegionHint=" + region, null);
24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mSurface.setTransparentRegionHint(region);
24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } finally {
24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Surface.closeTransaction();
241236991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn                        if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
241394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                                "<<< CLOSE TRANSACTION setTransparentRegion");
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(origId);
24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setInsetsWindow(Session session, IWindow client,
242306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy            int touchableInsets, Rect contentInsets,
2424fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            Rect visibleInsets, Region touchableRegion) {
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long origId = Binder.clearCallingIdentity();
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mWindowMap) {
2428e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                WindowState w = windowForClientLocked(session, client, false);
24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (w != null) {
24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mGivenInsetsPending = false;
24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mGivenContentInsets.set(contentInsets);
24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mGivenVisibleInsets.set(visibleInsets);
2433fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    w.mGivenTouchableRegion.set(touchableRegion);
24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mTouchableInsets = touchableInsets;
2435ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                    if (w.mGlobalScale != 1) {
2436ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                        w.mGivenContentInsets.scale(w.mGlobalScale);
2437ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                        w.mGivenVisibleInsets.scale(w.mGlobalScale);
2438ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                        w.mGivenTouchableRegion.scale(w.mGlobalScale);
2439ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                    }
24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLayoutNeeded = true;
24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    performLayoutAndPlaceSurfacesLocked();
24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(origId);
24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
244806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getWindowDisplayFrame(Session session, IWindow client,
24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Rect outDisplayFrame) {
24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
2452e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            WindowState win = windowForClientLocked(session, client, false);
24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win == null) {
24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outDisplayFrame.setEmpty();
24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outDisplayFrame.set(win.mDisplayFrame);
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2461bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen    public void setWindowWallpaperPositionLocked(WindowState window, float x, float y,
2462bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen            float xStep, float yStep) {
2463c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        if (window.mWallpaperX != x || window.mWallpaperY != y)  {
2464c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn            window.mWallpaperX = x;
2465c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn            window.mWallpaperY = y;
2466bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen            window.mWallpaperXStep = xStep;
2467bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen            window.mWallpaperYStep = yStep;
2468a8e5a2bcd6a0d35893187c6df42425c03be005daChet Haase            updateWallpaperOffsetLocked(window, true);
2469c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        }
2470c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn    }
2471ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
24727580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn    void wallpaperCommandComplete(IBinder window, Bundle result) {
24737580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        synchronized (mWindowMap) {
24747580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            if (mWaitingOnWallpaper != null &&
24757580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    mWaitingOnWallpaper.mClient.asBinder() == window) {
24767580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                mWaitingOnWallpaper = null;
24777580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                mWindowMap.notifyAll();
24787580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            }
24797580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        }
24807580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn    }
2481ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
24827580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn    public Bundle sendWindowWallpaperCommandLocked(WindowState window,
24837580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            String action, int x, int y, int z, Bundle extras, boolean sync) {
24847580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        if (window == mWallpaperTarget || window == mLowerWallpaperTarget
24857580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                || window == mUpperWallpaperTarget) {
24867580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            boolean doWait = sync;
24877580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            int curTokenIndex = mWallpaperTokens.size();
24887580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            while (curTokenIndex > 0) {
24897580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                curTokenIndex--;
24907580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                WindowToken token = mWallpaperTokens.get(curTokenIndex);
24917580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                int curWallpaperIndex = token.windows.size();
24927580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                while (curWallpaperIndex > 0) {
24937580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    curWallpaperIndex--;
24947580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    WindowState wallpaper = token.windows.get(curWallpaperIndex);
24957580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    try {
24967580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        wallpaper.mClient.dispatchWallpaperCommand(action,
24977580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                x, y, z, extras, sync);
24987580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        // We only want to be synchronous with one wallpaper.
24997580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        sync = false;
25007580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    } catch (RemoteException e) {
25017580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    }
25027580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                }
25037580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            }
2504ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
25057580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            if (doWait) {
25067580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                // XXX Need to wait for result.
25077580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            }
25087580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        }
2509ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
25107580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        return null;
25117580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn    }
2512ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
25139a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    public int relayoutWindow(Session session, IWindow client, int seq,
25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowManager.LayoutParams attrs, int requestedWidth,
25156d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn            int requestedHeight, int viewVisibility, int flags,
25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Rect outFrame, Rect outContentInsets, Rect outVisibleInsets,
2517694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            Configuration outConfig, Surface outSurface) {
25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean displayed = false;
25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean inTouchMode;
2520e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        boolean configChanged;
25216d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn        boolean surfaceChanged = false;
2522ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato
2523ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato        // if they don't have this permission, mask out the status bar bits
25249a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        int systemUiVisibility = 0;
2525ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato        if (attrs != null) {
25269a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            systemUiVisibility = (attrs.systemUiVisibility|attrs.subtreeSystemUiVisibility);
25279a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            if ((systemUiVisibility & StatusBarManager.DISABLE_MASK) != 0) {
2528a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR)
2529a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        != PackageManager.PERMISSION_GRANTED) {
25309a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                    systemUiVisibility &= ~StatusBarManager.DISABLE_MASK;
2531a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                }
2532ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato            }
2533ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato        }
25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long origId = Binder.clearCallingIdentity();
253506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
2537e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            WindowState win = windowForClientLocked(session, client, false);
25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win == null) {
25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return 0;
25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mRequestedWidth = requestedWidth;
25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mRequestedHeight = requestedHeight;
25439a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            if (attrs != null && seq == win.mSeq) {
25449a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                win.mSystemUiVisibility = systemUiVisibility;
25459a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            }
25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (attrs != null) {
25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPolicy.adjustWindowParamsLw(attrs);
25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
255006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
25516d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn            win.mSurfaceDestroyDeferred =
25526d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                    (flags&WindowManagerImpl.RELAYOUT_DEFER_SURFACE_DESTROY) != 0;
25536d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn
25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int attrChanges = 0;
25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flagChanges = 0;
25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (attrs != null) {
25570e60db221c80bb1c57eaa7989b7079e5ba5a27a4Dianne Hackborn                if (win.mAttrs.type != attrs.type) {
25580e60db221c80bb1c57eaa7989b7079e5ba5a27a4Dianne Hackborn                    throw new IllegalArgumentException(
25590e60db221c80bb1c57eaa7989b7079e5ba5a27a4Dianne Hackborn                            "Window type can not be changed after the window is added.");
25600e60db221c80bb1c57eaa7989b7079e5ba5a27a4Dianne Hackborn                }
25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                flagChanges = win.mAttrs.flags ^= attrs.flags;
25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                attrChanges = win.mAttrs.copyFrom(attrs);
25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_LAYOUT) Slog.v(TAG, "Relayout " + win + ": " + win.mAttrs);
25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25675fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            win.mEnforceSizeCompat = (win.mAttrs.flags & FLAG_COMPATIBLE_WINDOW) != 0;
25685fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((attrChanges & WindowManager.LayoutParams.ALPHA_CHANGED) != 0) {
25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mAlpha = attrs.alpha;
25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final boolean scaledWindow =
25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ((win.mAttrs.flags & WindowManager.LayoutParams.FLAG_SCALED) != 0);
25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (scaledWindow) {
25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // requested{Width|Height} Surface's physical size
25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // attrs.{width|height} Size on screen
25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mHScale = (attrs.width  != requestedWidth)  ?
25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        (attrs.width  / (float)requestedWidth) : 1.0f;
25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mVScale = (attrs.height != requestedHeight) ?
25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        (attrs.height / (float)requestedHeight) : 1.0f;
25839b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn            } else {
25849b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn                win.mHScale = win.mVScale = 1;
25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean imMayMove = (flagChanges&(
25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM |
25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)) != 0;
259006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean focusMayChange = win.mViewVisibility != viewVisibility
25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || ((flagChanges&WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) != 0)
25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || (!win.mRelayoutCalled);
259406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
25954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            boolean wallpaperMayMove = win.mViewVisibility != viewVisibility
25964c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    && (win.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0;
25979e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn            wallpaperMayMove |= (flagChanges & FLAG_SHOW_WALLPAPER) != 0;
2598ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mRelayoutCalled = true;
26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int oldVisibility = win.mViewVisibility;
26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mViewVisibility = viewVisibility;
260229aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn            if (DEBUG_SCREEN_ON) {
260329aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                RuntimeException stack = new RuntimeException();
260429aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                stack.fillInStackTrace();
260529aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                Slog.i(TAG, "Relayout " + win + ": oldVis=" + oldVisibility
260629aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                        + " newVis=" + viewVisibility, stack);
260729aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn            }
26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (viewVisibility == View.VISIBLE &&
26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (win.mAppToken == null || !win.mAppToken.clientHidden)) {
26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                displayed = !win.isVisibleLw();
26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.mExiting) {
2612cef37fb481d16eda2b304887a8738ed599bc1b21satok                    win.cancelExitAnimationForNextAnimationLocked();
26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.mDestroying) {
26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mDestroying = false;
26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mDestroySurface.remove(win);
26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (oldVisibility == View.GONE) {
26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mEnterAnimationPending = true;
26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2621694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                if (displayed) {
2622694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    if (win.mSurface != null && !win.mDrawPending
2623694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            && !win.mCommitDrawPending && !mDisplayFrozen
2624bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn                            && mDisplayEnabled && mPolicy.isScreenOnFully()) {
2625694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        applyEnterAnimationLocked(win);
2626694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    }
2627694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    if ((win.mAttrs.flags
2628694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            & WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON) != 0) {
2629694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        if (DEBUG_VISIBILITY) Slog.v(TAG,
2630694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                "Relayout window turning screen on: " + win);
2631694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        win.mTurnOnScreen = true;
2632694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    }
2633694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    int diff = 0;
2634694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    if (win.mConfiguration != mCurConfiguration
2635694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            && (win.mConfiguration == null
2636694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                    || (diff=mCurConfiguration.diff(win.mConfiguration)) != 0)) {
2637694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        win.mConfiguration = mCurConfiguration;
2638694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        if (DEBUG_CONFIGURATION) {
2639694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            Slog.i(TAG, "Window " + win + " visible with new config: "
2640694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                    + win.mConfiguration + " / 0x"
2641694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                    + Integer.toHexString(diff));
2642694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        }
2643694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        outConfig.setTo(mCurConfiguration);
2644694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    }
264593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                }
26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((attrChanges&WindowManager.LayoutParams.FORMAT_CHANGED) != 0) {
26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // To change the format, we need to re-build the surface.
26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.destroySurfaceLocked();
26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    displayed = true;
26506d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                    surfaceChanged = true;
26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
26536d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                    if (win.mSurface == null) {
26546d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                        surfaceChanged = true;
26556d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                    }
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Surface surface = win.createSurfaceLocked();
26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (surface != null) {
26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outSurface.copyFrom(surface);
26593b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        win.mReportDestroySurface = false;
26603b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        win.mSurfacePendingDestroy = false;
26618a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (SHOW_TRANSACTIONS) Slog.i(TAG,
26620586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                "  OUT SURFACE " + outSurface + ": copied");
26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
26640586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                        // For some reason there isn't a surface.  Clear the
26650586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                        // caller's object so they see the same state.
26660586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                        outSurface.release();
26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (Exception e) {
26692e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                    mInputMonitor.updateInputWindowsLw(true /*force*/);
2670e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
26718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Exception thrown when creating surface for client "
26720586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                             + client + " (" + win.mAttrs.getTitle() + ")",
26730586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                             e);
26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Binder.restoreCallingIdentity(origId);
26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return 0;
26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (displayed) {
26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    focusMayChange = true;
26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.mAttrs.type == TYPE_INPUT_METHOD
26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && mInputMethodWindow == null) {
26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mInputMethodWindow = win;
26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    imMayMove = true;
26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2685558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                if (win.mAttrs.type == TYPE_BASE_APPLICATION
2686558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                        && win.mAppToken != null
2687558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                        && win.mAppToken.startingWindow != null) {
2688558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                    // Special handling of starting window over the base
2689558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                    // window of the app: propagate lock screen flags to it,
2690558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                    // to provide the correct semantics while starting.
2691558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                    final int mask =
2692558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
2693ef73162887943e16587b8e737b19e59348338e8cMike Lockwood                        | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
2694ef73162887943e16587b8e737b19e59348338e8cMike Lockwood                        | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON;
2695558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                    WindowManager.LayoutParams sa = win.mAppToken.startingWindow.mAttrs;
2696558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                    sa.flags = (sa.flags&~mask) | (win.mAttrs.flags&mask);
2697558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                }
26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mEnterAnimationPending = false;
27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.mSurface != null) {
27018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_VISIBILITY) Slog.i(TAG, "Relayout invis " + win
27023b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            + ": mExiting=" + win.mExiting
27033b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            + " mSurfacePendingDestroy=" + win.mSurfacePendingDestroy);
27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If we are not currently running the exit animation, we
27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // need to see about starting one.
27063b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    if (!win.mExiting || win.mSurfacePendingDestroy) {
27076d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                        surfaceChanged = true;
27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Try starting an animation; if there isn't one, we
27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // can destroy the surface right away.
27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int transit = WindowManagerPolicy.TRANSIT_EXIT;
27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (win.getAttrs().type == TYPE_APPLICATION_STARTING) {
27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            transit = WindowManagerPolicy.TRANSIT_PREVIEW_DONE;
27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
27143b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        if (!win.mSurfacePendingDestroy && win.isWinVisibleLw() &&
27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              applyAnimationLocked(win, transit, false)) {
27163b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            focusMayChange = true;
27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            win.mExiting = true;
27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (win.isAnimating()) {
27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Currently in a hide animation... turn this into
27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // an exit.
27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            win.mExiting = true;
27226136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                        } else if (win == mWallpaperTarget) {
27236136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                            // If the wallpaper is currently behind this
27246136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                            // window, we need to change both of them inside
27256136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                            // of a transaction to avoid artifacts.
27266136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                            win.mExiting = true;
27276136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                            win.mAnimating = true;
27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (mInputMethodWindow == win) {
27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                mInputMethodWindow = null;
27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            win.destroySurfaceLocked();
27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2736ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
27373b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                if (win.mSurface == null || (win.getAttrs().flags
27383b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        & WindowManager.LayoutParams.FLAG_KEEP_SURFACE_WHILE_ANIMATING) == 0
27393b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        || win.mSurfacePendingDestroy) {
27406d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                    // We could be called from a local process, which
27413b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // means outSurface holds its current surface.  Ensure the
27426d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                    // surface object is cleared, but we don't necessarily want
27436d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                    // it actually destroyed at this point.
27443b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    win.mSurfacePendingDestroy = false;
27453b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    outSurface.release();
27468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_VISIBILITY) Slog.i(TAG, "Releasing surface in: " + win);
27473b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                } else if (win.mSurface != null) {
27488a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_VISIBILITY) Slog.i(TAG,
27493b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            "Keeping surface, will report destroy: " + win);
27503b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    win.mReportDestroySurface = true;
27513b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    outSurface.copyFrom(win.mSurface);
27523b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                }
27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (focusMayChange) {
27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //System.out.println("Focus may change: " + win.mAttrs.getTitle());
27573a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                if (updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
27583a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        false /*updateInputWindows*/)) {
27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    imMayMove = false;
27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //System.out.println("Relayout " + win + ": focus=" + mCurrentFocus);
27629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
276306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
2764c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            // updateFocusedWindowLocked() already assigned layers so we only need to
2765c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            // reassign them at this point if the IM window state gets shuffled
2766c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            boolean assignLayers = false;
276706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imMayMove) {
27698abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn                if (moveInputMethodWindowsIfNeededLocked(false) || displayed) {
27708abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn                    // Little hack here -- we -should- be able to rely on the
27718abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn                    // function to return true if the IME has moved and needs
27728abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn                    // its layer recomputed.  However, if the IME was hidden
27738abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn                    // and isn't actually moved in the list, its layer may be
27748abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn                    // out of data so we make sure to recompute it.
27759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    assignLayers = true;
27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27784c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            if (wallpaperMayMove) {
27790586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                if ((adjustWallpaperWindowsLocked()&ADJUST_WALLPAPER_LAYERS_CHANGED) != 0) {
27804c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    assignLayers = true;
27814c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
27824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
278306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLayoutNeeded = true;
27856d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn            win.mGivenInsetsPending = (flags&WindowManagerImpl.RELAYOUT_INSETS_PENDING) != 0;
27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assignLayers) {
27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                assignLayersLocked();
27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
278994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            configChanged = updateOrientationFromAppTokensLocked(false);
27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            performLayoutAndPlaceSurfacesLocked();
2791284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            if (displayed && win.mIsWallpaper) {
279281e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn                updateWallpaperOffsetLocked(win, mAppDisplayWidth, mAppDisplayHeight, false);
2793284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            }
27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.mAppToken != null) {
27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mAppToken.updateReportedVisibilityLocked();
27969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2797ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            outFrame.set(win.mCompatFrame);
27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outContentInsets.set(win.mContentInsets);
27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outVisibleInsets.set(win.mVisibleInsets);
28008a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (localLOGV) Slog.v(
28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Relayout given client " + client.asBinder()
280206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                + ", requestedWidth=" + requestedWidth
28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", requestedHeight=" + requestedHeight
28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", viewVisibility=" + viewVisibility
28059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "\nRelayout returning frame=" + outFrame
28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", surface=" + outSurface);
28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28088a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (localLOGV || DEBUG_FOCUS) Slog.v(
28099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Relayout of " + win + ": focusMayChange=" + focusMayChange);
28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            inTouchMode = mInTouchMode;
2812e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
28132e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown            mInputMonitor.updateInputWindowsLw(true /*force*/);
28149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2816e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        if (configChanged) {
28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendNewConfiguration();
28189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
281906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
28209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
282106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
28226d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn        return (inTouchMode ? WindowManagerImpl.RELAYOUT_RES_IN_TOUCH_MODE : 0)
28236d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                | (displayed ? WindowManagerImpl.RELAYOUT_RES_FIRST_TIME : 0)
28246d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                | (surfaceChanged ? WindowManagerImpl.RELAYOUT_RES_SURFACE_CHANGED : 0);
28256d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn    }
28266d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn
28276d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn    public void performDeferredDestroyWindow(Session session, IWindow client) {
28286d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn        long origId = Binder.clearCallingIdentity();
28296d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn
28306d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn        try {
28316d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn            synchronized(mWindowMap) {
28326d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                WindowState win = windowForClientLocked(session, client, false);
28336d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                if (win == null) {
28346d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                    return;
28356d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                }
28366d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                win.destroyDeferredSurfaceLocked();
28376d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn            }
28386d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn        } finally {
28396d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn            Binder.restoreCallingIdentity(origId);
28406d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn        }
28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2843648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn    public boolean outOfMemoryWindow(Session session, IWindow client) {
2844648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        long origId = Binder.clearCallingIdentity();
2845648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn
2846648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        try {
2847648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn            synchronized(mWindowMap) {
2848648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                WindowState win = windowForClientLocked(session, client, false);
2849648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                if (win == null) {
2850648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                    return false;
2851648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                }
2852648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                return reclaimSomeSurfaceMemoryLocked(win, "from-client", false);
2853648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn            }
2854648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        } finally {
2855648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn            Binder.restoreCallingIdentity(origId);
2856648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        }
2857648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn    }
2858648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finishDrawingWindow(Session session, IWindow client) {
28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long origId = Binder.clearCallingIdentity();
28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
2862e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            WindowState win = windowForClientLocked(session, client, false);
28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win != null && win.finishDrawingLocked()) {
2864759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                if ((win.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0) {
2865759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    adjustWallpaperWindowsLocked();
2866759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                }
28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutNeeded = true;
28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                performLayoutAndPlaceSurfacesLocked();
28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28747961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov    public float getWindowCompatibilityScale(IBinder windowToken) {
28757961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov        synchronized (mWindowMap) {
28767961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov            WindowState windowState = mWindowMap.get(windowToken);
28777961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov            return (windowState != null) ? windowState.mGlobalScale : 1.0f;
28787961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov        }
28797961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov    }
28807961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov
28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private AttributeCache.Entry getCachedAnimations(WindowManager.LayoutParams lp) {
288208121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn        if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: layout params pkg="
28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + (lp != null ? lp.packageName : null)
28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " resId=0x" + (lp != null ? Integer.toHexString(lp.windowAnimations) : null));
28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (lp != null && lp.windowAnimations != 0) {
28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If this is a system resource, don't try to load it from the
28879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // application resources.  It is nice to avoid loading application
28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // resources if we can.
28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String packageName = lp.packageName != null ? lp.packageName : "android";
28909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int resId = lp.windowAnimations;
28919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((resId&0xFF000000) == 0x01000000) {
28929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                packageName = "android";
28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28948a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: picked package="
28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + packageName);
28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return AttributeCache.instance().get(packageName, resId,
28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.WindowAnimation);
28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
290106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
29023b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    private AttributeCache.Entry getCachedAnimations(String packageName, int resId) {
290308121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn        if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: package="
29043b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                + packageName + " resId=0x" + Integer.toHexString(resId));
29053b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        if (packageName != null) {
29063b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if ((resId&0xFF000000) == 0x01000000) {
29073b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                packageName = "android";
29083b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            }
29098a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: picked package="
29103b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    + packageName);
29113b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            return AttributeCache.instance().get(packageName, resId,
29123b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    com.android.internal.R.styleable.WindowAnimation);
29133b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        }
29143b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        return null;
29153b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    }
29163b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn
29176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void applyEnterAnimationLocked(WindowState win) {
29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int transit = WindowManagerPolicy.TRANSIT_SHOW;
29199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (win.mEnterAnimationPending) {
29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mEnterAnimationPending = false;
29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            transit = WindowManagerPolicy.TRANSIT_ENTER;
29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        applyAnimationLocked(win, transit, true);
29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean applyAnimationLocked(WindowState win,
29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int transit, boolean isEntrance) {
29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (win.mLocalAnimating && win.mAnimationIsEntrance == isEntrance) {
29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If we are trying to apply an animation, but already running
29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // an animation of the same type, then just leave that one alone.
29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
293406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Only apply an animation if the display isn't frozen.  If it is
29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // frozen, there is no reason to animate and it can cause strange
29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // artifacts when we unfreeze the display if some different animation
29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // is running.
2939bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn        if (!mDisplayFrozen && mDisplayEnabled && mPolicy.isScreenOnFully()) {
29409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int anim = mPolicy.selectAnimationLw(win, transit);
29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int attr = -1;
29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Animation a = null;
29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (anim != 0) {
29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                a = AnimationUtils.loadAnimation(mContext, anim);
29459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
29469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                switch (transit) {
29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case WindowManagerPolicy.TRANSIT_ENTER:
29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        attr = com.android.internal.R.styleable.WindowAnimation_windowEnterAnimation;
29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case WindowManagerPolicy.TRANSIT_EXIT:
29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        attr = com.android.internal.R.styleable.WindowAnimation_windowExitAnimation;
29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case WindowManagerPolicy.TRANSIT_SHOW:
29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        attr = com.android.internal.R.styleable.WindowAnimation_windowShowAnimation;
29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case WindowManagerPolicy.TRANSIT_HIDE:
29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        attr = com.android.internal.R.styleable.WindowAnimation_windowHideAnimation;
29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attr >= 0) {
29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    a = loadAnimation(win.mAttrs, attr);
29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29648a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_ANIM) Slog.v(TAG, "applyAnimation: win=" + win
29659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " anim=" + anim + " attr=0x" + Integer.toHexString(attr)
29669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mAnimation=" + win.mAnimation
29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " isEntrance=" + isEntrance);
29689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (a != null) {
29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_ANIM) {
2970b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    RuntimeException e = null;
2971b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (!HIDE_STACK_CRAWLS) {
2972b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        e = new RuntimeException();
2973b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        e.fillInStackTrace();
2974b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
29758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "Loaded animation " + a + " for " + win, e);
29769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
29779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.setAnimation(a);
29789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mAnimationIsEntrance = isEntrance;
29799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
29819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.clearAnimation();
29829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return win.mAnimation != null;
29859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Animation loadAnimation(WindowManager.LayoutParams lp, int animAttr) {
29889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int anim = 0;
29899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Context context = mContext;
29909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (animAttr >= 0) {
29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AttributeCache.Entry ent = getCachedAnimations(lp);
29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ent != null) {
29939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                context = ent.context;
29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                anim = ent.array.getResourceId(animAttr, 0);
29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (anim != 0) {
29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return AnimationUtils.loadAnimation(context, anim);
29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
300206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
30033b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    private Animation loadAnimation(String packageName, int resId) {
30043b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        int anim = 0;
30053b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        Context context = mContext;
30063b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        if (resId >= 0) {
30073b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            AttributeCache.Entry ent = getCachedAnimations(packageName, resId);
30083b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if (ent != null) {
30093b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                context = ent.context;
30103b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                anim = resId;
30113b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            }
30123b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        }
30133b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        if (anim != 0) {
30143b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            return AnimationUtils.loadAnimation(context, anim);
30153b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        }
30163b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        return null;
30173b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    }
30183b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn
30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean applyAnimationLocked(AppWindowToken wtoken,
3020ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            WindowManager.LayoutParams lp, int transit, boolean enter) {
30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Only apply an animation if the display isn't frozen.  If it is
30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // frozen, there is no reason to animate and it can cause strange
30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // artifacts when we unfreeze the display if some different animation
30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // is running.
3025bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn        if (!mDisplayFrozen && mDisplayEnabled && mPolicy.isScreenOnFully()) {
30260a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima            Animation a;
3027ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            if (mNextAppTransitionPackage != null) {
30283b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                a = loadAnimation(mNextAppTransitionPackage, enter ?
30293b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        mNextAppTransitionEnter : mNextAppTransitionExit);
30300a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima            } else {
30310a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                int animAttr = 0;
30320a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                switch (transit) {
30330a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                    case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN:
30340a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        animAttr = enter
30350a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                ? com.android.internal.R.styleable.WindowAnimation_activityOpenEnterAnimation
30360a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                : com.android.internal.R.styleable.WindowAnimation_activityOpenExitAnimation;
30370a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        break;
30380a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                    case WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE:
30390a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        animAttr = enter
30400a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                ? com.android.internal.R.styleable.WindowAnimation_activityCloseEnterAnimation
30410a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                : com.android.internal.R.styleable.WindowAnimation_activityCloseExitAnimation;
30420a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        break;
30430a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                    case WindowManagerPolicy.TRANSIT_TASK_OPEN:
30440a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        animAttr = enter
30450a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                ? com.android.internal.R.styleable.WindowAnimation_taskOpenEnterAnimation
30460a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                : com.android.internal.R.styleable.WindowAnimation_taskOpenExitAnimation;
30470a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        break;
30480a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                    case WindowManagerPolicy.TRANSIT_TASK_CLOSE:
30490a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        animAttr = enter
30500a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                ? com.android.internal.R.styleable.WindowAnimation_taskCloseEnterAnimation
30510a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                : com.android.internal.R.styleable.WindowAnimation_taskCloseExitAnimation;
30520a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        break;
30530a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                    case WindowManagerPolicy.TRANSIT_TASK_TO_FRONT:
30540a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        animAttr = enter
30550a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                ? com.android.internal.R.styleable.WindowAnimation_taskToFrontEnterAnimation
30560a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                : com.android.internal.R.styleable.WindowAnimation_taskToFrontExitAnimation;
30570a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        break;
30580a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                    case WindowManagerPolicy.TRANSIT_TASK_TO_BACK:
30590a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        animAttr = enter
30605a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima                                ? com.android.internal.R.styleable.WindowAnimation_taskToBackEnterAnimation
30610a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                : com.android.internal.R.styleable.WindowAnimation_taskToBackExitAnimation;
30620a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        break;
306325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                    case WindowManagerPolicy.TRANSIT_WALLPAPER_OPEN:
306425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        animAttr = enter
306525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                ? com.android.internal.R.styleable.WindowAnimation_wallpaperOpenEnterAnimation
306625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                : com.android.internal.R.styleable.WindowAnimation_wallpaperOpenExitAnimation;
306725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        break;
306825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                    case WindowManagerPolicy.TRANSIT_WALLPAPER_CLOSE:
306925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        animAttr = enter
307025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                ? com.android.internal.R.styleable.WindowAnimation_wallpaperCloseEnterAnimation
307125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                : com.android.internal.R.styleable.WindowAnimation_wallpaperCloseExitAnimation;
307225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        break;
307325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                    case WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_OPEN:
3074f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                        animAttr = enter
307525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenEnterAnimation
307625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenExitAnimation;
3077f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                        break;
307825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                    case WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_CLOSE:
3079f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                        animAttr = enter
308025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseEnterAnimation
308125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseExitAnimation;
3082f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                        break;
30830a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                }
3084bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                a = animAttr != 0 ? loadAnimation(lp, animAttr) : null;
30858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_ANIM) Slog.v(TAG, "applyAnimation: wtoken=" + wtoken
30860a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        + " anim=" + a
30870a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        + " animAttr=0x" + Integer.toHexString(animAttr)
30880a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        + " transit=" + transit);
30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (a != null) {
30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_ANIM) {
3092b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    RuntimeException e = null;
3093b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (!HIDE_STACK_CRAWLS) {
3094b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        e = new RuntimeException();
3095b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        e.fillInStackTrace();
3096b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
30978a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "Loaded animation " + a + " for " + wtoken, e);
30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.setAnimation(a);
31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.clearAnimation();
31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return wtoken.animation != null;
31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Application Window Tokens
31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3112be70785f9b2dbd2c52fd8676d99bc64b22784201Dianne Hackborn    public void validateAppTokens(List<IBinder> tokens) {
31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int v = tokens.size()-1;
31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int m = mAppTokens.size()-1;
31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (v >= 0 && m >= 0) {
31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = mAppTokens.get(m);
31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken.removed) {
31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                m--;
31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tokens.get(v) != wtoken.token) {
31228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Tokens out of sync: external is " + tokens.get(v)
31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + " @ " + v + ", internal is " + wtoken.token + " @ " + m);
31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            v--;
31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            m--;
31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (v >= 0) {
31298a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "External token not found: " + tokens.get(v) + " @ " + v);
31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            v--;
31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (m >= 0) {
31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = mAppTokens.get(m);
31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!wtoken.removed) {
31358a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Invalid internal token: " + wtoken.token + " @ " + m);
31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            m--;
31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean checkCallingPermission(String permission, String func) {
31429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Quick check: if the calling permission is me, it's all okay.
31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Binder.getCallingPid() == Process.myPid()) {
31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
31459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
314606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mContext.checkCallingPermission(permission)
31489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                == PackageManager.PERMISSION_GRANTED) {
31499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
31509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String msg = "Permission Denial: " + func + " from pid="
31529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Binder.getCallingPid()
31539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", uid=" + Binder.getCallingUid()
31549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " requires " + permission;
31558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        Slog.w(TAG, msg);
31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
315806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AppWindowToken findAppWindowToken(IBinder token) {
31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowToken wtoken = mTokenMap.get(token);
31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wtoken == null) {
31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return wtoken.appWindowToken;
31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
316606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void addWindowToken(IBinder token, int type) {
31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "addWindowToken()")) {
3170cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
317206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken wtoken = mTokenMap.get(token);
31759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken != null) {
31768a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to add existing input method token: " + token);
31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            wtoken = new WindowToken(this, token, type, true);
31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTokenMap.put(token, wtoken);
31814c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            if (type == TYPE_WALLPAPER) {
31824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                mWallpaperTokens.add(wtoken);
31834c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
318606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeWindowToken(IBinder token) {
31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "removeWindowToken()")) {
3190cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long origId = Binder.clearCallingIdentity();
31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken wtoken = mTokenMap.remove(token);
31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken != null) {
31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean delayed = false;
31989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!wtoken.hidden) {
31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wtoken.hidden = true;
320006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int N = wtoken.windows.size();
32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean changed = false;
320306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
32049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i=0; i<N; i++) {
32059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        WindowState win = wtoken.windows.get(i);
32069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (win.isAnimating()) {
32089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            delayed = true;
32099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
321006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
32119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (win.isVisibleNow()) {
32129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            applyAnimationLocked(win,
32139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    WindowManagerPolicy.TRANSIT_EXIT, false);
32149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            changed = true;
32159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
32169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
32179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (changed) {
32199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLayoutNeeded = true;
32209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        performLayoutAndPlaceSurfacesLocked();
32213a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL,
32223a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                                false /*updateInputWindows*/);
32239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
322406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (delayed) {
32269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mExitingTokens.add(wtoken);
32274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    } else if (wtoken.windowType == TYPE_WALLPAPER) {
32284c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                        mWallpaperTokens.remove(wtoken);
32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
323106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
32322e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                mInputMonitor.updateInputWindowsLw(true /*force*/);
32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
32348a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to remove non-existing token: " + token);
32359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
32389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void addAppToken(int addPos, IApplicationToken token,
32419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int groupId, int requestedOrientation, boolean fullscreen) {
32429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
32439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "addAppToken()")) {
3244cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
32459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3246349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
3247349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // Get the dispatching timeout here while we are not holding any locks so that it
3248349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // can be cached by the AppWindowToken.  The timeout value is used later by the
3249349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // input dispatcher in code that does hold locks.  If we did not cache the value
3250349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // here we would run the chance of introducing a deadlock between the window manager
3251349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // (which holds locks while updating the input dispatcher state) and the activity manager
3252349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // (which holds locks while querying the application token).
3253349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        long inputDispatchingTimeoutNanos;
3254349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        try {
3255349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown            inputDispatchingTimeoutNanos = token.getKeyDispatchingTimeout() * 1000000L;
3256349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        } catch (RemoteException ex) {
3257349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown            Slog.w(TAG, "Could not get dispatching timeout.", ex);
3258349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown            inputDispatchingTimeoutNanos = DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS;
3259349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        }
326006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token.asBinder());
32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken != null) {
32648a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to add existing app token: " + token);
32659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
32669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            wtoken = new AppWindowToken(this, token);
3268349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown            wtoken.inputDispatchingTimeoutNanos = inputDispatchingTimeoutNanos;
32699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.groupId = groupId;
32709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.appFullscreen = fullscreen;
32719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.requestedOrientation = requestedOrientation;
3272f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            if (DEBUG_TOKEN_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG, "addAppToken: " + wtoken);
32739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAppTokens.add(addPos, wtoken);
32749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTokenMap.put(token.asBinder(), wtoken);
327506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
32769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Application tokens start out hidden.
32779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.hidden = true;
32789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.hiddenRequested = true;
327906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
32809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //dump();
32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
328306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
32849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAppGroupId(IBinder token, int groupId) {
32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
32869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppStartingIcon()")) {
3287cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
32889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
32919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token);
32929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null) {
32938a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to set group id of non-existing app token: " + token);
32949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
32959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.groupId = groupId;
32979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
329906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
33009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getOrientationFromWindowsLocked() {
3301bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn        if (mDisplayFrozen || mOpeningApps.size() > 0 || mClosingApps.size() > 0) {
3302bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn            // If the display is frozen, some activities may be in the middle
3303bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn            // of restarting, and thus have removed their old window.  If the
3304bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn            // window has the flag to hide the lock screen, then the lock screen
3305bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn            // can re-appear and inflict its own orientation on us.  Keep the
3306bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn            // orientation stable until this all settles down.
3307bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn            return mLastWindowForcedOrientation;
3308bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn        }
3309bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn
33109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = mWindows.size() - 1;
33119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (pos >= 0) {
3312e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState wtoken = mWindows.get(pos);
33139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos--;
33149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken.mAppToken != null) {
33159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We hit an application window. so the orientation will be determined by the
33169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // app window. No point in continuing further.
3317bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                return (mLastWindowForcedOrientation=ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
33189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3319b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate            if (!wtoken.isVisibleLw() || !wtoken.mPolicyVisibilityAfterAnim) {
33209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
33219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int req = wtoken.mAttrs.screenOrientation;
33239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if((req == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) ||
33249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (req == ActivityInfo.SCREEN_ORIENTATION_BEHIND)){
33259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
33269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
3327bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                return (mLastWindowForcedOrientation=req);
33289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3330bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn        return (mLastWindowForcedOrientation=ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
33319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
333206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
33339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getOrientationFromAppTokensLocked() {
3334e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        int pos = mAppTokens.size() - 1;
3335e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        int curGroup = 0;
3336e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        int lastOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
3337e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        boolean findingBehind = false;
3338e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        boolean haveGroup = false;
3339e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        boolean lastFullscreen = false;
3340e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        while (pos >= 0) {
3341e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            AppWindowToken wtoken = mAppTokens.get(pos);
3342e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            pos--;
3343bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn
3344bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn            if (DEBUG_APP_ORIENTATION) Slog.v(TAG, "Checking app orientation: " + wtoken);
3345bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn
3346e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // if we're about to tear down this window and not seek for
3347e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // the behind activity, don't use it for orientation
3348e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            if (!findingBehind
3349e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    && (!wtoken.hidden && wtoken.hiddenRequested)) {
3350bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                if (DEBUG_ORIENTATION) Slog.v(TAG, "Skipping " + wtoken
3351bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                        + " -- going to hide");
3352e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                continue;
3353e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
3354e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
3355e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            if (!haveGroup) {
3356e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // We ignore any hidden applications on the top.
3357e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                if (wtoken.hiddenRequested || wtoken.willBeHidden) {
3358bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                    if (DEBUG_ORIENTATION) Slog.v(TAG, "Skipping " + wtoken
3359bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                            + " -- hidden on top");
3360105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    continue;
3361105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                }
3362e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                haveGroup = true;
3363e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                curGroup = wtoken.groupId;
3364e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                lastOrientation = wtoken.requestedOrientation;
3365e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            } else if (curGroup != wtoken.groupId) {
3366e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // If we have hit a new application group, and the bottom
3367e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // of the previous group didn't explicitly say to use
3368e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // the orientation behind it, and the last app was
3369e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // full screen, then we'll stick with the
3370e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // user's orientation.
3371e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                if (lastOrientation != ActivityInfo.SCREEN_ORIENTATION_BEHIND
3372e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                        && lastFullscreen) {
3373bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                    if (DEBUG_ORIENTATION) Slog.v(TAG, "Done at " + wtoken
3374bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                            + " -- end of group, return " + lastOrientation);
3375e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    return lastOrientation;
3376e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                }
3377e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
3378e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            int or = wtoken.requestedOrientation;
3379e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // If this application is fullscreen, and didn't explicitly say
3380e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // to use the orientation behind it, then just take whatever
3381e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // orientation it has and ignores whatever is under it.
3382e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            lastFullscreen = wtoken.appFullscreen;
3383e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            if (lastFullscreen
3384e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    && or != ActivityInfo.SCREEN_ORIENTATION_BEHIND) {
3385bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                if (DEBUG_ORIENTATION) Slog.v(TAG, "Done at " + wtoken
3386bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                        + " -- full screen, return " + or);
3387e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                return or;
3388e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
3389e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // If this application has requested an explicit orientation,
3390e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // then use it.
3391e5439f228f603f60febe058f633d91d5af2fff76Dianne Hackborn            if (or != ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
3392e5439f228f603f60febe058f633d91d5af2fff76Dianne Hackborn                    && or != ActivityInfo.SCREEN_ORIENTATION_BEHIND) {
3393bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                if (DEBUG_ORIENTATION) Slog.v(TAG, "Done at " + wtoken
3394bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                        + " -- explicitly set, return " + or);
3395e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                return or;
3396e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
3397e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            findingBehind |= (or == ActivityInfo.SCREEN_ORIENTATION_BEHIND);
3398e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        }
3399bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn        if (DEBUG_ORIENTATION) Slog.v(TAG, "No app is requesting an orientation");
3400e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
34019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
340206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
34039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Configuration updateOrientationFromAppTokens(
3404105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            Configuration currentConfig, IBinder freezeThisOneIfNeeded) {
3405cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
3406cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn                "updateOrientationFromAppTokens()")) {
3407cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
3408cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn        }
3409ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
3410e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        Configuration config = null;
34119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long ident = Binder.clearCallingIdentity();
3412e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
34147916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            config = updateOrientationFromAppTokensLocked(currentConfig,
34157916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    freezeThisOneIfNeeded);
34167916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
34177916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
34187916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        Binder.restoreCallingIdentity(ident);
34197916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        return config;
34207916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    }
34217916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
34227916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    private Configuration updateOrientationFromAppTokensLocked(
34237916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            Configuration currentConfig, IBinder freezeThisOneIfNeeded) {
34247916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        Configuration config = null;
34257916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
34267916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        if (updateOrientationFromAppTokensLocked(false)) {
34277916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (freezeThisOneIfNeeded != null) {
34287916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                AppWindowToken wtoken = findAppWindowToken(
34297916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        freezeThisOneIfNeeded);
34307916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                if (wtoken != null) {
34317916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    startAppFreezingScreenLocked(wtoken,
34327916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                            ActivityInfo.CONFIG_ORIENTATION);
34337916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                }
34347916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
34357916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            config = computeNewConfigurationLocked();
34367916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
34377916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        } else if (currentConfig != null) {
34387916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            // No obvious action we need to take, but if our current
34397916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            // state mismatches the activity manager's, update it,
34407916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            // disregarding font scale, which should remain set to
34417916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            // the value of the previous configuration.
34427916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            mTempConfiguration.setToDefaults();
34437916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            mTempConfiguration.fontScale = currentConfig.fontScale;
34447916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (computeNewConfigurationLocked(mTempConfiguration)) {
34457916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                if (currentConfig.diff(mTempConfiguration) != 0) {
34467916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    mWaitingForConfig = true;
34477916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    mLayoutNeeded = true;
34487916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    startFreezingDisplayLocked(false);
34497916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    config = new Configuration(mTempConfiguration);
3450e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                }
3451bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn            }
34529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3453e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
34549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return config;
34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
345606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
34579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
3458e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * Determine the new desired orientation of the display, returning
3459e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * a non-null new Configuration if it has changed from the current
3460e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * orientation.  IF TRUE IS RETURNED SOMEONE MUST CALL
3461e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * setNewConfiguration() TO TELL THE WINDOW MANAGER IT CAN UNFREEZE THE
3462e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * SCREEN.  This will typically be done for you if you call
3463e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * sendNewConfiguration().
3464e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     *
34659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The orientation is computed from non-application windows first. If none of
34669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the non-application windows specify orientation, the orientation is computed from
346706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     * application tokens.
34689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.IWindowManager#updateOrientationFromAppTokens(
34699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * android.os.IBinder)
34709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
347194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn    boolean updateOrientationFromAppTokensLocked(boolean inTransaction) {
34729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean changed = false;
34739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long ident = Binder.clearCallingIdentity();
34749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3475c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            int req = computeForcedAppOrientationLocked();
347606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (req != mForcedAppOrientation) {
34789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mForcedAppOrientation = req;
34799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //send a message to Policy indicating orientation change to take
34809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //action like disabling/enabling sensors etc.,
3481c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                mPolicy.setCurrentOrientationLw(req);
348201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown                if (updateRotationUncheckedLocked(inTransaction)) {
3483e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    changed = true;
34849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3486105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
3487e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            return changed;
34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(ident);
34909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
349206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3493c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    int computeForcedAppOrientationLocked() {
3494c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        int req = getOrientationFromWindowsLocked();
3495c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        if (req == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) {
3496c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            req = getOrientationFromAppTokensLocked();
3497c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        }
3498c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        return req;
3499c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
350006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3501e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    public void setNewConfiguration(Configuration config) {
3502e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
3503e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                "setNewConfiguration()")) {
3504e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
3505e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        }
3506e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
3507e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        synchronized(mWindowMap) {
3508e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            mCurConfiguration = new Configuration(config);
3509e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            mWaitingForConfig = false;
3510e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            performLayoutAndPlaceSurfacesLocked();
3511e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        }
3512e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    }
3513e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
35149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAppOrientation(IApplicationToken token, int requestedOrientation) {
35159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
35169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppOrientation()")) {
3517cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
35189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
351906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
35209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
35219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token.asBinder());
35229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null) {
35238a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to set orientation of non-existing app token: " + token);
35249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
35259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
352606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
35279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.requestedOrientation = requestedOrientation;
35289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
353006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
35319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getAppOrientation(IApplicationToken token) {
35329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
35339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token.asBinder());
35349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null) {
35359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
35369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
353706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
35389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return wtoken.requestedOrientation;
35399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
354106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setFocusedApp(IBinder token, boolean moveFocusNow) {
35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
35449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setFocusedApp()")) {
3545cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
35499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean changed = false;
35509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token == null) {
35518a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_FOCUS) Slog.v(TAG, "Clearing focused app, was " + mFocusedApp);
35529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                changed = mFocusedApp != null;
35539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFocusedApp = null;
355400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                if (changed) {
355500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    mInputMonitor.setFocusedAppLw(null);
3556349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown                }
35579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AppWindowToken newFocus = findAppWindowToken(token);
35599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (newFocus == null) {
35608a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to set focus to non-existing app token: " + token);
35619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
35629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                changed = mFocusedApp != newFocus;
35649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFocusedApp = newFocus;
35658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_FOCUS) Slog.v(TAG, "Set focused app to: " + mFocusedApp);
356600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                if (changed) {
356700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    mInputMonitor.setFocusedAppLw(newFocus);
3568349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown                }
35699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (moveFocusNow && changed) {
35729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final long origId = Binder.clearCallingIdentity();
35733a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/);
35749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.restoreCallingIdentity(origId);
35759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35797da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn    public void prepareAppTransition(int transit, boolean alwaysKeepCurrent) {
35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
35819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "prepareAppTransition()")) {
3582cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
35839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
358406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
35868a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_APP_TRANSITIONS) Slog.v(
35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    TAG, "Prepare app transition: transit=" + transit
35889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mNextAppTransition=" + mNextAppTransition);
3589bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn            if (!mDisplayFrozen && mDisplayEnabled && mPolicy.isScreenOnFully()) {
3590bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET
3591bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                        || mNextAppTransition == WindowManagerPolicy.TRANSIT_NONE) {
35929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNextAppTransition = transit;
35937da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                } else if (!alwaysKeepCurrent) {
35947da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    if (transit == WindowManagerPolicy.TRANSIT_TASK_OPEN
35957da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            && mNextAppTransition == WindowManagerPolicy.TRANSIT_TASK_CLOSE) {
35967da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        // Opening a new task always supersedes a close for the anim.
35977da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        mNextAppTransition = transit;
35987da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    } else if (transit == WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN
35997da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            && mNextAppTransition == WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE) {
36007da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        // Opening a new activity always supersedes a close for the anim.
36017da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        mNextAppTransition = transit;
36027da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    }
36039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppTransitionReady = false;
36059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppTransitionTimeout = false;
36069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStartingIconInTransition = false;
36079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSkipAppTransitionAnimation = false;
36089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mH.removeMessages(H.APP_TRANSITION_TIMEOUT);
36099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mH.sendMessageDelayed(mH.obtainMessage(H.APP_TRANSITION_TIMEOUT),
36109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        5000);
36119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getPendingAppTransition() {
36169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mNextAppTransition;
36179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
361806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
36193b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    public void overridePendingAppTransition(String packageName,
36203b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            int enterAnim, int exitAnim) {
36218b571a817cc953ce96750f440645f104c7f55157Dianne Hackborn        if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
36223b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            mNextAppTransitionPackage = packageName;
36233b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            mNextAppTransitionEnter = enterAnim;
36243b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            mNextAppTransitionExit = exitAnim;
36253b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        }
36263b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    }
3627ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void executeAppTransition() {
36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "executeAppTransition()")) {
3631cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
36329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
363306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
36353b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if (DEBUG_APP_TRANSITIONS) {
36363b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                RuntimeException e = new RuntimeException("here");
36373b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                e.fillInStackTrace();
36388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Execute app transition: mNextAppTransition="
36393b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        + mNextAppTransition, e);
36403b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            }
3641bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn            if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
36429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppTransitionReady = true;
36439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final long origId = Binder.clearCallingIdentity();
36449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                performLayoutAndPlaceSurfacesLocked();
36459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.restoreCallingIdentity(origId);
36469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAppStartingWindow(IBinder token, String pkg,
36512f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn            int theme, CompatibilityInfo compatInfo,
36522f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn            CharSequence nonLocalizedLabel, int labelRes, int icon,
36537eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn            int windowFlags, IBinder transferFrom, boolean createIfNeeded) {
36549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
36559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppStartingIcon()")) {
3656cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
36579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
36608a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_STARTING_WINDOW) Slog.v(
36619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    TAG, "setAppStartingIcon: token=" + token + " pkg=" + pkg
36629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " transferFrom=" + transferFrom);
366306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token);
36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null) {
36668a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to set icon of non-existing app token: " + token);
36679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
36689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If the display is frozen, we won't do anything until the
36719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // actual window is displayed so there is no reason to put in
36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // the starting window.
3673bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn            if (mDisplayFrozen || !mDisplayEnabled || !mPolicy.isScreenOnFully()) {
36749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
36759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
367606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
36779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken.startingData != null) {
36789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
36799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
368006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
36819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (transferFrom != null) {
36829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AppWindowToken ttoken = findAppWindowToken(transferFrom);
36839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ttoken != null) {
36849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowState startingWindow = ttoken.startingWindow;
36859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (startingWindow != null) {
36869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mStartingIconInTransition) {
36879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // In this case, the starting icon has already
36889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // been displayed, so start letting windows get
36899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // shown immediately without any more transitions.
36909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mSkipAppTransitionAnimation = true;
36919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
36928a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_STARTING_WINDOW) Slog.v(TAG,
36939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Moving existing starting from " + ttoken
36949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " to " + wtoken);
36959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        final long origId = Binder.clearCallingIdentity();
369606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
36979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Transfer the starting window over to the new
36989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // token.
36999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wtoken.startingData = ttoken.startingData;
37009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wtoken.startingView = ttoken.startingView;
37019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wtoken.startingWindow = startingWindow;
37029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.startingData = null;
37039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.startingView = null;
37049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.startingWindow = null;
37059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.startingMoved = true;
37069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        startingWindow.mToken = wtoken;
3707ef49c57bdcdb6c808870570c205434b002431c37Dianne Hackborn                        startingWindow.mRootToken = wtoken;
37089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        startingWindow.mAppToken = wtoken;
3709f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                        if (DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG,
37109bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                                "Removing starting window: " + startingWindow);
37119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mWindows.remove(startingWindow);
3712dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                        mWindowsChanged = true;
3713f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                        if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Removing starting " + startingWindow
3714f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                + " from " + ttoken);
37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.windows.remove(startingWindow);
37169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.allAppWindows.remove(startingWindow);
37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        addWindowToListInOrderLocked(startingWindow, true);
371806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
37199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Propagate other interesting state between the
37209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // tokens.  If the old token is displayed, we should
37219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // immediately force the new one to be displayed.  If
37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // it is animating, we need to move that animation to
37239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // the new one.
37249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (ttoken.allDrawn) {
37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.allDrawn = true;
37269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
37279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (ttoken.firstWindowDrawn) {
37289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.firstWindowDrawn = true;
37299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
37309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!ttoken.hidden) {
37319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.hidden = false;
37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.hiddenRequested = false;
37339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.willBeHidden = false;
37349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
37359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (wtoken.clientHidden != ttoken.clientHidden) {
37369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.clientHidden = ttoken.clientHidden;
37379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.sendAppVisibilityToClients();
37389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
37399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (ttoken.animation != null) {
37409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.animation = ttoken.animation;
37419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.animating = ttoken.animating;
37429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.animLayerAdjustment = ttoken.animLayerAdjustment;
37439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ttoken.animation = null;
37449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ttoken.animLayerAdjustment = 0;
37459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.updateLayers();
37469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ttoken.updateLayers();
37479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
374806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
37493a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
37503a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                                true /*updateInputWindows*/);
37519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLayoutNeeded = true;
37529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        performLayoutAndPlaceSurfacesLocked();
37539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Binder.restoreCallingIdentity(origId);
37549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return;
37559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (ttoken.startingData != null) {
37569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // The previous app was getting ready to show a
37579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // starting window, but hasn't yet done so.  Steal it!
37588a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_STARTING_WINDOW) Slog.v(TAG,
37599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Moving pending starting from " + ttoken
37609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " to " + wtoken);
37619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wtoken.startingData = ttoken.startingData;
37629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.startingData = null;
37639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.startingMoved = true;
37649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Message m = mH.obtainMessage(H.ADD_STARTING, wtoken);
37659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Note: we really want to do sendMessageAtFrontOfQueue() because we
37669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // want to process the message ASAP, before any other queued
37679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // messages.
37689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mH.sendMessageAtFrontOfQueue(m);
37699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return;
37709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // There is no existing starting window, and the caller doesn't
37759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // want us to create one, so that's it!
37769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!createIfNeeded) {
37779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
37789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
377906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
37806d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn            // If this is a translucent window, then don't
3781284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            // show a starting window -- the current effect (a full-screen
3782284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            // opaque starting window that fades away to the real contents
3783284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            // when it is ready) does not work for this.
3784284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            if (theme != 0) {
3785284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                AttributeCache.Entry ent = AttributeCache.instance().get(pkg, theme,
3786284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        com.android.internal.R.styleable.Window);
3787284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                if (ent.array.getBoolean(
3788284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        com.android.internal.R.styleable.Window_windowIsTranslucent, false)) {
3789284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    return;
3790284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                }
3791284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                if (ent.array.getBoolean(
37926136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                        com.android.internal.R.styleable.Window_windowIsFloating, false)) {
37936136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                    return;
37946136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                }
37956136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                if (ent.array.getBoolean(
3796284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        com.android.internal.R.styleable.Window_windowShowWallpaper, false)) {
37976d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                    if (mWallpaperTarget == null) {
37986d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                        // If this theme is requesting a wallpaper, and the wallpaper
37996d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                        // is not curently visible, then this effectively serves as
38006d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                        // an opaque window and our starting window transition animation
38016d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                        // can still work.  We just need to make sure the starting window
38026d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                        // is also showing the wallpaper.
38036d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                        windowFlags |= WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
38046d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                    } else {
38056d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                        return;
38066d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                    }
3807284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                }
3808284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            }
3809ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
38109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStartingIconInTransition = true;
38112f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn            wtoken.startingData = new StartingData(pkg, theme, compatInfo, nonLocalizedLabel,
38127eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                    labelRes, icon, windowFlags);
38139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Message m = mH.obtainMessage(H.ADD_STARTING, wtoken);
38149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Note: we really want to do sendMessageAtFrontOfQueue() because we
38159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // want to process the message ASAP, before any other queued
38169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // messages.
38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendMessageAtFrontOfQueue(m);
38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAppWillBeHidden(IBinder token) {
38229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
38239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppWillBeHidden()")) {
3824cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
38259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AppWindowToken wtoken;
38289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
38309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken = findAppWindowToken(token);
38319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null) {
38328a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to set will be hidden of non-existing app token: " + token);
38339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
38349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.willBeHidden = true;
38369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
383806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
38399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean setTokenVisibilityLocked(AppWindowToken wtoken, WindowManager.LayoutParams lp,
3840ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            boolean visible, int transit, boolean performLayout) {
38419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean delayed = false;
38429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wtoken.clientHidden == visible) {
38449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.clientHidden = !visible;
38459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.sendAppVisibilityToClients();
38469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
384706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
38489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        wtoken.willBeHidden = false;
38499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wtoken.hidden == visible) {
38509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = wtoken.allAppWindows.size();
38519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean changed = false;
38528a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_APP_TRANSITIONS) Slog.v(
38539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Changing app " + wtoken + " hidden=" + wtoken.hidden
38549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " performLayout=" + performLayout);
385506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
38569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean runningAppAnimation = false;
385706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3858bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn            if (transit != WindowManagerPolicy.TRANSIT_UNSET) {
38599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wtoken.animation == sDummyAnimation) {
38609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wtoken.animation = null;
38619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3862ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                applyAnimationLocked(wtoken, lp, transit, visible);
38639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                changed = true;
38649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wtoken.animation != null) {
38659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    delayed = runningAppAnimation = true;
38669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
386806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
38699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
38709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState win = wtoken.allAppWindows.get(i);
38719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win == wtoken.startingWindow) {
38729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
38739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.isAnimating()) {
38769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    delayed = true;
38779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
387806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
38798a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                //Slog.i(TAG, "Window " + win + ": vis=" + win.isVisible());
38809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //win.dump("  ");
38819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (visible) {
38829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!win.isVisibleNow()) {
38839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!runningAppAnimation) {
38849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            applyAnimationLocked(win,
38859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    WindowManagerPolicy.TRANSIT_ENTER, true);
38869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
38879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        changed = true;
38889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
38899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (win.isVisibleNow()) {
38909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!runningAppAnimation) {
38919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        applyAnimationLocked(win,
38929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                WindowManagerPolicy.TRANSIT_EXIT, false);
38939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
38949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    changed = true;
38959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.hidden = wtoken.hiddenRequested = !visible;
38999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!visible) {
39009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                unsetAppFreezingScreenLocked(wtoken, true, true);
39019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
39029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If we are being set visible, and the starting window is
39039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // not yet displayed, then make sure it doesn't get displayed.
39049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState swin = wtoken.startingWindow;
39059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (swin != null && (swin.mDrawPending
39069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || swin.mCommitDrawPending)) {
39079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    swin.mPolicyVisibility = false;
39089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    swin.mPolicyVisibilityAfterAnim = false;
39099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 }
39109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
391106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
39128a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "setTokenVisibilityLocked: " + wtoken
39139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + ": hidden=" + wtoken.hidden + " hiddenRequested="
39149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + wtoken.hiddenRequested);
391506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
39169b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn            if (changed) {
39179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutNeeded = true;
39183a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                mInputMonitor.setUpdateInputWindowsNeededLw();
39199b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn                if (performLayout) {
39203a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
39213a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                            false /*updateInputWindows*/);
39229b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn                    performLayoutAndPlaceSurfacesLocked();
39239b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn                }
39242e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                mInputMonitor.updateInputWindowsLw(false /*force*/);
39259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wtoken.animation != null) {
39299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            delayed = true;
39309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
393106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
39329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return delayed;
39339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAppVisibility(IBinder token, boolean visible) {
39369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
39379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppVisibility()")) {
3938cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
39399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AppWindowToken wtoken;
39429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
39449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken = findAppWindowToken(token);
39459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null) {
39468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to set visibility of non-existing app token: " + token);
39479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
39489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_APP_TRANSITIONS || DEBUG_ORIENTATION) {
3951b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                RuntimeException e = null;
3952b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (!HIDE_STACK_CRAWLS) {
3953b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    e = new RuntimeException();
3954b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    e.fillInStackTrace();
3955b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                }
39568a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.v(TAG, "setAppVisibility(" + token + ", " + visible
39579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + "): mNextAppTransition=" + mNextAppTransition
39589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " hidden=" + wtoken.hidden
39599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " hiddenRequested=" + wtoken.hiddenRequested, e);
39609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
396106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
39629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If we are preparing an app transition, then delay changing
39639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // the visibility of this token until we execute that transition.
3964bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn            if (!mDisplayFrozen && mDisplayEnabled && mPolicy.isScreenOnFully()
3965b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                    && mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
39669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Already in requested state, don't do anything more.
39679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wtoken.hiddenRequested != visible) {
39689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
39699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
39709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.hiddenRequested = !visible;
397106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
39728a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_APP_TRANSITIONS) Slog.v(
39739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        TAG, "Setting dummy animation on: " + wtoken);
39749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.setDummyAnimation();
39759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOpeningApps.remove(wtoken);
39769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mClosingApps.remove(wtoken);
3977a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                wtoken.waitingToShow = wtoken.waitingToHide = false;
39789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.inPendingTransaction = true;
39799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (visible) {
39809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mOpeningApps.add(wtoken);
39819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wtoken.startingDisplayed = false;
39829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wtoken.startingMoved = false;
3983ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
3984195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    // If the token is currently hidden (should be the
3985195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    // common case), then we need to set up to wait for
3986195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    // its windows to be ready.
3987195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    if (wtoken.hidden) {
3988195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                        wtoken.allDrawn = false;
3989195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                        wtoken.waitingToShow = true;
3990ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
3991195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                        if (wtoken.clientHidden) {
3992195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            // In the case where we are making an app visible
3993195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            // but holding off for a transition, we still need
3994195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            // to tell the client to make its windows visible so
3995195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            // they get drawn.  Otherwise, we will wait on
3996195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            // performing the transition until all windows have
3997195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            // been drawn, they never will be, and we are sad.
3998195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            wtoken.clientHidden = false;
3999195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            wtoken.sendAppVisibilityToClients();
4000195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                        }
40019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
40029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
40039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mClosingApps.add(wtoken);
4004ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
4005195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    // If the token is currently visible (should be the
4006195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    // common case), then set up to wait for it to be hidden.
4007195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    if (!wtoken.hidden) {
4008195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                        wtoken.waitingToHide = true;
4009195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    }
40109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
40119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
40129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
401306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
40149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long origId = Binder.clearCallingIdentity();
4015e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            setTokenVisibilityLocked(wtoken, null, visible, WindowManagerPolicy.TRANSIT_UNSET,
4016ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                    true);
40179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.updateReportedVisibilityLocked();
40189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(origId);
40199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void unsetAppFreezingScreenLocked(AppWindowToken wtoken,
40239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean unfreezeSurfaceNow, boolean force) {
40249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wtoken.freezingScreen) {
40258a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_ORIENTATION) Slog.v(TAG, "Clear freezing of " + wtoken
40269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " force=" + force);
40279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = wtoken.allAppWindows.size();
40289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean unfrozeWindows = false;
40299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
40309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState w = wtoken.allAppWindows.get(i);
40319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (w.mAppFreezing) {
40329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mAppFreezing = false;
40339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (w.mSurface != null && !w.mOrientationChanging) {
40343ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn                        if (DEBUG_ORIENTATION) Slog.v(TAG, "set mOrientationChanging of " + w);
40359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mOrientationChanging = true;
40369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
40379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    unfrozeWindows = true;
40389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
40399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (force || unfrozeWindows) {
40418a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_ORIENTATION) Slog.v(TAG, "No longer freezing: " + wtoken);
40429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.freezingScreen = false;
40439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppsFreezingScreen--;
40449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (unfreezeSurfaceNow) {
40469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (unfrozeWindows) {
40479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLayoutNeeded = true;
40489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    performLayoutAndPlaceSurfacesLocked();
40499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4050e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                stopFreezingDisplayLocked();
40519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
405406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
40559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startAppFreezingScreenLocked(AppWindowToken wtoken,
40569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int configChanges) {
40579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_ORIENTATION) {
4058b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            RuntimeException e = null;
4059b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            if (!HIDE_STACK_CRAWLS) {
4060b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                e = new RuntimeException();
4061b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                e.fillInStackTrace();
4062b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            }
40638a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.i(TAG, "Set freezing of " + wtoken.appToken
40649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ": hidden=" + wtoken.hidden + " freezing="
40659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + wtoken.freezingScreen, e);
40669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!wtoken.hiddenRequested) {
40689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!wtoken.freezingScreen) {
40699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.freezingScreen = true;
40709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppsFreezingScreen++;
40719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mAppsFreezingScreen == 1) {
407294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    startFreezingDisplayLocked(false);
40739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mH.removeMessages(H.APP_FREEZE_TIMEOUT);
40749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mH.sendMessageDelayed(mH.obtainMessage(H.APP_FREEZE_TIMEOUT),
40759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            5000);
40769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
40779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = wtoken.allAppWindows.size();
40799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
40809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState w = wtoken.allAppWindows.get(i);
40819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mAppFreezing = true;
40829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
408506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
40869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startAppFreezingScreen(IBinder token, int configChanges) {
40879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
40889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppFreezingScreen()")) {
4089cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
40909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
4093bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn            if (configChanges == 0 && !mDisplayFrozen && mPolicy.isScreenOnFully()) {
40948a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_ORIENTATION) Slog.v(TAG, "Skipping set freeze of " + token);
40959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
40969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
409706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
40989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token);
40999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null || wtoken.appToken == null) {
41008a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to freeze screen with non-existing app token: " + wtoken);
41019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
41029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long origId = Binder.clearCallingIdentity();
41049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            startAppFreezingScreenLocked(wtoken, configChanges);
41059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(origId);
41069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
410806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
41099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void stopAppFreezingScreen(IBinder token, boolean force) {
41109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
41119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppFreezingScreen()")) {
4112cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
41139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
41169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token);
41179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null || wtoken.appToken == null) {
41189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
41199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long origId = Binder.clearCallingIdentity();
41218a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_ORIENTATION) Slog.v(TAG, "Clear freezing of " + token
41229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ": hidden=" + wtoken.hidden + " freezing=" + wtoken.freezingScreen);
41239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unsetAppFreezingScreenLocked(wtoken, true, force);
41249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(origId);
41259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
412706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
41289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeAppToken(IBinder token) {
41299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
41309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "removeAppToken()")) {
4131cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
41329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AppWindowToken wtoken = null;
41359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AppWindowToken startingToken = null;
41369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean delayed = false;
41379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long origId = Binder.clearCallingIdentity();
41399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
41409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken basewtoken = mTokenMap.remove(token);
41419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (basewtoken != null && (wtoken=basewtoken.appWindowToken) != null) {
41428a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Removing app token: " + wtoken);
4143e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                delayed = setTokenVisibilityLocked(wtoken, null, false,
4144ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                        WindowManagerPolicy.TRANSIT_UNSET, true);
41459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.inPendingTransaction = false;
41469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOpeningApps.remove(wtoken);
4147a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                wtoken.waitingToShow = false;
41489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mClosingApps.contains(wtoken)) {
41499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    delayed = true;
4150bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                } else if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
41519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mClosingApps.add(wtoken);
4152a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    wtoken.waitingToHide = true;
41539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    delayed = true;
41549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
41558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_APP_TRANSITIONS) Slog.v(
41569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        TAG, "Removing app " + wtoken + " delayed=" + delayed
41579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " animation=" + wtoken.animation
41589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " animating=" + wtoken.animating);
41599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (delayed) {
41609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // set the token aside because it has an active animation to be finished
4161f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG,
4162f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            "removeAppToken make exiting: " + wtoken);
41639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mExitingAppTokens.add(wtoken);
41649bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                } else {
41659bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    // Make sure there is no animation running on this token,
41669bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    // so any windows associated with it will be removed as
41679bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    // soon as their animations are complete
41689bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    wtoken.animation = null;
41699bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    wtoken.animating = false;
41709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4171f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG,
4172f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                        "removeAppToken: " + wtoken);
41739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppTokens.remove(wtoken);
41749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.removed = true;
41759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wtoken.startingData != null) {
41769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    startingToken = wtoken;
41779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
41789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                unsetAppFreezingScreenLocked(wtoken, true, true);
41799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mFocusedApp == wtoken) {
41808a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_FOCUS) Slog.v(TAG, "Removing focused app token:" + wtoken);
41819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mFocusedApp = null;
41823a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/);
418300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    mInputMonitor.setFocusedAppLw(null);
41849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
41859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
41868a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to remove non-existing app token: " + token);
41879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
418806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
41899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!delayed && wtoken != null) {
41909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.updateReportedVisibilityLocked();
41919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
41949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (startingToken != null) {
41968a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Schedule remove starting "
41979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + startingToken + ": app token removed");
41989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Message m = mH.obtainMessage(H.REMOVE_STARTING, startingToken);
41999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendMessage(m);
42009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean tmpRemoveAppWindowsLocked(WindowToken token) {
42049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NW = token.windows.size();
42059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<NW; i++) {
42069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowState win = token.windows.get(i);
42078a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Tmp removing app window " + win);
42089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindows.remove(win);
4209dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            mWindowsChanged = true;
42109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int j = win.mChildWindows.size();
42119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (j > 0) {
42129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                j--;
4213e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState cwin = win.mChildWindows.get(j);
42148a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG,
4215bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                        "Tmp removing child window " + cwin);
4216bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                mWindows.remove(cwin);
42179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
42189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NW > 0;
42209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dumpAppTokensLocked() {
42239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=mAppTokens.size()-1; i>=0; i--) {
42248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.v(TAG, "  #" + i + ": " + mAppTokens.get(i).token);
42259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
422706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
42289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dumpWindowsLocked() {
42299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=mWindows.size()-1; i>=0; i--) {
42308a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.v(TAG, "  #" + i + ": " + mWindows.get(i));
42319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
423306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
42349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int findWindowOffsetLocked(int tokenPos) {
42359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NW = mWindows.size();
42369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (tokenPos >= mAppTokens.size()) {
42389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int i = NW;
42399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (i > 0) {
42409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
4241e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState win = mWindows.get(i);
42429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.getAppToken() != null) {
42439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return i+1;
42449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
42459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
42469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (tokenPos > 0) {
42499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Find the first app token below the new position that has
42509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // a window displayed.
42519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final AppWindowToken wtoken = mAppTokens.get(tokenPos-1);
42528a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_REORDER) Slog.v(TAG, "Looking for lower windows @ "
42539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + tokenPos + " -- " + wtoken.token);
4254a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            if (wtoken.sendingToBottom) {
42558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_REORDER) Slog.v(TAG,
4256a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        "Skipping token -- currently sending to bottom");
4257a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                tokenPos--;
4258a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                continue;
4259a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
42609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int i = wtoken.windows.size();
42619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (i > 0) {
42629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
42639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState win = wtoken.windows.get(i);
42649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int j = win.mChildWindows.size();
42659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (j > 0) {
42669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    j--;
4267e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    WindowState cwin = win.mChildWindows.get(j);
4268a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    if (cwin.mSubLayer >= 0) {
42699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int pos=NW-1; pos>=0; pos--) {
42709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (mWindows.get(pos) == cwin) {
42718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_REORDER) Slog.v(TAG,
42729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "Found child win @" + (pos+1));
42739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                return pos+1;
42749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
42759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
42769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
42779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
42789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int pos=NW-1; pos>=0; pos--) {
42799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mWindows.get(pos) == win) {
42808a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_REORDER) Slog.v(TAG, "Found win @" + (pos+1));
42819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return pos+1;
42829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
42839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
42849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
42859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            tokenPos--;
42869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
42899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final int reAddWindowLocked(int index, WindowState win) {
42929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NCW = win.mChildWindows.size();
42939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean added = false;
42949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int j=0; j<NCW; j++) {
4295e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState cwin = win.mChildWindows.get(j);
42969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!added && cwin.mSubLayer >= 0) {
42978a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding child window at "
4298bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                        + index + ": " + cwin);
4299f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                win.mRebuilding = false;
43009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindows.add(index, win);
43019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                index++;
43029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                added = true;
43039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
43048a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding window at "
4305bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                    + index + ": " + cwin);
4306f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            cwin.mRebuilding = false;
43079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindows.add(index, cwin);
43089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index++;
43099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!added) {
43118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding window at "
4312bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                    + index + ": " + win);
4313f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            win.mRebuilding = false;
43149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindows.add(index, win);
43159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index++;
43169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4317dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        mWindowsChanged = true;
43189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return index;
43199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
432006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
43219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final int reAddAppWindowsLocked(int index, WindowToken token) {
43229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NW = token.windows.size();
43239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<NW; i++) {
43249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index = reAddWindowLocked(index, token.windows.get(i));
43259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return index;
43279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void moveAppToken(int index, IBinder token) {
43309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
43319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "moveAppToken()")) {
4332cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
43339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
43368a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_REORDER) Slog.v(TAG, "Initial app tokens:");
43379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_REORDER) dumpAppTokensLocked();
43389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final AppWindowToken wtoken = findAppWindowToken(token);
4339f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            if (DEBUG_TOKEN_MOVEMENT || DEBUG_REORDER) Slog.v(TAG,
4340f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    "Start moving token " + wtoken + " initially at "
4341f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    + mAppTokens.indexOf(wtoken));
43429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null || !mAppTokens.remove(wtoken)) {
43438a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempting to reorder token that doesn't exist: "
43449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + token + " (" + wtoken + ")");
43459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
43469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
43479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAppTokens.add(index, wtoken);
43488a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_REORDER) Slog.v(TAG, "Moved " + token + " to " + index + ":");
4349f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            else if (DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, "Moved " + token + " to " + index);
43509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_REORDER) dumpAppTokensLocked();
435106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
43529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long origId = Binder.clearCallingIdentity();
43538a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_REORDER) Slog.v(TAG, "Removing windows in " + token + ":");
43549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_REORDER) dumpWindowsLocked();
43559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tmpRemoveAppWindowsLocked(wtoken)) {
43568a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_REORDER) Slog.v(TAG, "Adding windows back in:");
43579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_REORDER) dumpWindowsLocked();
43589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reAddAppWindowsLocked(findWindowOffsetLocked(index), wtoken);
43598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_REORDER) Slog.v(TAG, "Final window list:");
43609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_REORDER) dumpWindowsLocked();
43613a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
43623a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        false /*updateInputWindows*/);
43639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutNeeded = true;
43642e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                mInputMonitor.setUpdateInputWindowsNeededLw();
43659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                performLayoutAndPlaceSurfacesLocked();
43662e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                mInputMonitor.updateInputWindowsLw(false /*force*/);
43679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
43689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(origId);
43699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void removeAppTokensLocked(List<IBinder> tokens) {
43739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // XXX This should be done more efficiently!
43749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // (take advantage of the fact that both lists should be
43759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // ordered in the same way.)
43769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int N = tokens.size();
43779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
43789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IBinder token = tokens.get(i);
43799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final AppWindowToken wtoken = findAppWindowToken(token);
4380f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            if (DEBUG_REORDER || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG,
4381f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    "Temporarily removing " + wtoken + " from " + mAppTokens.indexOf(wtoken));
43829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mAppTokens.remove(wtoken)) {
43838a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempting to reorder token that doesn't exist: "
43849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + token + " (" + wtoken + ")");
43859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
43869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                N--;
43879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
43889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4391a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    private void moveAppWindowsLocked(AppWindowToken wtoken, int tokenPos,
4392a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            boolean updateFocusAndLayout) {
4393a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        // First remove all of the windows from the list.
4394a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        tmpRemoveAppWindowsLocked(wtoken);
4395a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn
4396a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        // Where to start adding?
4397a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        int pos = findWindowOffsetLocked(tokenPos);
4398a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn
4399a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        // And now add them back at the correct place.
4400a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        pos = reAddAppWindowsLocked(pos, wtoken);
4401a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn
4402a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        if (updateFocusAndLayout) {
44032e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown            mInputMonitor.setUpdateInputWindowsNeededLw();
44043a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown            if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
44053a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    false /*updateInputWindows*/)) {
4406a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                assignLayersLocked();
4407a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
4408a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            mLayoutNeeded = true;
4409a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            performLayoutAndPlaceSurfacesLocked();
44102e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown            mInputMonitor.updateInputWindowsLw(false /*force*/);
4411a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        }
4412a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    }
4413a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn
44149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void moveAppWindowsLocked(List<IBinder> tokens, int tokenPos) {
44159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // First remove all of the windows from the list.
44169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = tokens.size();
44179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i;
44189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=0; i<N; i++) {
44199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken token = mTokenMap.get(tokens.get(i));
44209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token != null) {
44219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                tmpRemoveAppWindowsLocked(token);
44229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
44239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Where to start adding?
44269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = findWindowOffsetLocked(tokenPos);
44279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // And now add them back at the correct place.
44299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=0; i<N; i++) {
44309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken token = mTokenMap.get(tokens.get(i));
44319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token != null) {
44329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pos = reAddAppWindowsLocked(pos, token);
44339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
44349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44362e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown        mInputMonitor.setUpdateInputWindowsNeededLw();
44373a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
44383a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                false /*updateInputWindows*/)) {
4439a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            assignLayersLocked();
4440a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        }
44419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLayoutNeeded = true;
44429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        performLayoutAndPlaceSurfacesLocked();
44432e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown        mInputMonitor.updateInputWindowsLw(false /*force*/);
44449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //dump();
44469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void moveAppTokensToTop(List<IBinder> tokens) {
44499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
44509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "moveAppTokensToTop()")) {
4451cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
44529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long origId = Binder.clearCallingIdentity();
44559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
44569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            removeAppTokensLocked(tokens);
44579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = tokens.size();
44589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
44599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AppWindowToken wt = findAppWindowToken(tokens.get(i));
44609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wt != null) {
4461f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    if (DEBUG_TOKEN_MOVEMENT || DEBUG_REORDER) Slog.v(TAG,
4462f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            "Adding next to top: " + wt);
44639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAppTokens.add(wt);
4464bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                    if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
4465a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mToTopApps.remove(wt);
4466a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mToBottomApps.remove(wt);
4467a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mToTopApps.add(wt);
4468a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        wt.sendingToBottom = false;
4469a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        wt.sendingToTop = true;
4470a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    }
44719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
44729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4473ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
4474bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn            if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET) {
4475a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                moveAppWindowsLocked(tokens, mAppTokens.size());
4476a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
44779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
44799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void moveAppTokensToBottom(List<IBinder> tokens) {
44829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
44839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "moveAppTokensToBottom()")) {
4484cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
44859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long origId = Binder.clearCallingIdentity();
44889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
44899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            removeAppTokensLocked(tokens);
44909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = tokens.size();
44919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int pos = 0;
44929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
44939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AppWindowToken wt = findAppWindowToken(tokens.get(i));
44949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wt != null) {
4495f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    if (DEBUG_TOKEN_MOVEMENT) Slog.v(TAG,
4496f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            "Adding next to bottom: " + wt + " at " + pos);
44979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAppTokens.add(pos, wt);
4498bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                    if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
4499a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mToTopApps.remove(wt);
4500a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mToBottomApps.remove(wt);
4501a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mToBottomApps.add(i, wt);
4502a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        wt.sendingToTop = false;
4503a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        wt.sendingToBottom = true;
4504a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    }
45059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pos++;
45069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
45079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4508ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
4509bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn            if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET) {
4510a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                moveAppWindowsLocked(tokens, 0);
4511a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
45129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
45149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
45179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Misc IWindowSession methods
45189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
451906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4520284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    private boolean shouldAllowDisableKeyguard()
4521d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller    {
4522284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        // We fail safe and prevent disabling keyguard in the unlikely event this gets
4523284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        // called before DevicePolicyManagerService has started.
4524284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        if (mAllowDisableKeyguard == ALLOW_DISABLE_UNKNOWN) {
4525284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService(
4526284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                    Context.DEVICE_POLICY_SERVICE);
4527284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            if (dpm != null) {
4528284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                mAllowDisableKeyguard = dpm.getPasswordQuality(null)
4529284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                        == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED ?
4530284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                                ALLOW_DISABLE_YES : ALLOW_DISABLE_NO;
4531284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            }
4532284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        }
4533284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        return mAllowDisableKeyguard == ALLOW_DISABLE_YES;
4534d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller    }
4535d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller
45369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void disableKeyguard(IBinder token, String tag) {
4537733fdf34b6a8a8e3983ff7663828a928d3c19944Mike Lockwood        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD)
45389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            != PackageManager.PERMISSION_GRANTED) {
45399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException("Requires DISABLE_KEYGUARD permission");
45409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4541d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller
4542284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        synchronized (mKeyguardTokenWatcher) {
4543284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            mKeyguardTokenWatcher.acquire(token, tag);
4544dd8846886aa21980ecdca7ba42deac4f7ecd8ff0Mike Lockwood        }
45459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void reenableKeyguard(IBinder token) {
4548733fdf34b6a8a8e3983ff7663828a928d3c19944Mike Lockwood        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD)
45499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            != PackageManager.PERMISSION_GRANTED) {
45509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException("Requires DISABLE_KEYGUARD permission");
45519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4552d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller
4553284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        synchronized (mKeyguardTokenWatcher) {
4554284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            mKeyguardTokenWatcher.release(token);
4555284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller
4556284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            if (!mKeyguardTokenWatcher.isAcquired()) {
4557284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // If we are the last one to reenable the keyguard wait until
4558284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // we have actually finished reenabling until returning.
4559284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // It is possible that reenableKeyguard() can be called before
4560284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // the previous disableKeyguard() is handled, in which case
4561284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // neither mKeyguardTokenWatcher.acquired() or released() would
4562284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // be called. In that case mKeyguardDisabled will be false here
4563284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // and we have nothing to wait for.
4564284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                while (mKeyguardDisabled) {
4565284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                    try {
4566284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                        mKeyguardTokenWatcher.wait();
4567284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                    } catch (InterruptedException e) {
4568284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                        Thread.currentThread().interrupt();
45699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
45709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
45719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
45729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
45769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.app.KeyguardManager#exitKeyguardSecurely
45779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
45789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void exitKeyguardSecurely(final IOnKeyguardExitResult callback) {
4579733fdf34b6a8a8e3983ff7663828a928d3c19944Mike Lockwood        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD)
45809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            != PackageManager.PERMISSION_GRANTED) {
45819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException("Requires DISABLE_KEYGUARD permission");
45829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPolicy.exitKeyguardSecurely(new WindowManagerPolicy.OnKeyguardExitResult() {
45849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void onKeyguardExitResult(boolean success) {
45859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
45869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    callback.onKeyguardExitResult(success);
45879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
45889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Client has died, we don't care.
45899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
45909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
45919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        });
45929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean inKeyguardRestrictedInputMode() {
45959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPolicy.inKeyguardRestrictedKeyInputMode();
45969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
459706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4598520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood    public boolean isKeyguardLocked() {
4599520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood        return mPolicy.isKeyguardLocked();
4600520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood    }
4601520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood
4602520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood    public boolean isKeyguardSecure() {
4603520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood        return mPolicy.isKeyguardSecure();
4604520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood    }
4605520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood
460690c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn    public void dismissKeyguard() {
460790c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD)
460890c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn                != PackageManager.PERMISSION_GRANTED) {
460990c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            throw new SecurityException("Requires DISABLE_KEYGUARD permission");
461090c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        }
461190c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        synchronized(mWindowMap) {
461290c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn            mPolicy.dismissKeyguardLw();
461390c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn        }
461490c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn    }
461590c52de28691ca0bbbf7c039ef20f85ce46882ccDianne Hackborn
4616ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn    public void closeSystemDialogs(String reason) {
4617ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        synchronized(mWindowMap) {
4618ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn            for (int i=mWindows.size()-1; i>=0; i--) {
4619e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState w = mWindows.get(i);
4620ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                if (w.mSurface != null) {
4621ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                    try {
4622ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                        w.mClient.closeSystemDialogs(reason);
4623ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                    } catch (RemoteException e) {
4624ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                    }
4625ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                }
4626ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn            }
4627ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        }
4628ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn    }
4629ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
46309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static float fixScale(float scale) {
46319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (scale < 0) scale = 0;
46329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else if (scale > 20) scale = 20;
46339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return Math.abs(scale);
46349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
463506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAnimationScale(int which, float scale) {
46379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.SET_ANIMATION_SCALE,
46389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAnimationScale()")) {
4639cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires SET_ANIMATION_SCALE permission");
46409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
46419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (scale < 0) scale = 0;
46439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else if (scale > 20) scale = 20;
46449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        scale = Math.abs(scale);
46459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
46469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 0: mWindowAnimationScale = fixScale(scale); break;
46479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 1: mTransitionAnimationScale = fixScale(scale); break;
46489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
464906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Persist setting
46519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.obtainMessage(H.PERSIST_ANIMATION_SCALE).sendToTarget();
46529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
465306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAnimationScales(float[] scales) {
46559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.SET_ANIMATION_SCALE,
46569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAnimationScale()")) {
4657cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires SET_ANIMATION_SCALE permission");
46589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
46599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (scales != null) {
46619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (scales.length >= 1) {
46629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindowAnimationScale = fixScale(scales[0]);
46639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
46649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (scales.length >= 2) {
46659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTransitionAnimationScale = fixScale(scales[1]);
46669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
46679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
466806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Persist setting
46709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.obtainMessage(H.PERSIST_ANIMATION_SCALE).sendToTarget();
46719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
467206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float getAnimationScale(int which) {
46749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
46759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 0: return mWindowAnimationScale;
46769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 1: return mTransitionAnimationScale;
46779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
46789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
46799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
468006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float[] getAnimationScales() {
46829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new float[] { mWindowAnimationScale, mTransitionAnimationScale };
46839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
468406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getSwitchState(int sw) {
46869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
46879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "getSwitchState()")) {
4688cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
46899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
46906d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getSwitchState(-1, InputDevice.SOURCE_ANY, sw);
46919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
469206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getSwitchStateForDevice(int devid, int sw) {
46949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
46959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "getSwitchStateForDevice()")) {
4696cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
46979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
46986d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getSwitchState(devid, InputDevice.SOURCE_ANY, sw);
46999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
470006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
47019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getScancodeState(int sw) {
47029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
47039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "getScancodeState()")) {
4704cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
47059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47066d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getScanCodeState(-1, InputDevice.SOURCE_ANY, sw);
47079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
470806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
47099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getScancodeStateForDevice(int devid, int sw) {
47109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
47119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "getScancodeStateForDevice()")) {
4712cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
47139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47146d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getScanCodeState(devid, InputDevice.SOURCE_ANY, sw);
47159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
471606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
47171d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    public int getTrackballScancodeState(int sw) {
47181d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
47191d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn                "getTrackballScancodeState()")) {
47201d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
47211d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        }
47226d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getScanCodeState(-1, InputDevice.SOURCE_TRACKBALL, sw);
47231d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    }
47241d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn
47251d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    public int getDPadScancodeState(int sw) {
47261d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
47271d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn                "getDPadScancodeState()")) {
47281d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
47291d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        }
47306d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getScanCodeState(-1, InputDevice.SOURCE_DPAD, sw);
47311d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    }
47321d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn
47339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getKeycodeState(int sw) {
47349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
47359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "getKeycodeState()")) {
4736cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
47379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47386d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_ANY, sw);
47399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
474006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
47419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getKeycodeStateForDevice(int devid, int sw) {
47429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
47439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "getKeycodeStateForDevice()")) {
4744cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
47459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47466d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getKeyCodeState(devid, InputDevice.SOURCE_ANY, sw);
47479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
474806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
47491d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    public int getTrackballKeycodeState(int sw) {
47501d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
47511d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn                "getTrackballKeycodeState()")) {
47521d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
47531d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        }
47546d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_TRACKBALL, sw);
47551d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    }
47561d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn
47571d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    public int getDPadKeycodeState(int sw) {
47581d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
47591d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn                "getDPadKeycodeState()")) {
47601d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
47611d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        }
47626d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_DPAD, sw);
47631d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    }
4764a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown
47659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hasKeys(int[] keycodes, boolean[] keyExists) {
47666d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.hasKeys(-1, InputDevice.SOURCE_ANY, keycodes, keyExists);
47679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
476806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4769a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown    public InputChannel monitorInput(String inputChannelName) {
4770a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
4771a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown                "monitorInput()")) {
4772a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown            throw new SecurityException("Requires READ_INPUT_STATE permission");
4773a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown        }
4774a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown        return mInputManager.monitorInput(inputChannelName);
4775a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown    }
4776a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown
47770029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    public void setInputFilter(InputFilter filter) {
47780029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        mInputManager.setInputFilter(filter);
47790029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    }
47800029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
47818d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public InputDevice getInputDevice(int deviceId) {
47828d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return mInputManager.getInputDevice(deviceId);
47838d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
47848d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
47858d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public int[] getInputDeviceIds() {
47868d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return mInputManager.getInputDeviceIds();
47878d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
47888d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
47899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enableScreenAfterBoot() {
47909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
479138cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn            if (DEBUG_BOOT) {
479238cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                RuntimeException here = new RuntimeException("here");
479338cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                here.fillInStackTrace();
479438cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                Slog.i(TAG, "enableScreenAfterBoot: mDisplayEnabled=" + mDisplayEnabled
479538cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                        + " mForceDisplayEnabled=" + mForceDisplayEnabled
479638cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                        + " mShowingBootMessages=" + mShowingBootMessages
479738cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                        + " mSystemBooted=" + mSystemBooted, here);
479838cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn            }
47999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mSystemBooted) {
48009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
48019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
48029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSystemBooted = true;
4803661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn            hideBootMessagesLocked();
480429aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn            // If the screen still doesn't come up after 30 seconds, give
480529aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn            // up and turn it on.
480629aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn            Message msg = mH.obtainMessage(H.BOOT_TIMEOUT);
480729aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn            mH.sendMessageDelayed(msg, 30*1000);
48089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
480906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4810ba24e4d8bbeb60e96d74f05e21691dad61ce497eDianne Hackborn        mPolicy.systemBooted();
4811ba24e4d8bbeb60e96d74f05e21691dad61ce497eDianne Hackborn
48129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        performEnableScreen();
48139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
481406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4815661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn    void enableScreenIfNeededLocked() {
481638cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn        if (DEBUG_BOOT) {
481738cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn            RuntimeException here = new RuntimeException("here");
481838cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn            here.fillInStackTrace();
481938cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn            Slog.i(TAG, "enableScreenIfNeededLocked: mDisplayEnabled=" + mDisplayEnabled
482038cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                    + " mForceDisplayEnabled=" + mForceDisplayEnabled
482138cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                    + " mShowingBootMessages=" + mShowingBootMessages
482238cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                    + " mSystemBooted=" + mSystemBooted, here);
482338cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn        }
48249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDisplayEnabled) {
48259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
48269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4827661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn        if (!mSystemBooted && !mShowingBootMessages) {
48289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
48299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.sendMessage(mH.obtainMessage(H.ENABLE_SCREEN));
48319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
483206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
483329aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn    public void performBootTimeout() {
483429aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn        synchronized(mWindowMap) {
483529aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn            if (mDisplayEnabled) {
483629aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                return;
483729aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn            }
483829aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn            Slog.w(TAG, "***** BOOT TIMEOUT: forcing display enabled");
483929aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn            mForceDisplayEnabled = true;
484029aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn        }
484129aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn        performEnableScreen();
484229aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn    }
484329aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn
48449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void performEnableScreen() {
48459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
484638cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn            if (DEBUG_BOOT) {
484738cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                RuntimeException here = new RuntimeException("here");
484838cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                here.fillInStackTrace();
484938cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                Slog.i(TAG, "performEnableScreen: mDisplayEnabled=" + mDisplayEnabled
485038cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                        + " mForceDisplayEnabled=" + mForceDisplayEnabled
485138cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                        + " mShowingBootMessages=" + mShowingBootMessages
485238cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                        + " mSystemBooted=" + mSystemBooted, here);
485338cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn            }
48549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDisplayEnabled) {
48559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
48569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4857661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn            if (!mSystemBooted && !mShowingBootMessages) {
48589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
48599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
486006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
486129aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn            if (!mForceDisplayEnabled) {
486229aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                // Don't enable the screen until all existing windows
486329aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                // have been drawn.
486429aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                boolean haveBootMsg = false;
486529aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                boolean haveApp = false;
486629aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                boolean haveWallpaper = false;
486738cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                boolean haveKeyguard = true;
486829aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                final int N = mWindows.size();
486929aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                for (int i=0; i<N; i++) {
487029aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                    WindowState w = mWindows.get(i);
487138cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                    if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_KEYGUARD) {
487238cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                        // Only if there is a keyguard attached to the window manager
487338cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                        // will we consider ourselves as having a keyguard.  If it
487438cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                        // isn't attached, we don't know if it wants to be shown or
487538cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                        // hidden.  If it is attached, we will say we have a keyguard
487638cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                        // if the window doesn't want to be visible, because in that
487738cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                        // case it explicitly doesn't want to be shown so we should
487838cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                        // not delay turning the screen on for it.
487938cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                        boolean vis = w.mViewVisibility == View.VISIBLE
488038cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                                && w.mPolicyVisibility;
488138cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                        haveKeyguard = !vis;
488238cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                    }
488329aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                    if (w.isVisibleLw() && !w.mObscured && !w.isDrawnLw()) {
488429aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                        return;
488529aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                    }
488629aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                    if (w.isDrawnLw()) {
488729aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                        if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_BOOT_PROGRESS) {
488829aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                            haveBootMsg = true;
488929aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                        } else if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION) {
489029aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                            haveApp = true;
489129aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                        } else if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_WALLPAPER) {
489229aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                            haveWallpaper = true;
489329aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                        } else if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_KEYGUARD) {
489429aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                            haveKeyguard = true;
489529aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                        }
489629aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                    }
489729aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                }
489829aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn
489938cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                if (DEBUG_SCREEN_ON || DEBUG_BOOT) {
490029aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                    Slog.i(TAG, "******** booted=" + mSystemBooted + " msg=" + mShowingBootMessages
490129aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                            + " haveBoot=" + haveBootMsg + " haveApp=" + haveApp
490229aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                            + " haveWall=" + haveWallpaper + " haveKeyguard=" + haveKeyguard);
490329aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                }
490429aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn
490529aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                // If we are turning on the screen to show the boot message,
490629aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                // don't do it until the boot message is actually displayed.
490729aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                if (!mSystemBooted && !haveBootMsg) {
490829aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                    return;
490929aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                }
491029aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn
491129aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                // If we are turning on the screen after the boot is completed
491229aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                // normally, don't do so until we have the application and
491329aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                // wallpaper.
491429aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                if (mSystemBooted && ((!haveApp && !haveKeyguard) || !haveWallpaper)) {
49159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
49169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
49179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
491806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
49199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDisplayEnabled = true;
492038cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn            if (DEBUG_SCREEN_ON || DEBUG_BOOT) Slog.i(TAG, "******************** ENABLING SCREEN!");
49219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (false) {
49229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                StringWriter sw = new StringWriter();
49239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PrintWriter pw = new PrintWriter(sw);
49249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                this.dump(null, pw, null);
49258a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.i(TAG, sw.toString());
49269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
49279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
49289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IBinder surfaceFlinger = ServiceManager.getService("SurfaceFlinger");
49299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (surfaceFlinger != null) {
49308a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    //Slog.i(TAG, "******* TELLING SURFACE FLINGER WE ARE BOOTED!");
49319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Parcel data = Parcel.obtain();
49329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.writeInterfaceToken("android.ui.ISurfaceComposer");
49339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    surfaceFlinger.transact(IBinder.FIRST_CALL_TRANSACTION,
49349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            data, null, 0);
49359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.recycle();
49369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
49379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException ex) {
49388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.e(TAG, "Boot completed: SurfaceFlinger is dead!");
49399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
49409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
494106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
49429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPolicy.enableScreenAfterBoot();
494306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
49449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make sure the last requested orientation has been applied.
494501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        updateRotationUnchecked(false);
49469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
494706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4948661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn    public void showBootMessage(final CharSequence msg, final boolean always) {
4949661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn        boolean first = false;
4950661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn        synchronized(mWindowMap) {
495138cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn            if (DEBUG_BOOT) {
495238cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                RuntimeException here = new RuntimeException("here");
495338cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                here.fillInStackTrace();
495438cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                Slog.i(TAG, "showBootMessage: msg=" + msg + " always=" + always
495538cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                        + " mAllowBootMessages=" + mAllowBootMessages
495638cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                        + " mShowingBootMessages=" + mShowingBootMessages
495738cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                        + " mSystemBooted=" + mSystemBooted, here);
495838cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn            }
495958f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn            if (!mAllowBootMessages) {
496058f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn                return;
496158f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn            }
4962661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn            if (!mShowingBootMessages) {
4963661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn                if (!always) {
4964661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn                    return;
4965661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn                }
4966661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn                first = true;
4967661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn            }
4968661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn            if (mSystemBooted) {
4969661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn                return;
4970661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn            }
4971661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn            mShowingBootMessages = true;
4972661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn            mPolicy.showBootMessage(msg, always);
4973661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn        }
4974661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn        if (first) {
4975661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn            performEnableScreen();
4976661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn        }
4977661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn    }
4978661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn
4979661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn    public void hideBootMessagesLocked() {
498038cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn        if (DEBUG_BOOT) {
498138cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn            RuntimeException here = new RuntimeException("here");
498238cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn            here.fillInStackTrace();
498338cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn            Slog.i(TAG, "hideBootMessagesLocked: mDisplayEnabled=" + mDisplayEnabled
498438cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                    + " mForceDisplayEnabled=" + mForceDisplayEnabled
498538cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                    + " mShowingBootMessages=" + mShowingBootMessages
498638cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn                    + " mSystemBooted=" + mSystemBooted, here);
498738cc8960cbe09f8cb028a0cf8798c8c6fc75df33Dianne Hackborn        }
4988661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn        if (mShowingBootMessages) {
4989661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn            mShowingBootMessages = false;
4990661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn            mPolicy.hideBootMessages();
4991661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn        }
4992661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn    }
4993661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn
49949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setInTouchMode(boolean mode) {
49959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
49969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInTouchMode = mode;
49979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
49989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
49999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50006804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    // TODO: more accounting of which pid(s) turned it on, keep count,
50016804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    // only allow disables from pids which have count on, etc.
50026804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    public void showStrictModeViolation(boolean on) {
50036804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        int pid = Binder.getCallingPid();
50046804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        synchronized(mWindowMap) {
50056804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            // Ignoring requests to enable the red border from clients
50066804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            // which aren't on screen.  (e.g. Broadcast Receivers in
50076804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            // the background..)
50086804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            if (on) {
50096804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                boolean isVisible = false;
50106804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                for (WindowState ws : mWindows) {
50116804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                    if (ws.mSession.mPid == pid && ws.isVisibleLw()) {
50126804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                        isVisible = true;
50136804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                        break;
50146804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                    }
50156804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                }
50166804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                if (!isVisible) {
50176804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                    return;
50186804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                }
50196804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            }
50206804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick
502136991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn            if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
502236991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn                    ">>> OPEN TRANSACTION showStrictModeViolation");
50236804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            Surface.openTransaction();
502494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            try {
502594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                if (mStrictModeFlash == null) {
502694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    mStrictModeFlash = new StrictModeFlash(mDisplay, mFxSession);
502794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                }
502894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                mStrictModeFlash.setVisibility(on);
502994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            } finally {
503094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                Surface.closeTransaction();
503136991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn                if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
503236991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn                        "<<< CLOSE TRANSACTION showStrictModeViolation");
50336804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            }
50346804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        }
50356804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    }
50366804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick
5037c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick    public void setStrictModeVisualIndicatorPreference(String value) {
5038c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick        SystemProperties.set(StrictMode.VISUAL_PROPERTY, value);
5039c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick    }
5040c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick
5041e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller    /**
5042e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller     * Takes a snapshot of the screen.  In landscape mode this grabs the whole screen.
5043e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller     * In portrait mode, it grabs the upper region of the screen based on the vertical dimension
5044e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller     * of the target image.
5045e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller     *
5046e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller     * @param width the width of the target bitmap
5047e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller     * @param height the height of the target bitmap
5048e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller     */
5049e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller    public Bitmap screenshotApplications(IBinder appToken, int width, int height) {
50500aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.READ_FRAME_BUFFER,
50510aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                "screenshotApplications()")) {
50520aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            throw new SecurityException("Requires READ_FRAME_BUFFER permission");
50530aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        }
50540aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
50550aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        Bitmap rawss;
50560aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
5057d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn        int maxLayer = 0;
50580aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        final Rect frame = new Rect();
50590aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
50600aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        float scale;
5061e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller        int dw, dh;
50620aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        int rot;
50630aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
50640aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        synchronized(mWindowMap) {
50650aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            long ident = Binder.clearCallingIdentity();
50660aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
506781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn            dw = mAppDisplayWidth;
506881e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn            dh = mAppDisplayHeight;
5069428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn
50700aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            int aboveAppLayer = mPolicy.windowTypeToLayerLw(
50710aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                    WindowManager.LayoutParams.TYPE_APPLICATION) * TYPE_LAYER_MULTIPLIER
50720aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                    + TYPE_LAYER_OFFSET;
50730aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            aboveAppLayer += TYPE_LAYER_MULTIPLIER;
50740aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
5075428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            boolean isImeTarget = mInputMethodTarget != null
5076428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    && mInputMethodTarget.mAppToken != null
5077428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    && mInputMethodTarget.mAppToken.appToken != null
5078428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    && mInputMethodTarget.mAppToken.appToken.asBinder() == appToken;
5079428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn
50800aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            // Figure out the part of the screen that is actually the app.
5081428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            boolean including = false;
5082428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            for (int i=mWindows.size()-1; i>=0; i--) {
50830aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                WindowState ws = mWindows.get(i);
50840aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                if (ws.mSurface == null) {
50850aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                    continue;
50860aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                }
50870aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                if (ws.mLayer >= aboveAppLayer) {
5088d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn                    continue;
5089d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn                }
5090428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                // When we will skip windows: when we are not including
5091428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                // ones behind a window we didn't skip, and we are actually
5092428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                // taking a screenshot of a specific app.
5093428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                if (!including && appToken != null) {
5094428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    // Also, we can possibly skip this window if it is not
5095428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    // an IME target or the application for the screenshot
5096428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    // is not the current IME target.
5097428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    if (!ws.mIsImWindow || !isImeTarget) {
5098428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        // And finally, this window is of no interest if it
5099428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        // is not associated with the screenshot app.
5100428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        if (ws.mAppToken == null || ws.mAppToken.token != appToken) {
5101428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                            continue;
5102428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        }
5103428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    }
5104428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                }
5105428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn
5106428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                // We keep on including windows until we go past a full-screen
5107428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                // window.
5108428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                including = !ws.mIsImWindow && !ws.isFullscreen(dw, dh);
5109428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn
5110d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn                if (maxLayer < ws.mAnimLayer) {
5111d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn                    maxLayer = ws.mAnimLayer;
5112d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn                }
51132aded18b0ef9f189771f70f05091493a44ec46aeJim Miller
51142aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                // Don't include wallpaper in bounds calculation
51152aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                if (!ws.mIsWallpaper) {
5116ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                    final Rect wf = ws.mFrame;
51172aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                    final Rect cr = ws.mContentInsets;
51182aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                    int left = wf.left + cr.left;
51192aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                    int top = wf.top + cr.top;
51202aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                    int right = wf.right - cr.right;
51212aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                    int bottom = wf.bottom - cr.bottom;
51222aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                    frame.union(left, top, right, bottom);
51232aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                }
51240aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            }
51250aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            Binder.restoreCallingIdentity(ident);
51260aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
5127dd962ee1633b1e479bca5eae83744262fb69867fDianne Hackborn            // Constrain frame to the screen size.
5128dd962ee1633b1e479bca5eae83744262fb69867fDianne Hackborn            frame.intersect(0, 0, dw, dh);
5129e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller
5130cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn            if (frame.isEmpty() || maxLayer == 0) {
51310aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                return null;
51320aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            }
51330aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
51340aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            // The screenshot API does not apply the current screen rotation.
51350aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            rot = mDisplay.getRotation();
51360aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            int fw = frame.width();
51370aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            int fh = frame.height();
51380aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
513928637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller            // Constrain thumbnail to smaller of screen width or height. Assumes aspect
514028637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller            // of thumbnail is the same as the screen (in landscape) or square.
5141bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka            float targetWidthScale = width / (float) fw;
5142bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka            float targetHeightScale = height / (float) fh;
514328637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller            if (dw <= dh) {
5144bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka                scale = targetWidthScale;
5145bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka                // If aspect of thumbnail is the same as the screen (in landscape),
5146bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka                // select the slightly larger value so we fill the entire bitmap
5147bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka                if (targetHeightScale > scale && (int) (targetHeightScale * fw) == width) {
5148bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka                    scale = targetHeightScale;
5149bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka                }
515028637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller            } else {
5151bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka                scale = targetHeightScale;
5152bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka                // If aspect of thumbnail is the same as the screen (in landscape),
5153bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka                // select the slightly larger value so we fill the entire bitmap
5154bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka                if (targetWidthScale > scale && (int) (targetWidthScale * fh) == height) {
5155bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka                    scale = targetWidthScale;
5156bfd24acd318ef958bb7997c9cbf95c5fb15b10acMichael Jurka                }
515728637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller            }
51580aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
51590aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            // The screen shot will contain the entire screen.
5160428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            dw = (int)(dw*scale);
5161428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            dh = (int)(dh*scale);
51620aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            if (rot == Surface.ROTATION_90 || rot == Surface.ROTATION_270) {
51630aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                int tmp = dw;
51640aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                dw = dh;
51650aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                dh = tmp;
51660aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                rot = (rot == Surface.ROTATION_90) ? Surface.ROTATION_270 : Surface.ROTATION_90;
51670aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            }
5168cfb9f2bca39772aecd072e2a30342a67b6319bbbDianne Hackborn            if (DEBUG_SCREENSHOT) {
5169cfb9f2bca39772aecd072e2a30342a67b6319bbbDianne Hackborn                Slog.i(TAG, "Screenshot: " + dw + "x" + dh + " from 0 to " + maxLayer);
5170cfb9f2bca39772aecd072e2a30342a67b6319bbbDianne Hackborn                for (int i=0; i<mWindows.size(); i++) {
5171cfb9f2bca39772aecd072e2a30342a67b6319bbbDianne Hackborn                    Slog.i(TAG, mWindows.get(i) + ": " + mWindows.get(i).mLayer
5172cfb9f2bca39772aecd072e2a30342a67b6319bbbDianne Hackborn                            + " animLayer=" + mWindows.get(i).mAnimLayer
5173cfb9f2bca39772aecd072e2a30342a67b6319bbbDianne Hackborn                            + " surfaceLayer=" + mWindows.get(i).mSurfaceLayer);
5174cfb9f2bca39772aecd072e2a30342a67b6319bbbDianne Hackborn                }
5175cfb9f2bca39772aecd072e2a30342a67b6319bbbDianne Hackborn            }
5176d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn            rawss = Surface.screenshot(dw, dh, 0, maxLayer);
51770aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        }
51780aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
5179cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn        if (rawss == null) {
51803ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn            Slog.w(TAG, "Failure taking screenshot for (" + dw + "x" + dh
518188b03bd2e12c10c73e455a7eccf7d1aa324049d7Dianne Hackborn                    + ") to layer " + maxLayer);
5182cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn            return null;
5183cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn        }
5184e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller
5185e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller        Bitmap bm = Bitmap.createBitmap(width, height, rawss.getConfig());
51860aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        Matrix matrix = new Matrix();
51870aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        ScreenRotationAnimation.createRotationMatrix(rot, dw, dh, matrix);
51880aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        matrix.postTranslate(-(int)(frame.left*scale), -(int)(frame.top*scale));
51890aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        Canvas canvas = new Canvas(bm);
51900aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        canvas.drawBitmap(rawss, matrix, null);
51916311d0a079702b29984c0d31937345be105e1a5eDianne Hackborn        canvas.setBitmap(null);
51920aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
51930aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        rawss.recycle();
51940aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        return bm;
51950aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn    }
51960aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
519701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown    /**
519801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     * Freeze rotation changes.  (Enable "rotation lock".)
519901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     * Persists across reboots.
52004dfce20cac7492882d366d053006795aefad59daJeff Brown     * @param rotation The desired rotation to freeze to, or -1 to use the
52014dfce20cac7492882d366d053006795aefad59daJeff Brown     * current rotation.
520201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     */
52034dfce20cac7492882d366d053006795aefad59daJeff Brown    public void freezeRotation(int rotation) {
5204b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION,
52052ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler                "freezeRotation()")) {
5206b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler            throw new SecurityException("Requires SET_ORIENTATION permission");
5207b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        }
52084dfce20cac7492882d366d053006795aefad59daJeff Brown        if (rotation < -1 || rotation > Surface.ROTATION_270) {
52094dfce20cac7492882d366d053006795aefad59daJeff Brown            throw new IllegalArgumentException("Rotation argument must be -1 or a valid "
52104dfce20cac7492882d366d053006795aefad59daJeff Brown                    + "rotation constant.");
52114dfce20cac7492882d366d053006795aefad59daJeff Brown        }
5212b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler
52132ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler        if (DEBUG_ORIENTATION) Slog.v(TAG, "freezeRotation: mRotation=" + mRotation);
52142ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler
52154dfce20cac7492882d366d053006795aefad59daJeff Brown        mPolicy.setUserRotationMode(WindowManagerPolicy.USER_ROTATION_LOCKED,
52164dfce20cac7492882d366d053006795aefad59daJeff Brown                rotation == -1 ? mRotation : rotation);
521701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        updateRotationUnchecked(false);
5218b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler    }
5219b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler
522001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown    /**
522101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     * Thaw rotation changes.  (Disable "rotation lock".)
522201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     * Persists across reboots.
522301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     */
5224b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler    public void thawRotation() {
5225b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION,
52262ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler                "thawRotation()")) {
5227b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler            throw new SecurityException("Requires SET_ORIENTATION permission");
5228b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        }
5229b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler
52302ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler        if (DEBUG_ORIENTATION) Slog.v(TAG, "thawRotation: mRotation=" + mRotation);
52312ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler
52322ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler        mPolicy.setUserRotationMode(WindowManagerPolicy.USER_ROTATION_FREE, 777); // rot not used
523301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        updateRotationUnchecked(false);
5234b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler    }
5235b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler
523601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown    /**
523701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     * Recalculate the current rotation.
523801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     *
523901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     * Called by the window manager policy whenever the state of the system changes
524001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     * such that the current rotation might need to be updated, such as when the
524101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     * device is docked or rotated into a new posture.
524201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     */
524301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown    public void updateRotation(boolean alwaysSendConfiguration) {
524401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        updateRotationUnchecked(alwaysSendConfiguration);
524501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown    }
52469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
524701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown    /**
524801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     * Temporarily pauses rotation changes until resumed.
524901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     *
525001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     * This can be used to prevent rotation changes from occurring while the user is
525101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     * performing certain operations, such as drag and drop.
525201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     *
525301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     * This call nests and must be matched by an equal number of calls to {@link #resumeRotation}.
525401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     */
525501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown    void pauseRotationLocked() {
525601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        mDeferredRotationPauseCount += 1;
525701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown    }
525801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown
525901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown    /**
526001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     * Resumes normal rotation changes after being paused.
526101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     */
526201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown    void resumeRotationLocked() {
526301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        if (mDeferredRotationPauseCount > 0) {
526401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            mDeferredRotationPauseCount -= 1;
526501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            if (mDeferredRotationPauseCount == 0) {
526601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown                boolean changed = updateRotationUncheckedLocked(false);
526701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown                if (changed) {
526801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown                    mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
526901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown                }
527001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            }
527101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        }
52729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
527306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
527401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown    public void updateRotationUnchecked(
527501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            boolean alwaysSendConfiguration) {
527601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        if(DEBUG_ORIENTATION) Slog.v(TAG, "updateRotationUnchecked("
527701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown                   + "alwaysSendConfiguration=" + alwaysSendConfiguration + ")");
527806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
52799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long origId = Binder.clearCallingIdentity();
52809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean changed;
52819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
528201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            changed = updateRotationUncheckedLocked(false);
52839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
528406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
5285e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        if (changed || alwaysSendConfiguration) {
52869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendNewConfiguration();
52879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
528806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
52899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
52909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
529106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
5292e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    /**
529301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     * Updates the current rotation.
529401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     *
529501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     * Returns true if the rotation has been changed.  In this case YOU
529601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown     * MUST CALL sendNewConfiguration() TO UNFREEZE THE SCREEN.
5297e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     */
529801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown    public boolean updateRotationUncheckedLocked(boolean inTransaction) {
529901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        if (mDeferredRotationPauseCount > 0) {
530001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            // Rotation updates have been paused temporarily.  Defer the update until
530101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            // updates have been resumed.
530201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            if (DEBUG_ORIENTATION) Slog.v(TAG, "Deferring rotation, rotation is paused.");
5303ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate            return false;
5304ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate        }
5305ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate
530601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) {
530701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            // Rotation updates cannot be performed while the previous rotation change
530801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            // animation is still in progress.  Skip this update.  We will try updating
530901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            // again after the animation is finished and the display is unfrozen.
531001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            if (DEBUG_ORIENTATION) Slog.v(TAG, "Deferring rotation, animation in progress.");
531101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            return false;
5312dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        }
5313dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn
531401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        if (!mDisplayEnabled) {
531501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            // No point choosing a rotation if the display is not enabled.
531601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            if (DEBUG_ORIENTATION) Slog.v(TAG, "Deferring rotation, display is not enabled.");
531701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            return false;
5318dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        }
531906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
532001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        // TODO: Implement forced rotation changes.
532101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        //       Set mAltOrientation to indicate that the application is receiving
532201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        //       an orientation that has different metrics than it expected.
532301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        //       eg. Portrait instead of Landscape.
5324dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn
532501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        int rotation = mPolicy.rotationForOrientationLw(mForcedAppOrientation, mRotation);
532601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        boolean altOrientation = !mPolicy.rotationHasCompatibleMetricsLw(
532701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown                mForcedAppOrientation, rotation);
532801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown
532901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        if (DEBUG_ORIENTATION) {
533001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            Slog.v(TAG, "Application requested orientation "
533101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown                    + mForcedAppOrientation + ", got rotation " + rotation
533201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown                    + " which has " + (altOrientation ? "incompatible" : "compatible")
533301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown                    + " metrics");
533401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        }
533501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown
533601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        if (mRotation == rotation && mAltOrientation == altOrientation) {
533701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            // No change.
533801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            return false;
533901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        }
534001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown
534101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        if (DEBUG_ORIENTATION) {
534201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            Slog.v(TAG,
534301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown                "Rotation changed to " + rotation + (altOrientation ? " (alt)" : "")
534401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown                + " from " + mRotation + (mAltOrientation ? " (alt)" : "")
534501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown                + ", forceApp=" + mForcedAppOrientation);
534601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        }
534701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown
534801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        mRotation = rotation;
534901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        mAltOrientation = altOrientation;
5350c0347aa19f354a8e1ff4fcd5372b134c0c7c16adJeff Brown        mPolicy.setRotationLw(mRotation);
535101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown
535201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        mWindowsFreezingScreen = true;
535301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT);
535401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        mH.sendMessageDelayed(mH.obtainMessage(H.WINDOW_FREEZE_TIMEOUT), 2000);
535501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        mWaitingForConfig = true;
535601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        mLayoutNeeded = true;
535701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        startFreezingDisplayLocked(inTransaction);
535801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        mInputManager.setDisplayOrientation(0, rotation);
535901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown
5360e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis        if (!inTransaction) {
536136991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn            if (SHOW_TRANSACTIONS)  Slog.i(TAG,
5362e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis                    ">>> OPEN TRANSACTION setRotationUnchecked");
5363e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis            Surface.openTransaction();
5364e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis        }
5365e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis        try {
5366e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis            // NOTE: We disable the rotation in the emulator because
5367e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis            //       it doesn't support hardware OpenGL emulation yet.
5368e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis            if (CUSTOM_SCREEN_ROTATION && mScreenRotationAnimation != null
5369e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis                    && mScreenRotationAnimation.hasScreenshot()) {
5370e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis                mScreenRotationAnimation.setRotation(rotation);
5371e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis            }
5372e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis            Surface.setOrientation(0, rotation);
5373e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis        } finally {
537401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            if (!inTransaction) {
5375e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis                Surface.closeTransaction();
537636991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn                if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
5377e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis                        "<<< CLOSE TRANSACTION setRotationUnchecked");
53789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
537901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        }
5380e2909e121c45d58fe587849b1474c80745fcd2b9Jamie Gennis
538101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        rebuildBlackFrame(inTransaction);
538206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
538301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        for (int i=mWindows.size()-1; i>=0; i--) {
538401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            WindowState w = mWindows.get(i);
538501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            if (w.mSurface != null) {
53863ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn                if (DEBUG_ORIENTATION) Slog.v(TAG, "Set mOrientationChanging of " + w);
538701a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown                w.mOrientationChanging = true;
538801a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            }
538901a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        }
539001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        for (int i=mRotationWatchers.size()-1; i>=0; i--) {
539101a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            try {
539201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown                mRotationWatchers.get(i).onRotationChanged(rotation);
539301a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            } catch (RemoteException e) {
539401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            }
539501a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        }
539601a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown        return true;
53979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
539806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
53999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getRotation() {
54009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRotation;
54019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
54029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int watchRotation(IRotationWatcher watcher) {
54049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final IBinder watcherBinder = watcher.asBinder();
54059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IBinder.DeathRecipient dr = new IBinder.DeathRecipient() {
54069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void binderDied() {
54079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (mWindowMap) {
54089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i=0; i<mRotationWatchers.size(); i++) {
54099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (watcherBinder == mRotationWatchers.get(i).asBinder()) {
5410fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu                            IRotationWatcher removed = mRotationWatchers.remove(i);
5411fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu                            if (removed != null) {
5412fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu                                removed.asBinder().unlinkToDeath(this, 0);
5413fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu                            }
54149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            i--;
54159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
54169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
54179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
54189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
54199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
542006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
54219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
54229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
54239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                watcher.asBinder().linkToDeath(dr, 0);
54249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRotationWatchers.add(watcher);
54259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
54269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Client died, no cleanup needed.
54279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
542806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
54299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mRotation;
54309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
54319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
54329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5434dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     * Apps that use the compact menu panel (as controlled by the panelMenuIsCompact
5435dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     * theme attribute) on devices that feature a physical options menu key attempt to position
5436dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     * their menu panel window along the edge of the screen nearest the physical menu key.
5437dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     * This lowers the travel distance between invoking the menu panel and selecting
5438dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     * a menu option.
5439dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     *
5440dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     * This method helps control where that menu is placed. Its current implementation makes
5441dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     * assumptions about the menu key and its relationship to the screen based on whether
5442dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     * the device's natural orientation is portrait (width < height) or landscape.
5443dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     *
5444dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     * The menu key is assumed to be located along the bottom edge of natural-portrait
5445dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     * devices and along the right edge of natural-landscape devices. If these assumptions
5446dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     * do not hold for the target device, this method should be changed to reflect that.
5447dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     *
5448dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     * @return A {@link Gravity} value for placing the options menu window
5449dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell     */
5450dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell    public int getPreferredOptionsPanelGravity() {
5451dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell        synchronized (mWindowMap) {
5452dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell            final int rotation = getRotation();
5453dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell
5454dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell            if (mInitialDisplayWidth < mInitialDisplayHeight) {
5455dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                // On devices with a natural orientation of portrait
5456dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                switch (rotation) {
5457dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                    default:
5458dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                    case Surface.ROTATION_0:
5459dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                        return Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
5460dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                    case Surface.ROTATION_90:
546167ed6c7224b902ae56a109701a241210e18cf721Adam Powell                        return Gravity.RIGHT | Gravity.BOTTOM;
5462dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                    case Surface.ROTATION_180:
546367ed6c7224b902ae56a109701a241210e18cf721Adam Powell                        return Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
5464dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                    case Surface.ROTATION_270:
546567ed6c7224b902ae56a109701a241210e18cf721Adam Powell                        return Gravity.LEFT | Gravity.BOTTOM;
5466dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                }
5467dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell            } else {
5468dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                // On devices with a natural orientation of landscape
5469dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                switch (rotation) {
5470dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                    default:
5471dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                    case Surface.ROTATION_0:
547267ed6c7224b902ae56a109701a241210e18cf721Adam Powell                        return Gravity.RIGHT | Gravity.BOTTOM;
5473dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                    case Surface.ROTATION_90:
5474dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                        return Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
5475dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                    case Surface.ROTATION_180:
547667ed6c7224b902ae56a109701a241210e18cf721Adam Powell                        return Gravity.LEFT | Gravity.BOTTOM;
5477dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                    case Surface.ROTATION_270:
547867ed6c7224b902ae56a109701a241210e18cf721Adam Powell                        return Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
5479dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell                }
5480dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell            }
5481dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell        }
5482dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell    }
5483dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell
5484dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell    /**
54859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Starts the view server on the specified port.
54869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
54879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param port The port to listener to.
54889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
54899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the server was successfully started, false otherwise.
54909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5491a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn     * @see com.android.server.wm.ViewServer
5492a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn     * @see com.android.server.wm.ViewServer#VIEW_SERVER_DEFAULT_PORT
54939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
54949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean startViewServer(int port) {
549506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy        if (isSystemSecure()) {
54969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
54979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
54989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(Manifest.permission.DUMP, "startViewServer")) {
55009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
55019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (port < 1024) {
55049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
55059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mViewServer != null) {
55089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mViewServer.isRunning()) {
55099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
55109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mViewServer.start();
55119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IOException e) {
55128a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "View server did not start");
55139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
55149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
55159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
55169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
55199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mViewServer = new ViewServer(this, port);
55209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mViewServer.start();
55219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
55228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "View server did not start");
55239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
55259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
55269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
552706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy    private boolean isSystemSecure() {
552806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy        return "1".equals(SystemProperties.get(SYSTEM_SECURE, "1")) &&
552906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                "0".equals(SystemProperties.get(SYSTEM_DEBUGGABLE, "0"));
553006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy    }
553106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
55329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
55339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Stops the view server if it exists.
55349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
55359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the server stopped, false if it wasn't started or
55369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         couldn't be stopped.
55379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5538a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn     * @see com.android.server.wm.ViewServer
55399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
55409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean stopViewServer() {
554106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy        if (isSystemSecure()) {
55429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
55439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(Manifest.permission.DUMP, "stopViewServer")) {
55469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
55479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mViewServer != null) {
55509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mViewServer.stop();
55519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
55539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
55549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
55569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether the view server is running.
55579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
55589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the server is running, false otherwise.
55599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5560a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn     * @see com.android.server.wm.ViewServer
55619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
55629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isViewServerRunning() {
556306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy        if (isSystemSecure()) {
55649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
55659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(Manifest.permission.DUMP, "isViewServerRunning")) {
55689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
55699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mViewServer != null && mViewServer.isRunning();
55729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
55739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
55759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Lists all availble windows in the system. The listing is written in the
55769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * specified Socket's output stream with the following syntax:
55779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * windowHashCodeInHexadecimal windowName
55789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Each line of the ouput represents a different window.
55799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
55809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param client The remote client to send the listing to.
55819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return False if an error occured, true otherwise.
55829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
55839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean viewServerListWindows(Socket client) {
558406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy        if (isSystemSecure()) {
55859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
55869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean result = true;
55899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5590e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        WindowState[] windows;
55919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
55929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //noinspection unchecked
5593e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            windows = mWindows.toArray(new WindowState[mWindows.size()]);
55949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        BufferedWriter out = null;
55979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Any uncaught exception will crash the system process
55999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
56009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            OutputStream clientStream = client.getOutputStream();
56019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out = new BufferedWriter(new OutputStreamWriter(clientStream), 8 * 1024);
56029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int count = windows.length;
56049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < count; i++) {
5605e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                final WindowState w = windows[i];
56069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.write(Integer.toHexString(System.identityHashCode(w)));
56079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.write(' ');
56089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.append(w.mAttrs.getTitle());
56099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.write('\n');
56109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
56119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.write("DONE.\n");
56139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.flush();
56149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
56159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            result = false;
56169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
56179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (out != null) {
56189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
56199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.close();
56209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IOException e) {
56219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    result = false;
56229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
56239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
56249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
56259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
56279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
56289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5630f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev     * Returns the focused window in the following format:
5631f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev     * windowHashCodeInHexadecimal windowName
5632f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev     *
5633f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev     * @param client The remote client to send the listing to.
5634f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev     * @return False if an error occurred, true otherwise.
5635f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev     */
5636f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev    boolean viewServerGetFocusedWindow(Socket client) {
5637f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        if (isSystemSecure()) {
5638f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            return false;
5639f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        }
5640f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev
5641f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        boolean result = true;
5642f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev
5643f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        WindowState focusedWindow = getFocusedWindow();
5644f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev
5645f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        BufferedWriter out = null;
5646f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev
5647f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        // Any uncaught exception will crash the system process
5648f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        try {
5649f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            OutputStream clientStream = client.getOutputStream();
5650f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            out = new BufferedWriter(new OutputStreamWriter(clientStream), 8 * 1024);
5651f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev
5652f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            if(focusedWindow != null) {
5653f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev                out.write(Integer.toHexString(System.identityHashCode(focusedWindow)));
5654f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev                out.write(' ');
5655f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev                out.append(focusedWindow.mAttrs.getTitle());
5656f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            }
5657f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            out.write('\n');
5658f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            out.flush();
5659f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        } catch (Exception e) {
5660f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            result = false;
56619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
56629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (out != null) {
56639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
56649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.close();
56659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IOException e) {
56669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    result = false;
56679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
56689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
56699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
56709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
56729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
56739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
56759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sends a command to a target window. The result of the command, if any, will be
56769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * written in the output stream of the specified socket.
56779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
56789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The parameters must follow this syntax:
56799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * windowHashcode extra
56809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
56819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Where XX is the length in characeters of the windowTitle.
56829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
56839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The first parameter is the target window. The window with the specified hashcode
56849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be the target. If no target can be found, nothing happens. The extra parameters
56859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be delivered to the target window and as parameters to the command itself.
56869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
56879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param client The remote client to sent the result, if any, to.
56889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param command The command to execute.
56899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param parameters The command parameters.
56909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
56919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the command was successfully delivered, false otherwise. This does
56929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         not indicate whether the command itself was successful.
56939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
56949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean viewServerWindowCommand(Socket client, String command, String parameters) {
569506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy        if (isSystemSecure()) {
56969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
56979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
56989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean success = true;
57009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data = null;
57019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel reply = null;
57029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
570343b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev        BufferedWriter out = null;
570443b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev
57059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Any uncaught exception will crash the system process
57069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
57079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Find the hashcode of the window
57089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int index = parameters.indexOf(' ');
57099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (index == -1) {
57109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                index = parameters.length();
57119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
57129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final String code = parameters.substring(0, index);
5713236092a36216c79507ec19eb207831810caced19Romain Guy            int hashCode = (int) Long.parseLong(code, 16);
57149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
57159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Extract the command's parameter after the window description
57169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (index < parameters.length()) {
57179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                parameters = parameters.substring(index + 1);
57189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
57199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                parameters = "";
57209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
57219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
57226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            final WindowState window = findWindow(hashCode);
57239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (window == null) {
57249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
57259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
57269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
57279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data = Parcel.obtain();
57289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.writeInterfaceToken("android.view.IWindow");
57299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.writeString(command);
57309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.writeString(parameters);
57319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.writeInt(1);
57329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ParcelFileDescriptor.fromSocket(client).writeToParcel(data, 0);
57339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
57349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply = Parcel.obtain();
57359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
57369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final IBinder binder = window.mClient.asBinder();
57379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // TODO: GET THE TRANSACTION CODE IN A SAFER MANNER
57389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            binder.transact(IBinder.FIRST_CALL_TRANSACTION, data, reply, 0);
57399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
57409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply.readException();
57419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
574243b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev            if (!client.isOutputShutdown()) {
574343b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
574443b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                out.write("DONE\n");
574543b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                out.flush();
574643b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev            }
574743b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev
57489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
57498a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Could not send command " + command + " with parameters " + parameters, e);
57509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            success = false;
57519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
57529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (data != null) {
57539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                data.recycle();
57549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
57559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (reply != null) {
57569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reply.recycle();
57579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
575843b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev            if (out != null) {
575943b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                try {
576043b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                    out.close();
576143b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                } catch (IOException e) {
576243b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev
576343b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                }
576443b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev            }
57659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
57669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
57679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return success;
57689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
57699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5770dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    public void addWindowChangeListener(WindowChangeListener listener) {
5771dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        synchronized(mWindowMap) {
5772dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            mWindowChangeListeners.add(listener);
5773dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        }
5774dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    }
5775dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev
5776dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    public void removeWindowChangeListener(WindowChangeListener listener) {
5777dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        synchronized(mWindowMap) {
5778dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            mWindowChangeListeners.remove(listener);
5779dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        }
5780dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    }
5781dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev
5782dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    private void notifyWindowsChanged() {
5783dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        WindowChangeListener[] windowChangeListeners;
5784dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        synchronized(mWindowMap) {
5785dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            if(mWindowChangeListeners.isEmpty()) {
5786dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                return;
5787dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            }
5788dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            windowChangeListeners = new WindowChangeListener[mWindowChangeListeners.size()];
5789dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            windowChangeListeners = mWindowChangeListeners.toArray(windowChangeListeners);
5790dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        }
5791dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        int N = windowChangeListeners.length;
5792dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        for(int i = 0; i < N; i++) {
5793dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            windowChangeListeners[i].windowsChanged();
5794dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        }
5795dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    }
5796dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev
57976e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev    private void notifyFocusChanged() {
57986e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        WindowChangeListener[] windowChangeListeners;
57996e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        synchronized(mWindowMap) {
58006e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev            if(mWindowChangeListeners.isEmpty()) {
58016e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev                return;
58026e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev            }
58036e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev            windowChangeListeners = new WindowChangeListener[mWindowChangeListeners.size()];
58046e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev            windowChangeListeners = mWindowChangeListeners.toArray(windowChangeListeners);
58056e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        }
58066e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        int N = windowChangeListeners.length;
58076e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        for(int i = 0; i < N; i++) {
58086e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev            windowChangeListeners[i].focusChanged();
58096e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        }
58106e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev    }
58116e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev
58129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowState findWindow(int hashCode) {
58139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (hashCode == -1) {
58149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getFocusedWindow();
58159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
58169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
58179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
5818e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            final ArrayList<WindowState> windows = mWindows;
58199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int count = windows.size();
58209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
58219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < count; i++) {
5822e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState w = windows.get(i);
58239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (System.identityHashCode(w) == hashCode) {
58249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return w;
58259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
58269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
58279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
58289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
58299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
58309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
58319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
58329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
58339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Instruct the Activity Manager to fetch the current configuration and broadcast
58349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that to config-changed listeners if appropriate.
58359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
58369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void sendNewConfiguration() {
58379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
58389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mActivityManager.updateConfiguration(null);
58399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
58409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
58419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
584206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
58439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Configuration computeNewConfiguration() {
58449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
584594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            Configuration config = computeNewConfigurationLocked();
584694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            if (config == null && mWaitingForConfig) {
584794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                // Nothing changed but we are waiting for something... stop that!
584894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                mWaitingForConfig = false;
584994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                performLayoutAndPlaceSurfacesLocked();
585094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            }
585194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            return config;
5852c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        }
5853c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn    }
585406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
5855c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn    Configuration computeNewConfigurationLocked() {
5856c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        Configuration config = new Configuration();
585709e5b9daf3c675b8943015abb3b420fd45f19fe8Dianne Hackborn        config.fontScale = 0;
5858c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        if (!computeNewConfigurationLocked(config)) {
5859c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn            return null;
5860c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        }
5861c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        return config;
5862c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn    }
586306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
58641f903c3b577d20f7db7e3d5875cafe577d0d845fDianne Hackborn    private int reduceConfigWidthSize(int curSize, int rotation, float density, int dw, int dh) {
58651f903c3b577d20f7db7e3d5875cafe577d0d845fDianne Hackborn        int size = (int)(mPolicy.getConfigDisplayWidth(dw, dh, rotation) / density);
586669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        if (size < curSize) {
586769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn            curSize = size;
586869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        }
586969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        return curSize;
587069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    }
587169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn
587256b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn    private int reduceConfigLayout(int curLayout, int rotation, float density,
587356b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            int dw, int dh) {
587456b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        // Get the app screen size at this rotation.
587556b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        int w = mPolicy.getNonDecorDisplayWidth(dw, dh, rotation);
587656b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        int h = mPolicy.getNonDecorDisplayHeight(dw, dh, rotation);
587756b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn
587856b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        // Compute the screen layout size class for this rotation.
587956b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        int screenLayoutSize;
588056b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        boolean screenLayoutLong;
588156b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        boolean screenLayoutCompatNeeded;
588256b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        int longSize = w;
588356b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        int shortSize = h;
588456b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        if (longSize < shortSize) {
588556b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            int tmp = longSize;
588656b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            longSize = shortSize;
588756b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            shortSize = tmp;
588856b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        }
588956b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        longSize = (int)(longSize/density);
589056b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        shortSize = (int)(shortSize/density);
589156b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn
589256b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        // These semi-magic numbers define our compatibility modes for
589356b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        // applications with different screens.  These are guarantees to
589456b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        // app developers about the space they can expect for a particular
589556b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        // configuration.  DO NOT CHANGE!
589656b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        if (longSize < 470) {
589756b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            // This is shorter than an HVGA normal density screen (which
589856b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            // is 480 pixels on its long side).
589956b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            screenLayoutSize = Configuration.SCREENLAYOUT_SIZE_SMALL;
590056b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            screenLayoutLong = false;
590156b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            screenLayoutCompatNeeded = false;
590256b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        } else {
590356b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            // What size is this screen screen?
590456b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            if (longSize >= 960 && shortSize >= 720) {
590556b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn                // 1.5xVGA or larger screens at medium density are the point
590656b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn                // at which we consider it to be an extra large screen.
590756b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn                screenLayoutSize = Configuration.SCREENLAYOUT_SIZE_XLARGE;
590856b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            } else if (longSize >= 640 && shortSize >= 480) {
590956b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn                // VGA or larger screens at medium density are the point
591056b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn                // at which we consider it to be a large screen.
591156b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn                screenLayoutSize = Configuration.SCREENLAYOUT_SIZE_LARGE;
591256b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            } else {
591356b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn                screenLayoutSize = Configuration.SCREENLAYOUT_SIZE_NORMAL;
591456b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            }
591556b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn
591656b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            // If this screen is wider than normal HVGA, or taller
591756b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            // than FWVGA, then for old apps we want to run in size
591856b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            // compatibility mode.
591956b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            if (shortSize > 321 || longSize > 570) {
592056b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn                screenLayoutCompatNeeded = true;
592156b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            } else {
592256b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn                screenLayoutCompatNeeded = false;
592356b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            }
592456b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn
592556b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            // Is this a long screen?
592656b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            if (((longSize*3)/5) >= (shortSize-1)) {
592756b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn                // Anything wider than WVGA (5:3) is considering to be long.
592856b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn                screenLayoutLong = true;
592956b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            } else {
593056b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn                screenLayoutLong = false;
593156b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            }
593256b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        }
593356b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn
593456b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        // Now reduce the last screenLayout to not be better than what we
593556b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        // have found.
593656b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        if (!screenLayoutLong) {
593756b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            curLayout = (curLayout&~Configuration.SCREENLAYOUT_LONG_MASK)
593856b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn                    | Configuration.SCREENLAYOUT_LONG_NO;
593956b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        }
594056b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        if (screenLayoutCompatNeeded) {
594156b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            curLayout |= Configuration.SCREENLAYOUT_COMPAT_NEEDED;
594256b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        }
594356b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        int curSize = curLayout&Configuration.SCREENLAYOUT_SIZE_MASK;
594456b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        if (screenLayoutSize < curSize) {
594556b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            curLayout = (curLayout&~Configuration.SCREENLAYOUT_SIZE_MASK)
594656b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn                    | screenLayoutSize;
594756b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        }
594856b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        return curLayout;
594956b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn    }
595056b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn
595156b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn    private void computeSmallestWidthAndScreenLayout(boolean rotated, int dw, int dh,
595256b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn            float density, Configuration outConfig) {
59535fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        // We need to determine the smallest width that will occur under normal
59545fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        // operation.  To this, start with the base screen size and compute the
59555fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        // width under the different possible rotations.  We need to un-rotate
59565fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        // the current screen dimensions before doing this.
59575fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        int unrotDw, unrotDh;
59585fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        if (rotated) {
59595fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            unrotDw = dh;
59605fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            unrotDh = dw;
59615fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        } else {
59625fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            unrotDw = dw;
59635fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            unrotDh = dh;
59645fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        }
59651f903c3b577d20f7db7e3d5875cafe577d0d845fDianne Hackborn        int sw = reduceConfigWidthSize(unrotDw, Surface.ROTATION_0, density, unrotDw, unrotDh);
596609bd49a8a74cafe7f03aee769bfe0748bf3c2b51Dianne Hackborn        sw = reduceConfigWidthSize(sw, Surface.ROTATION_90, density, unrotDh, unrotDw);
59671f903c3b577d20f7db7e3d5875cafe577d0d845fDianne Hackborn        sw = reduceConfigWidthSize(sw, Surface.ROTATION_180, density, unrotDw, unrotDh);
596809bd49a8a74cafe7f03aee769bfe0748bf3c2b51Dianne Hackborn        sw = reduceConfigWidthSize(sw, Surface.ROTATION_270, density, unrotDh, unrotDw);
596956b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        int sl = Configuration.SCREENLAYOUT_SIZE_XLARGE
597056b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn                | Configuration.SCREENLAYOUT_LONG_YES;
597156b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        sl = reduceConfigLayout(sl, Surface.ROTATION_0, density, unrotDw, unrotDh);
597256b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        sl = reduceConfigLayout(sl, Surface.ROTATION_90, density, unrotDh, unrotDw);
597356b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        sl = reduceConfigLayout(sl, Surface.ROTATION_180, density, unrotDw, unrotDh);
597456b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        sl = reduceConfigLayout(sl, Surface.ROTATION_270, density, unrotDh, unrotDw);
597556b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        outConfig.smallestScreenWidthDp = sw;
597656b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        outConfig.screenLayout = sl;
59775fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    }
59785fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
597948a7651823030ed3c0f4c084b423430044425feaDianne Hackborn    private int reduceCompatConfigWidthSize(int curSize, int rotation, DisplayMetrics dm,
598048a7651823030ed3c0f4c084b423430044425feaDianne Hackborn            int dw, int dh) {
59811f903c3b577d20f7db7e3d5875cafe577d0d845fDianne Hackborn        dm.noncompatWidthPixels = mPolicy.getNonDecorDisplayWidth(dw, dh, rotation);
59821f903c3b577d20f7db7e3d5875cafe577d0d845fDianne Hackborn        dm.noncompatHeightPixels = mPolicy.getNonDecorDisplayHeight(dw, dh, rotation);
598348a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        float scale = CompatibilityInfo.computeCompatibleScaling(dm, null);
59842b31d53161789358de57fd396716a6503855c5daDianne Hackborn        int size = (int)(((dm.noncompatWidthPixels / scale) / dm.density) + .5f);
598548a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        if (curSize == 0 || size < curSize) {
598648a7651823030ed3c0f4c084b423430044425feaDianne Hackborn            curSize = size;
598748a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        }
598848a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        return curSize;
598948a7651823030ed3c0f4c084b423430044425feaDianne Hackborn    }
599048a7651823030ed3c0f4c084b423430044425feaDianne Hackborn
599148a7651823030ed3c0f4c084b423430044425feaDianne Hackborn    private int computeCompatSmallestWidth(boolean rotated, DisplayMetrics dm, int dw, int dh) {
599248a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        mTmpDisplayMetrics.setTo(dm);
599348a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        dm = mTmpDisplayMetrics;
599448a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        int unrotDw, unrotDh;
599548a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        if (rotated) {
599648a7651823030ed3c0f4c084b423430044425feaDianne Hackborn            unrotDw = dh;
599748a7651823030ed3c0f4c084b423430044425feaDianne Hackborn            unrotDh = dw;
599848a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        } else {
599948a7651823030ed3c0f4c084b423430044425feaDianne Hackborn            unrotDw = dw;
600048a7651823030ed3c0f4c084b423430044425feaDianne Hackborn            unrotDh = dh;
600148a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        }
600248a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        int sw = reduceCompatConfigWidthSize(0, Surface.ROTATION_0, dm, unrotDw, unrotDh);
600348a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        sw = reduceCompatConfigWidthSize(sw, Surface.ROTATION_90, dm, unrotDh, unrotDw);
600448a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        sw = reduceCompatConfigWidthSize(sw, Surface.ROTATION_180, dm, unrotDw, unrotDh);
600548a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        sw = reduceCompatConfigWidthSize(sw, Surface.ROTATION_270, dm, unrotDh, unrotDw);
600648a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        return sw;
600748a7651823030ed3c0f4c084b423430044425feaDianne Hackborn    }
600848a7651823030ed3c0f4c084b423430044425feaDianne Hackborn
6009c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn    boolean computeNewConfigurationLocked(Configuration config) {
6010c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        if (mDisplay == null) {
6011c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn            return false;
60129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
601300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown
601400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        mInputManager.getInputConfiguration(config);
6015b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate
6016b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        // Use the effective "visual" dimensions based on current rotation
6017b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        final boolean rotated = (mRotation == Surface.ROTATION_90
6018b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate                || mRotation == Surface.ROTATION_270);
60197916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        final int realdw = rotated ? mBaseDisplayHeight : mBaseDisplayWidth;
60207916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        final int realdh = rotated ? mBaseDisplayWidth : mBaseDisplayHeight;
6021dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn
60221fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn        synchronized(mDisplaySizeLock) {
60231fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn            if (mAltOrientation) {
60241fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                mCurDisplayWidth = realdw;
60251fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                mCurDisplayHeight = realdh;
60261fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                if (realdw > realdh) {
60271fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                    // Turn landscape into portrait.
60281fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                    int maxw = (int)(realdh/1.3f);
60291fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                    if (maxw < realdw) {
60301fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                        mCurDisplayWidth = maxw;
60311fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                    }
60321fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                } else {
60331fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                    // Turn portrait into landscape.
60341fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                    int maxh = (int)(realdw/1.3f);
60351fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                    if (maxh < realdh) {
60361fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                        mCurDisplayHeight = maxh;
60371fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                    }
6038dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                }
6039dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            } else {
60401fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                mCurDisplayWidth = realdw;
60411fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                mCurDisplayHeight = realdh;
6042dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn            }
6043dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        }
6044dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn
6045dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        final int dw = mCurDisplayWidth;
6046dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        final int dh = mCurDisplayHeight;
6047b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate
6048c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        int orientation = Configuration.ORIENTATION_SQUARE;
6049c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        if (dw < dh) {
6050c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn            orientation = Configuration.ORIENTATION_PORTRAIT;
6051c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        } else if (dw > dh) {
6052c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn            orientation = Configuration.ORIENTATION_LANDSCAPE;
6053c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        }
6054c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        config.orientation = orientation;
6055ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
6056bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        // Update real display metrics.
6057bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        mDisplay.getMetricsWithSize(mRealDisplayMetrics, mCurDisplayWidth, mCurDisplayHeight);
6058dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn
6059bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        // Update application display metrics.
6060bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        final DisplayMetrics dm = mDisplayMetrics;
60611fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn        final int appWidth = mPolicy.getNonDecorDisplayWidth(dw, dh, mRotation);
60621fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn        final int appHeight = mPolicy.getNonDecorDisplayHeight(dw, dh, mRotation);
60631fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn        synchronized(mDisplaySizeLock) {
60641fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn            mAppDisplayWidth = appWidth;
60651fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn            mAppDisplayHeight = appHeight;
60661fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn        }
606736991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn        if (false) {
606836991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn            Slog.i(TAG, "Set app display size: " + mAppDisplayWidth
606936991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn                    + " x " + mAppDisplayHeight);
607036991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn        }
6071bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        mDisplay.getMetricsWithSize(dm, mAppDisplayWidth, mAppDisplayHeight);
6072dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn
60735fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        mCompatibleScreenScale = CompatibilityInfo.computeCompatibleScaling(dm,
60745fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                mCompatDisplayMetrics);
60751ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
60761f903c3b577d20f7db7e3d5875cafe577d0d845fDianne Hackborn        config.screenWidthDp = (int)(mPolicy.getConfigDisplayWidth(dw, dh, mRotation)
60771f903c3b577d20f7db7e3d5875cafe577d0d845fDianne Hackborn                / dm.density);
60781f903c3b577d20f7db7e3d5875cafe577d0d845fDianne Hackborn        config.screenHeightDp = (int)(mPolicy.getConfigDisplayHeight(dw, dh, mRotation)
60791f903c3b577d20f7db7e3d5875cafe577d0d845fDianne Hackborn                / dm.density);
608056b53b597f015fa73ca339deff62eadf287297aeDianne Hackborn        computeSmallestWidthAndScreenLayout(rotated, dw, dh, dm.density, config);
60815fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
60825fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        config.compatScreenWidthDp = (int)(config.screenWidthDp / mCompatibleScreenScale);
60835fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        config.compatScreenHeightDp = (int)(config.screenHeightDp / mCompatibleScreenScale);
608448a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        config.compatSmallestScreenWidthDp = computeCompatSmallestWidth(rotated, dm, dw, dh);
608569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn
6086597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        // Determine whether a hard keyboard is available and enabled.
60872992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        boolean hardKeyboardAvailable = config.keyboard != Configuration.KEYBOARD_NOKEYS;
60882992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        if (hardKeyboardAvailable != mHardKeyboardAvailable) {
60892992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            mHardKeyboardAvailable = hardKeyboardAvailable;
60902992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            mHardKeyboardEnabled = hardKeyboardAvailable;
60912992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
60922992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            mH.removeMessages(H.REPORT_HARD_KEYBOARD_STATUS_CHANGE);
60932992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            mH.sendEmptyMessage(H.REPORT_HARD_KEYBOARD_STATUS_CHANGE);
60942992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
60952992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        if (!mHardKeyboardEnabled) {
60962992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            config.keyboard = Configuration.KEYBOARD_NOKEYS;
60972992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
6098597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown
6099597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        // Update value of keyboardHidden, hardKeyboardHidden and navigationHidden
6100597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        // based on whether a hard or soft keyboard is present, whether navigation keys
6101597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        // are present and the lid switch state.
6102597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        config.keyboardHidden = Configuration.KEYBOARDHIDDEN_NO;
6103597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_NO;
6104597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        config.navigationHidden = Configuration.NAVIGATIONHIDDEN_NO;
6105597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        mPolicy.adjustConfigurationLw(config);
6106c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        return true;
61079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6108a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
61092992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    public boolean isHardKeyboardAvailable() {
61102992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        synchronized (mWindowMap) {
61112992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            return mHardKeyboardAvailable;
61122992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
61132992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
61142992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
61152992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    public boolean isHardKeyboardEnabled() {
61162992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        synchronized (mWindowMap) {
61172992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            return mHardKeyboardEnabled;
61182992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
61192992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
61202992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
61212992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    public void setHardKeyboardEnabled(boolean enabled) {
61222992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        synchronized (mWindowMap) {
61232992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            if (mHardKeyboardEnabled != enabled) {
61242992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                mHardKeyboardEnabled = enabled;
61252992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
61262992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            }
61272992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
61282992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
61292992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
61302992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    public void setOnHardKeyboardStatusChangeListener(
61312992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            OnHardKeyboardStatusChangeListener listener) {
61322992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        synchronized (mWindowMap) {
61332992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            mHardKeyboardStatusChangeListener = listener;
61342992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
61352992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
61362992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
61372992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    void notifyHardKeyboardStatusChange() {
61382992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        final boolean available, enabled;
61392992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        final OnHardKeyboardStatusChangeListener listener;
61402992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        synchronized (mWindowMap) {
61412992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            listener = mHardKeyboardStatusChangeListener;
61422992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            available = mHardKeyboardAvailable;
61432992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            enabled = mHardKeyboardEnabled;
61442992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
61452992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        if (listener != null) {
61462992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            listener.onHardKeyboardStatusChange(available, enabled);
61472992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
61482992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
61492992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
6150a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    // -------------------------------------------------------------
6151a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    // Drag and drop
6152a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    // -------------------------------------------------------------
6153a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
6154a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    IBinder prepareDragSurface(IWindow window, SurfaceSession session,
615502d2b3ba9ba830a8147db2739613f7bbb2d0fcbfChristopher Tate            int flags, int width, int height, Surface outSurface) {
6156a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        if (DEBUG_DRAG) {
6157a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            Slog.d(TAG, "prepare drag surface: w=" + width + " h=" + height
615802d2b3ba9ba830a8147db2739613f7bbb2d0fcbfChristopher Tate                    + " flags=" + Integer.toHexString(flags) + " win=" + window
6159a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    + " asbinder=" + window.asBinder());
6160a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        }
6161a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
6162a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        final int callerPid = Binder.getCallingPid();
6163a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        final long origId = Binder.clearCallingIdentity();
6164a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        IBinder token = null;
6165a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
6166a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        try {
6167a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            synchronized (mWindowMap) {
6168a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                try {
6169a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    if (mDragState == null) {
6170a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        Surface surface = new Surface(session, callerPid, "drag surface", 0,
6171a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                                width, height, PixelFormat.TRANSLUCENT, Surface.HIDDEN);
6172ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                        if (SHOW_TRANSACTIONS) Slog.i(TAG, "  DRAG "
6173ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                                + surface + ": CREATE");
6174a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        outSurface.copyFrom(surface);
61757b362e431f3e17a755e56bc7dbc99bd661cb46baChris Tate                        final IBinder winBinder = window.asBinder();
6176a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        token = new Binder();
61776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        mDragState = new DragState(this, token, surface, /*flags*/ 0, winBinder);
6178a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        mDragState.mSurface = surface;
6179a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        token = mDragState.mToken = new Binder();
6180a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
6181a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        // 5 second timeout for this window to actually begin the drag
61827b362e431f3e17a755e56bc7dbc99bd661cb46baChris Tate                        mH.removeMessages(H.DRAG_START_TIMEOUT, winBinder);
61837b362e431f3e17a755e56bc7dbc99bd661cb46baChris Tate                        Message msg = mH.obtainMessage(H.DRAG_START_TIMEOUT, winBinder);
6184a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        mH.sendMessageDelayed(msg, 5000);
6185a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    } else {
6186a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        Slog.w(TAG, "Drag already in progress");
6187a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
6188a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                } catch (Surface.OutOfResourcesException e) {
6189a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    Slog.e(TAG, "Can't allocate drag surface w=" + width + " h=" + height, e);
6190a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    if (mDragState != null) {
6191a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        mDragState.reset();
6192a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        mDragState = null;
6193a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
6194a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                }
6195a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            }
6196a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        } finally {
6197a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            Binder.restoreCallingIdentity(origId);
6198a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        }
6199a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
6200a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        return token;
6201a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    }
6202a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
62039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
62049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Input Events and Focus Management
62059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
620646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
62076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final InputMonitor mInputMonitor = new InputMonitor(this);
62087fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
62099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void pauseKeyDispatching(IBinder _token) {
62109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
62119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "pauseKeyDispatching()")) {
6212cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
62139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
621406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
62159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
62169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken token = mTokenMap.get(_token);
62179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token != null) {
621800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                mInputMonitor.pauseDispatchingLw(token);
62199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
62209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
62219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6222ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
62239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void resumeKeyDispatching(IBinder _token) {
62249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
62259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "resumeKeyDispatching()")) {
6226cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
6227e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan        }
6228e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan
62299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
62309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken token = mTokenMap.get(_token);
62319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token != null) {
623200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                mInputMonitor.resumeDispatchingLw(token);
6233e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan            }
6234e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan        }
62359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6236e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan
62379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setEventDispatching(boolean enabled) {
62389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
62399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "resumeKeyDispatching()")) {
6240cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
62419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
624206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
62439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
624400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            mInputMonitor.setEventDispatchingLw(enabled);
62459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
62469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
624706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
62489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
62499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Injects a keystroke event into the UI.
6250bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * Even when sync is false, this method may block while waiting for current
6251bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * input events to be dispatched.
625206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     *
625306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     * @param ev A motion event describing the keystroke action.  (Be sure to use
62549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link SystemClock#uptimeMillis()} as the timebase.)
62559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sync If true, wait for the event to be completed before returning to the caller.
62569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if event was dispatched, false if it was dropped for any reason
62579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
62589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean injectKeyEvent(KeyEvent ev, boolean sync) {
62599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long downTime = ev.getDownTime();
62609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long eventTime = ev.getEventTime();
626106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
62629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int action = ev.getAction();
62639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int code = ev.getKeyCode();
62649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int repeatCount = ev.getRepeatCount();
62659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int metaState = ev.getMetaState();
62669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int deviceId = ev.getDeviceId();
62679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int scancode = ev.getScanCode();
6268c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        int source = ev.getSource();
6269c6ded10dd1ee08c887d0e81d683a7611fbe3ca4dMike Playle        int flags = ev.getFlags();
6270c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
6271c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        if (source == InputDevice.SOURCE_UNKNOWN) {
6272c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            source = InputDevice.SOURCE_KEYBOARD;
6273c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        }
627406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
62759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (eventTime == 0) eventTime = SystemClock.uptimeMillis();
62769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (downTime == 0) downTime = eventTime;
627706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
62789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        KeyEvent newEvent = new KeyEvent(downTime, eventTime, action, code, repeatCount, metaState,
62794a88013a4a06a9ea80e8419f94694936e6b013f0Jean-Baptiste Queru                deviceId, scancode, flags | KeyEvent.FLAG_FROM_SYSTEM, source);
628006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
62812bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final int pid = Binder.getCallingPid();
62822bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final int uid = Binder.getCallingUid();
62832bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final long ident = Binder.clearCallingIdentity();
628446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
6285bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final int result = mInputManager.injectInputEvent(newEvent, pid, uid,
6286bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                sync ? InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISH
6287bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                        : InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT,
6288bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                INJECTION_TIMEOUT_MILLIS);
628946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
62902bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        Binder.restoreCallingIdentity(ident);
62917fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        return reportInjectionResult(result);
62929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
62939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
62959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Inject a pointer (touch) event into the UI.
6296bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * Even when sync is false, this method may block while waiting for current
6297bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * input events to be dispatched.
629806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     *
629906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     * @param ev A motion event describing the pointer (touch) action.  (As noted in
630006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     * {@link MotionEvent#obtain(long, long, int, float, float, int)}, be sure to use
63019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link SystemClock#uptimeMillis()} as the timebase.)
63029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sync If true, wait for the event to be completed before returning to the caller.
63039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if event was dispatched, false if it was dropped for any reason
63049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
63059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean injectPointerEvent(MotionEvent ev, boolean sync) {
63062bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final int pid = Binder.getCallingPid();
63072bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final int uid = Binder.getCallingUid();
63082bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final long ident = Binder.clearCallingIdentity();
630946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
6310c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        MotionEvent newEvent = MotionEvent.obtain(ev);
6311c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        if ((newEvent.getSource() & InputDevice.SOURCE_CLASS_POINTER) == 0) {
6312c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            newEvent.setSource(InputDevice.SOURCE_TOUCHSCREEN);
6313c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        }
6314c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
6315bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final int result = mInputManager.injectInputEvent(newEvent, pid, uid,
6316bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                sync ? InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISH
6317bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                        : InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT,
6318bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                INJECTION_TIMEOUT_MILLIS);
631946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
63202bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        Binder.restoreCallingIdentity(ident);
63217fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        return reportInjectionResult(result);
63229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
632306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
63249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
63259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Inject a trackball (navigation device) event into the UI.
6326bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * Even when sync is false, this method may block while waiting for current
6327bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * input events to be dispatched.
632806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     *
632906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     * @param ev A motion event describing the trackball action.  (As noted in
633006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     * {@link MotionEvent#obtain(long, long, int, float, float, int)}, be sure to use
63319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link SystemClock#uptimeMillis()} as the timebase.)
63329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sync If true, wait for the event to be completed before returning to the caller.
63339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if event was dispatched, false if it was dropped for any reason
63349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
63359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean injectTrackballEvent(MotionEvent ev, boolean sync) {
63362bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final int pid = Binder.getCallingPid();
63372bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final int uid = Binder.getCallingUid();
63382bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final long ident = Binder.clearCallingIdentity();
633946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
6340c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        MotionEvent newEvent = MotionEvent.obtain(ev);
6341c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        if ((newEvent.getSource() & InputDevice.SOURCE_CLASS_TRACKBALL) == 0) {
6342c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            newEvent.setSource(InputDevice.SOURCE_TRACKBALL);
6343c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        }
6344c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
6345bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final int result = mInputManager.injectInputEvent(newEvent, pid, uid,
6346bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                sync ? InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISH
6347bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                        : InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT,
6348bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                INJECTION_TIMEOUT_MILLIS);
6349bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown
6350bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        Binder.restoreCallingIdentity(ident);
6351bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        return reportInjectionResult(result);
6352bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown    }
6353bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown
6354bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown    /**
6355bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * Inject an input event into the UI without waiting for dispatch to commence.
6356bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * This variant is useful for fire-and-forget input event injection.  It does not
6357bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * block any longer than it takes to enqueue the input event.
6358bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     *
6359bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * @param ev An input event.  (Be sure to set the input source correctly.)
6360bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * @return Returns true if event was dispatched, false if it was dropped for any reason
6361bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     */
6362bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown    public boolean injectInputEventNoWait(InputEvent ev) {
6363bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final int pid = Binder.getCallingPid();
6364bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final int uid = Binder.getCallingUid();
6365bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final long ident = Binder.clearCallingIdentity();
6366bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown
6367bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final int result = mInputManager.injectInputEvent(ev, pid, uid,
6368bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                InputManager.INPUT_EVENT_INJECTION_SYNC_NONE,
6369bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                INJECTION_TIMEOUT_MILLIS);
637046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
63712bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        Binder.restoreCallingIdentity(ident);
63727fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        return reportInjectionResult(result);
63737fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    }
63747fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
63757fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    private boolean reportInjectionResult(int result) {
637600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        switch (result) {
637700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            case InputManager.INPUT_EVENT_INJECTION_PERMISSION_DENIED:
637800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                Slog.w(TAG, "Input event injection permission denied.");
637900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                throw new SecurityException(
638000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                        "Injecting to another application requires INJECT_EVENTS permission");
638100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            case InputManager.INPUT_EVENT_INJECTION_SUCCEEDED:
638209e85dc0270ac9ce660c17ee8290ff2d136b395bChristopher Tate                //Slog.v(TAG, "Input event injection succeeded.");
638300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                return true;
638400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            case InputManager.INPUT_EVENT_INJECTION_TIMED_OUT:
638500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                Slog.w(TAG, "Input event injection timed out.");
638600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                return false;
638700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            case InputManager.INPUT_EVENT_INJECTION_FAILED:
638800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            default:
638900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                Slog.w(TAG, "Input event injection failed.");
639000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                return false;
6391cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn        }
63929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
639306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
63941a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown    /**
63951a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown     * Temporarily set the pointer speed.  Does not save the new setting.
63961a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown     * Used by the settings application.
63971a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown     */
63981a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown    public void setPointerSpeed(int speed) {
63991a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown        if (!checkCallingPermission(android.Manifest.permission.SET_POINTER_SPEED,
64001a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown                "setPointerSpeed()")) {
64011a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown            throw new SecurityException("Requires SET_POINTER_SPEED permission");
64021a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown        }
64031a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown
64041a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown        mInputManager.setPointerSpeed(speed);
64051a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown    }
64061a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown
64079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowState getFocusedWindow() {
64089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
64099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getFocusedWindowLocked();
64109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
64119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
64129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
64139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowState getFocusedWindowLocked() {
64149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCurrentFocus;
64159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
641606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
64179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean detectSafeMode() {
6418b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown        if (!mInputMonitor.waitForInputDevicesReady(
6419b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown                INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS)) {
6420b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown            Slog.w(TAG, "Devices still not ready after waiting "
6421b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown                    + INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS
6422b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown                    + " milliseconds before attempting to detect safe mode.");
6423b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown        }
6424b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown
64259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSafeMode = mPolicy.detectSafeMode();
64269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSafeMode;
64279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
642806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6429661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn    public void displayReady() {
64305132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn        synchronized(mWindowMap) {
64315132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            if (mDisplay != null) {
64325132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn                throw new IllegalStateException("Display already initialized");
64335132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            }
64345132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
64355132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            mDisplay = wm.getDefaultDisplay();
64361fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn            synchronized(mDisplaySizeLock) {
64371fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                mInitialDisplayWidth = mDisplay.getRawWidth();
64381fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                mInitialDisplayHeight = mDisplay.getRawHeight();
64391fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                int rot = mDisplay.getRotation();
64401fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                if (rot == Surface.ROTATION_90 || rot == Surface.ROTATION_270) {
64411fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                    // If the screen is currently rotated, we need to swap the
64421fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                    // initial width and height to get the true natural values.
64431fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                    int tmp = mInitialDisplayWidth;
64441fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                    mInitialDisplayWidth = mInitialDisplayHeight;
64451fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                    mInitialDisplayHeight = tmp;
64461fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                }
64471fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                mBaseDisplayWidth = mCurDisplayWidth = mAppDisplayWidth = mInitialDisplayWidth;
64481fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn                mBaseDisplayHeight = mCurDisplayHeight = mAppDisplayHeight = mInitialDisplayHeight;
64491fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn            }
6450bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            mInputManager.setDisplaySize(Display.DEFAULT_DISPLAY,
6451bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                    mDisplay.getRawWidth(), mDisplay.getRawHeight(),
6452bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                    mDisplay.getRawExternalWidth(), mDisplay.getRawExternalHeight());
64539d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn            mPolicy.setInitialDisplaySize(mInitialDisplayWidth, mInitialDisplayHeight);
64545132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn        }
64555132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn
64565132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn        try {
64575132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            mActivityManager.updateConfiguration(null);
64585132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn        } catch (RemoteException e) {
64595132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn        }
6460661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn
6461571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        synchronized (mWindowMap) {
6462571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato            readForcedDisplaySizeLocked();
6463571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        }
64645132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn    }
64655132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn
6466661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn    public void systemReady() {
6467661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn        mPolicy.systemReady();
6468661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn    }
6469661cd52e0e1d527132eb1cae604d3e64da7ec0cbDianne Hackborn
64706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // This is an animation that does nothing: it just immediately finishes
64716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // itself every time it is called.  It is used as a stub animation in cases
64726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // where we want to synchronize multiple things that may be animating.
64736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    static final class DummyAnimation extends Animation {
64746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public boolean getTransformation(long currentTime, Transformation outTransformation) {
64756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return false;
64766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
64776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
64786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    static final Animation sDummyAnimation = new DummyAnimation();
64796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
64809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
64816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Async Handler
64829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
64839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
64846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final class H extends Handler {
64856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int REPORT_FOCUS_CHANGE = 2;
64866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int REPORT_LOSING_FOCUS = 3;
64876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int ANIMATE = 4;
64886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int ADD_STARTING = 5;
64896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int REMOVE_STARTING = 6;
64906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int FINISHED_STARTING = 7;
64916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int REPORT_APPLICATION_TOKEN_WINDOWS = 8;
64922c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        public static final int REPORT_APPLICATION_TOKEN_DRAWN = 9;
64936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int WINDOW_FREEZE_TIMEOUT = 11;
64946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int HOLD_SCREEN_CHANGED = 12;
64956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int APP_TRANSITION_TIMEOUT = 13;
64966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int PERSIST_ANIMATION_SCALE = 14;
64976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int FORCE_GC = 15;
64986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int ENABLE_SCREEN = 16;
64996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int APP_FREEZE_TIMEOUT = 17;
65006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int SEND_NEW_CONFIGURATION = 18;
65016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int REPORT_WINDOWS_CHANGE = 19;
65026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int DRAG_START_TIMEOUT = 20;
65036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int DRAG_END_TIMEOUT = 21;
65046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int REPORT_HARD_KEYBOARD_STATUS_CHANGE = 22;
650529aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn        public static final int BOOT_TIMEOUT = 23;
650638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn        public static final int WAITING_FOR_DRAWN_TIMEOUT = 24;
650706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
65089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Session mLastReportedHold;
650906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
65109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public H() {
65119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
651206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
65139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
65149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void handleMessage(Message msg) {
65159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (msg.what) {
65169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case REPORT_FOCUS_CHANGE: {
65179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowState lastFocus;
65189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowState newFocus;
651906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
65209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized(mWindowMap) {
65219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        lastFocus = mLastFocus;
65229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newFocus = mCurrentFocus;
65239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (lastFocus == newFocus) {
65249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Focus is not changing, so nothing to do.
65259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return;
65269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
65279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLastFocus = newFocus;
65288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        //Slog.i(TAG, "Focus moving from " + lastFocus
65299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        //        + " to " + newFocus);
65309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (newFocus != null && lastFocus != null
65319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                && !newFocus.isDisplayedLw()) {
65328a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            //Slog.i(TAG, "Delaying loss of focus...");
65339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLosingFocus.add(lastFocus);
65349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            lastFocus = null;
65359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
65369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
65379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
65389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (lastFocus != newFocus) {
65399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        //System.out.println("Changing focus from " + lastFocus
65409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        //                   + " to " + newFocus);
65419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (newFocus != null) {
65429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            try {
65438a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                //Slog.i(TAG, "Gaining focus: " + newFocus);
65449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                newFocus.mClient.windowFocusChanged(true, mInTouchMode);
65459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } catch (RemoteException e) {
65469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // Ignore if process has died.
65479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
65485e7833a571967d1dbc8618ac96ad6a379bcdf66aKonstantin Lopyrev                            notifyFocusChanged();
65499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
65509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
65519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (lastFocus != null) {
65529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            try {
65538a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                //Slog.i(TAG, "Losing focus: " + lastFocus);
65549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                lastFocus.mClient.windowFocusChanged(false, mInTouchMode);
65559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } catch (RemoteException e) {
65569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // Ignore if process has died.
65579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
65589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
65599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
65609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
65619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
65629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case REPORT_LOSING_FOCUS: {
65639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ArrayList<WindowState> losers;
656406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
65659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized(mWindowMap) {
65669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        losers = mLosingFocus;
65679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLosingFocus = new ArrayList<WindowState>();
65689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
65699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
65709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int N = losers.size();
65719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i=0; i<N; i++) {
65729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        try {
65738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            //Slog.i(TAG, "Losing delayed focus: " + losers.get(i));
65749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            losers.get(i).mClient.windowFocusChanged(false, mInTouchMode);
65759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } catch (RemoteException e) {
65769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                             // Ignore if process has died.
65779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
65789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
65799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
65809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
65819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case ANIMATE: {
65829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized(mWindowMap) {
65839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAnimationPending = false;
65849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        performLayoutAndPlaceSurfacesLocked();
65859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
65869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
65879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
65889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case ADD_STARTING: {
65899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final AppWindowToken wtoken = (AppWindowToken)msg.obj;
65909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final StartingData sd = wtoken.startingData;
65919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
65929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (sd == null) {
65939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Animation has been canceled... do nothing.
65949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return;
65959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
659606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
65978a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Add starting "
65989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + wtoken + ": pkg=" + sd.pkg);
659906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
66009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    View view = null;
66019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
66029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        view = mPolicy.addStartingWindow(
66032f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                            wtoken.token, sd.pkg, sd.theme, sd.compatInfo,
66042f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                            sd.nonLocalizedLabel, sd.labelRes, sd.icon, sd.windowFlags);
66059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (Exception e) {
66068a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "Exception when adding starting window", e);
66079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
66089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
66099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (view != null) {
66109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        boolean abort = false;
66119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
66129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        synchronized(mWindowMap) {
66139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (wtoken.removed || wtoken.startingData == null) {
66149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // If the window was successfully added, then
66159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // we need to remove it.
66169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (wtoken.startingWindow != null) {
66178a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                    if (DEBUG_STARTING_WINDOW) Slog.v(TAG,
66189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            "Aborted starting " + wtoken
66199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + ": removed=" + wtoken.removed
66209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " startingData=" + wtoken.startingData);
66219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    wtoken.startingWindow = null;
66229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    wtoken.startingData = null;
66239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    abort = true;
66249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
66259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } else {
66269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                wtoken.startingView = view;
66279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
66288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_STARTING_WINDOW && !abort) Slog.v(TAG,
66299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Added starting " + wtoken
66309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + ": startingWindow="
66319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + wtoken.startingWindow + " startingView="
66329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + wtoken.startingView);
66339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
66349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
66359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (abort) {
66369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            try {
66379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                mPolicy.removeStartingWindow(wtoken.token, view);
66389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } catch (Exception e) {
66398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.w(TAG, "Exception when removing starting window", e);
66409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
66419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
66429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
66439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
66449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
66459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case REMOVE_STARTING: {
66469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final AppWindowToken wtoken = (AppWindowToken)msg.obj;
66479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    IBinder token = null;
66489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    View view = null;
66499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (mWindowMap) {
66508a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Remove starting "
66519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + wtoken + ": startingWindow="
66529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + wtoken.startingWindow + " startingView="
66539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + wtoken.startingView);
66549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (wtoken.startingWindow != null) {
66559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            view = wtoken.startingView;
66569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            token = wtoken.token;
66579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.startingData = null;
66589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.startingView = null;
66599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.startingWindow = null;
66609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
66619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
66629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (view != null) {
66639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        try {
66649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mPolicy.removeStartingWindow(token, view);
66659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } catch (Exception e) {
66668a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            Slog.w(TAG, "Exception when removing starting window", e);
66679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
66689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
66699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
66709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
66719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case FINISHED_STARTING: {
66729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    IBinder token = null;
66739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    View view = null;
66749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    while (true) {
66759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        synchronized (mWindowMap) {
66769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            final int N = mFinishedStarting.size();
66779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (N <= 0) {
66789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                break;
66799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
66809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AppWindowToken wtoken = mFinishedStarting.remove(N-1);
66819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
66828a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_STARTING_WINDOW) Slog.v(TAG,
66839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Finished starting " + wtoken
66849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + ": startingWindow=" + wtoken.startingWindow
66859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + " startingView=" + wtoken.startingView);
66869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
66879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (wtoken.startingWindow == null) {
66889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                continue;
66899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
66909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
66919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            view = wtoken.startingView;
66929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            token = wtoken.token;
66939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.startingData = null;
66949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.startingView = null;
66959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.startingWindow = null;
66969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
66979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
66989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        try {
66999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mPolicy.removeStartingWindow(token, view);
67009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } catch (Exception e) {
67018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            Slog.w(TAG, "Exception when removing starting window", e);
67029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
67039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
67049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
67059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67062c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                case REPORT_APPLICATION_TOKEN_DRAWN: {
67072c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                    final AppWindowToken wtoken = (AppWindowToken)msg.obj;
67082c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn
67092c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                    try {
67102c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                        if (DEBUG_VISIBILITY) Slog.v(
67112c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                                TAG, "Reporting drawn in " + wtoken);
67122c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                        wtoken.appToken.windowsDrawn();
67132c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                    } catch (RemoteException ex) {
67142c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                    }
67152c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                } break;
67162c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn
67179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case REPORT_APPLICATION_TOKEN_WINDOWS: {
67189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final AppWindowToken wtoken = (AppWindowToken)msg.obj;
67199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean nowVisible = msg.arg1 != 0;
67219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean nowGone = msg.arg2 != 0;
67229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
67248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_VISIBILITY) Slog.v(
67259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                TAG, "Reporting visible in " + wtoken
67269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " visible=" + nowVisible
67279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " gone=" + nowGone);
67289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (nowVisible) {
67299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.appToken.windowsVisible();
67309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
67319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.appToken.windowsGone();
67329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
67339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (RemoteException ex) {
67349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
67359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
673606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
67379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WINDOW_FREEZE_TIMEOUT: {
67389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (mWindowMap) {
67398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "Window freeze timeout expired.");
67409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int i = mWindows.size();
67419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        while (i > 0) {
67429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            i--;
6743e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                            WindowState w = mWindows.get(i);
67449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (w.mOrientationChanging) {
67459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mOrientationChanging = false;
67468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.w(TAG, "Force clearing orientation change: " + w);
67479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
67489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
67499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        performLayoutAndPlaceSurfacesLocked();
67509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
67519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
67529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
675306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
67549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case HOLD_SCREEN_CHANGED: {
67559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Session oldHold;
67569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Session newHold;
67579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (mWindowMap) {
67589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        oldHold = mLastReportedHold;
67599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newHold = (Session)msg.obj;
67609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLastReportedHold = newHold;
67619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
676206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
67639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (oldHold != newHold) {
67649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        try {
67659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (oldHold != null) {
67669adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                                mBatteryStats.noteStopWakelock(oldHold.mUid, -1,
67679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "window",
67689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        BatteryStats.WAKE_TYPE_WINDOW);
67699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
67709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (newHold != null) {
67719adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                                mBatteryStats.noteStartWakelock(newHold.mUid, -1,
67729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "window",
67739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        BatteryStats.WAKE_TYPE_WINDOW);
67749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
67759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } catch (RemoteException e) {
67769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
67779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
67789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
67799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
678006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
67819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case APP_TRANSITION_TIMEOUT: {
67829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (mWindowMap) {
6783bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                        if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
67848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
67859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "*** APP TRANSITION TIMEOUT");
67869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mAppTransitionReady = true;
67879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mAppTransitionTimeout = true;
67889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            performLayoutAndPlaceSurfacesLocked();
67899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
67909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
67919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
67929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
679306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
67949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case PERSIST_ANIMATION_SCALE: {
67959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.System.putFloat(mContext.getContentResolver(),
67969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Settings.System.WINDOW_ANIMATION_SCALE, mWindowAnimationScale);
67979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.System.putFloat(mContext.getContentResolver(),
67989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Settings.System.TRANSITION_ANIMATION_SCALE, mTransitionAnimationScale);
67999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
68009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
680106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
68029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case FORCE_GC: {
68039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized(mWindowMap) {
68049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mAnimationPending) {
68059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // If we are animating, don't do the gc now but
68069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // delay a bit so we don't interrupt the animation.
68079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mH.sendMessageDelayed(mH.obtainMessage(H.FORCE_GC),
68089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    2000);
68099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return;
68109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
68119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // If we are currently rotating the display, it will
68129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // schedule a new message when done.
68139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mDisplayFrozen) {
68149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return;
68159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
68169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
68179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Runtime.getRuntime().gc();
68189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
68199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
682006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
68219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case ENABLE_SCREEN: {
68229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    performEnableScreen();
68239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
68249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
682506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
68269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case APP_FREEZE_TIMEOUT: {
68279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (mWindowMap) {
68288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "App freeze timeout expired.");
68299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int i = mAppTokens.size();
68309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        while (i > 0) {
68319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            i--;
68329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AppWindowToken tok = mAppTokens.get(i);
68339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (tok.freezingScreen) {
68348a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.w(TAG, "Force clearing freeze: " + tok);
68359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                unsetAppFreezingScreenLocked(tok, true, true);
68369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
68379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
68389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
68399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
68409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
684106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6842e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                case SEND_NEW_CONFIGURATION: {
6843e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    removeMessages(SEND_NEW_CONFIGURATION);
6844e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    sendNewConfiguration();
6845c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                    break;
6846c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                }
684706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
68486e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev                case REPORT_WINDOWS_CHANGE: {
6849dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                    if (mWindowsChanged) {
6850dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                        synchronized (mWindowMap) {
6851dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                            mWindowsChanged = false;
6852dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                        }
6853dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                        notifyWindowsChanged();
6854dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                    }
6855dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                    break;
6856dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                }
6857dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev
6858a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                case DRAG_START_TIMEOUT: {
6859a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    IBinder win = (IBinder)msg.obj;
6860a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    if (DEBUG_DRAG) {
6861a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        Slog.w(TAG, "Timeout starting drag by win " + win);
6862a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
6863a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    synchronized (mWindowMap) {
6864a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        // !!! TODO: ANR the app that has failed to start the drag in time
6865a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (mDragState != null) {
6866d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                            mDragState.unregister();
68672e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                            mInputMonitor.updateInputWindowsLw(true /*force*/);
6868a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                            mDragState.reset();
6869a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                            mDragState = null;
6870a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        }
6871a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
6872d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    break;
6873a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                }
6874a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
6875d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                case DRAG_END_TIMEOUT: {
6876d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    IBinder win = (IBinder)msg.obj;
6877d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    if (DEBUG_DRAG) {
6878d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        Slog.w(TAG, "Timeout ending drag to win " + win);
6879d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    }
6880d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    synchronized (mWindowMap) {
6881d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        // !!! TODO: ANR the drag-receiving app
6882d9be36c897680361da2daadba9bbc9da3c16329bChristopher Tate                        if (mDragState != null) {
6883d9be36c897680361da2daadba9bbc9da3c16329bChristopher Tate                            mDragState.mDragResult = false;
6884d9be36c897680361da2daadba9bbc9da3c16329bChristopher Tate                            mDragState.endDragLw();
6885d9be36c897680361da2daadba9bbc9da3c16329bChristopher Tate                        }
6886d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    }
6887d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    break;
6888d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                }
68892992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
68902992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                case REPORT_HARD_KEYBOARD_STATUS_CHANGE: {
68912992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                    notifyHardKeyboardStatusChange();
68922992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                    break;
68932992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                }
689438e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn
689538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                case BOOT_TIMEOUT: {
689638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                    performBootTimeout();
689738e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                    break;
689838e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                }
689938e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn
690038e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                case WAITING_FOR_DRAWN_TIMEOUT: {
690138e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                    Pair<WindowState, IRemoteCallback> pair;
690238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                    synchronized (mWindowMap) {
690338e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                        pair = (Pair<WindowState, IRemoteCallback>)msg.obj;
690438e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                        Slog.w(TAG, "Timeout waiting for drawn: " + pair.first);
690538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                        if (!mWaitingForDrawn.remove(pair)) {
690638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                            return;
690738e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                        }
690838e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                    }
690938e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                    try {
691038e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                        pair.second.sendResult(null);
691138e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                    } catch (RemoteException e) {
691238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                    }
691338e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                    break;
691438e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                }
69159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
69169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
69179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
69189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
69209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // IWindowManager API
69219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
69229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public IWindowSession openSession(IInputMethodClient client,
69249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IInputContext inputContext) {
69259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (client == null) throw new IllegalArgumentException("null client");
69269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (inputContext == null) throw new IllegalArgumentException("null inputContext");
69276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        Session session = new Session(this, client, inputContext);
692846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        return session;
69299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
69309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean inputMethodClientHasFocus(IInputMethodClient client) {
69329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
69339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // The focus for the client is the window immediately below
69349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // where we would place the input method window.
69359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int idx = findDesiredInputMethodWindowIndexLocked(false);
69369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowState imFocus;
69379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (idx > 0) {
6938e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                imFocus = mWindows.get(idx-1);
6939e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                //Log.i(TAG, "Desired input method target: " + imFocus);
6940e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                //Log.i(TAG, "Current focus: " + this.mCurrentFocus);
6941e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                //Log.i(TAG, "Last focus: " + this.mLastFocus);
69429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (imFocus != null) {
6943e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // This may be a starting window, in which case we still want
6944e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // to count it as okay.
6945e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    if (imFocus.mAttrs.type == LayoutParams.TYPE_APPLICATION_STARTING
6946e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            && imFocus.mAppToken != null) {
6947e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        // The client has definitely started, so it really should
6948e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        // have a window in this app token.  Let's look for it.
6949e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        for (int i=0; i<imFocus.mAppToken.windows.size(); i++) {
6950e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            WindowState w = imFocus.mAppToken.windows.get(i);
6951e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            if (w != imFocus) {
6952e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                                //Log.i(TAG, "Switching to real app window: " + w);
6953e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                                imFocus = w;
6954e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                                break;
6955e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            }
6956e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        }
6957e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    }
6958e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    //Log.i(TAG, "IM target client: " + imFocus.mSession.mClient);
6959e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    //if (imFocus.mSession.mClient != null) {
6960e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    //    Log.i(TAG, "IM target client binder: " + imFocus.mSession.mClient.asBinder());
6961e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    //    Log.i(TAG, "Requesting client binder: " + client.asBinder());
6962e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    //}
69639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (imFocus.mSession.mClient != null &&
69649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            imFocus.mSession.mClient.asBinder() == client.asBinder()) {
69659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return true;
69669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6967e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn
6968e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // Okay, how about this...  what is the current focus?
6969e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // It seems in some cases we may not have moved the IM
6970e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // target window, such as when it was in a pop-up window,
6971e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // so let's also look at the current focus.  (An example:
6972e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // go to Gmail, start searching so the keyboard goes up,
6973e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // press home.  Sometimes the IME won't go down.)
6974e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // Would be nice to fix this more correctly, but it's
6975e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // way at the end of a release, and this should be good enough.
6976e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    if (mCurrentFocus != null && mCurrentFocus.mSession.mClient != null &&
6977e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            mCurrentFocus.mSession.mClient.asBinder() == client.asBinder()) {
6978e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        return true;
6979e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    }
69809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
69819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
69829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
69839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
69849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
698506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
698644bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn    public void getDisplaySize(Point size) {
69871fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn        synchronized(mDisplaySizeLock) {
698881e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn            size.x = mAppDisplayWidth;
698981e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn            size.y = mAppDisplayHeight;
699044bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        }
699144bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn    }
699244bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn
6993bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    public void getRealDisplaySize(Point size) {
69941fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn        synchronized(mDisplaySizeLock) {
6995bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            size.x = mCurDisplayWidth;
6996bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown            size.y = mCurDisplayHeight;
6997bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        }
69987d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    }
69997d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
70007d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    public void getInitialDisplaySize(Point size) {
70011fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn        synchronized(mDisplaySizeLock) {
70027d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            size.x = mInitialDisplayWidth;
70037d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            size.y = mInitialDisplayHeight;
70047d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        }
7005bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown    }
7006bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown
700744bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn    public int getMaximumSizeDimension() {
70081fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn        synchronized(mDisplaySizeLock) {
700944bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn            // Do this based on the raw screen size, until we are smarter.
70107916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            return mBaseDisplayWidth > mBaseDisplayHeight
70117916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    ? mBaseDisplayWidth : mBaseDisplayHeight;
70127916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
70137916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    }
70147916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
70157916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    public void setForcedDisplaySize(int longDimen, int shortDimen) {
70167916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        synchronized(mWindowMap) {
70177916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            int width, height;
70187916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (mInitialDisplayWidth < mInitialDisplayHeight) {
70197916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                width = shortDimen < mInitialDisplayWidth
70207916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        ? shortDimen : mInitialDisplayWidth;
70217916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                height = longDimen < mInitialDisplayHeight
70227916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        ? longDimen : mInitialDisplayHeight;
70237916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            } else {
70247916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                width = longDimen < mInitialDisplayWidth
70257916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        ? longDimen : mInitialDisplayWidth;
70267916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                height = shortDimen < mInitialDisplayHeight
70277916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        ? shortDimen : mInitialDisplayHeight;
70287916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
70297916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            setForcedDisplaySizeLocked(width, height);
7030571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato            Settings.Secure.putString(mContext.getContentResolver(),
7031571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato                    Settings.Secure.DISPLAY_SIZE_FORCED, width + "," + height);
70327916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
70337916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    }
70347916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
70357916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    private void rebuildBlackFrame(boolean inTransaction) {
70367916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        if (!inTransaction) {
703736991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn            if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
70387916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    ">>> OPEN TRANSACTION rebuildBlackFrame");
70397916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            Surface.openTransaction();
70407916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
70417916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        try {
70427916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (mBlackFrame != null) {
70437916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                mBlackFrame.kill();
70447916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                mBlackFrame = null;
70457916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
70467916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (mBaseDisplayWidth < mInitialDisplayWidth
70477916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    || mBaseDisplayHeight < mInitialDisplayHeight) {
70488f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                int initW, initH, baseW, baseH;
70498f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                final boolean rotated = (mRotation == Surface.ROTATION_90
70508f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                        || mRotation == Surface.ROTATION_270);
70518f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                if (rotated) {
70528f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                    initW = mInitialDisplayHeight;
70538f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                    initH = mInitialDisplayWidth;
70548f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                    baseW = mBaseDisplayHeight;
70558f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                    baseH = mBaseDisplayWidth;
70568f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                } else {
70578f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                    initW = mInitialDisplayWidth;
70588f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                    initH = mInitialDisplayHeight;
70598f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                    baseW = mBaseDisplayWidth;
70608f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                    baseH = mBaseDisplayHeight;
70618f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                }
70628f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                Rect outer = new Rect(0, 0, initW, initH);
70638f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                Rect inner = new Rect(0, 0, baseW, baseH);
70647916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                try {
70657916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    mBlackFrame = new BlackFrame(mFxSession, outer, inner, MASK_LAYER);
70667916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                } catch (Surface.OutOfResourcesException e) {
70677916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                }
70687916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
70697916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        } finally {
70707916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (!inTransaction) {
70717916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                Surface.closeTransaction();
707236991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn                if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
70737916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        "<<< CLOSE TRANSACTION rebuildBlackFrame");
70747916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
70757916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
70767916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    }
70777916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
7078571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato    private void readForcedDisplaySizeLocked() {
7079571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        final String str = Settings.Secure.getString(mContext.getContentResolver(),
7080571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato                Settings.Secure.DISPLAY_SIZE_FORCED);
7081571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        if (str == null || str.length() == 0) {
7082571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato            return;
7083571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        }
7084571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        final int pos = str.indexOf(',');
7085571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        if (pos <= 0 || str.lastIndexOf(',') != pos) {
7086571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato            return;
7087571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        }
7088571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        int width, height;
7089571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        try {
7090571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato            width = Integer.parseInt(str.substring(0, pos));
7091571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato            height = Integer.parseInt(str.substring(pos+1));
7092571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        } catch (NumberFormatException ex) {
7093571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato            return;
7094571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        }
7095571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        setForcedDisplaySizeLocked(width, height);
7096571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato    }
7097571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato
70987916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    private void setForcedDisplaySizeLocked(int width, int height) {
7099571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        Slog.i(TAG, "Using new display size: " + width + "x" + height);
7100571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato
71011fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn        synchronized(mDisplaySizeLock) {
71021fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn            mBaseDisplayWidth = width;
71031fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn            mBaseDisplayHeight = height;
71041fbee79eb31011fa260d9fe088c165cc9171d98bDianne Hackborn        }
71057916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        mPolicy.setInitialDisplaySize(mBaseDisplayWidth, mBaseDisplayHeight);
71067916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
71077916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        mLayoutNeeded = true;
71087916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
71097916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        boolean configChanged = updateOrientationFromAppTokensLocked(false);
71107916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        mTempConfiguration.setToDefaults();
71117916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        mTempConfiguration.fontScale = mCurConfiguration.fontScale;
71127916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        if (computeNewConfigurationLocked(mTempConfiguration)) {
71137916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (mCurConfiguration.diff(mTempConfiguration) != 0) {
71147916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                configChanged = true;
71157916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
71167916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
71177916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
71187916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        if (configChanged) {
71197916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            mWaitingForConfig = true;
71207916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            startFreezingDisplayLocked(false);
71217916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
71227916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
71237916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
71247916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        rebuildBlackFrame(false);
71257916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
71267916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        performLayoutAndPlaceSurfacesLocked();
71277916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    }
71287916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
71297916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    public void clearForcedDisplaySize() {
71307916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        synchronized(mWindowMap) {
71317916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            setForcedDisplaySizeLocked(mInitialDisplayWidth, mInitialDisplayHeight);
7132571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato            Settings.Secure.putString(mContext.getContentResolver(),
7133571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato                    Settings.Secure.DISPLAY_SIZE_FORCED, "");
713444bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        }
713544bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn    }
713644bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn
713781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn    public boolean canStatusBarHide() {
713881e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        return mPolicy.canStatusBarHide();
713981e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn    }
714081e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn
71419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
71429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Internals
71439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
71449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7145e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    final WindowState windowForClientLocked(Session session, IWindow client,
7146e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            boolean throwOnError) {
7147e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        return windowForClientLocked(session, client.asBinder(), throwOnError);
71489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
714906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7150e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    final WindowState windowForClientLocked(Session session, IBinder client,
7151e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            boolean throwOnError) {
71529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState win = mWindowMap.get(client);
71538a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (localLOGV) Slog.v(
71549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Looking up client " + client + ": " + win);
71559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (win == null) {
7156e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            RuntimeException ex = new IllegalArgumentException(
7157e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    "Requested window " + client + " does not exist");
7158e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            if (throwOnError) {
7159e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                throw ex;
7160e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
71618a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Failed looking up window", ex);
71629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
71639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
71649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (session != null && win.mSession != session) {
7165e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            RuntimeException ex = new IllegalArgumentException(
7166e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    "Requested window " + client + " is in session " +
7167e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    win.mSession + ", not " + session);
7168e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            if (throwOnError) {
7169e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                throw ex;
7170e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
71718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Failed looking up window", ex);
71729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
71739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
71749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
71759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return win;
71769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
71779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7178a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    final void rebuildAppWindowListLocked() {
7179a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        int NW = mWindows.size();
7180a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        int i;
71813b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        int lastWallpaper = -1;
71829bfb707597898f54722460b48588007b682f3e2aDianne Hackborn        int numRemoved = 0;
7183ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7184f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        if (mRebuildTmp.length < NW) {
7185f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            mRebuildTmp = new WindowState[NW+10];
7186f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        }
7187f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn
7188a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        // First remove all existing app windows.
7189a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        i=0;
7190a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        while (i < NW) {
7191e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState w = mWindows.get(i);
71923b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if (w.mAppToken != null) {
7193e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState win = mWindows.remove(i);
7194f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                win.mRebuilding = true;
7195f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                mRebuildTmp[numRemoved] = win;
7196dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                mWindowsChanged = true;
71978a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG,
7198bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                        "Rebuild removing window: " + win);
7199a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                NW--;
72009bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                numRemoved++;
7201a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                continue;
72023b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            } else if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_WALLPAPER
72033b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    && lastWallpaper == i-1) {
72043b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                lastWallpaper = i;
7205a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
7206a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            i++;
7207a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        }
7208ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
72093b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        // The wallpaper window(s) typically live at the bottom of the stack,
72103b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        // so skip them before adding app tokens.
72113b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        lastWallpaper++;
72123b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        i = lastWallpaper;
7213ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7214bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        // First add all of the exiting app tokens...  these are no longer
7215bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        // in the main app list, but still have windows shown.  We put them
7216bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        // in the back because now that the animation is over we no longer
7217bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        // will care about them.
7218bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        int NT = mExitingAppTokens.size();
7219a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        for (int j=0; j<NT; j++) {
7220bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn            i = reAddAppWindowsLocked(i, mExitingAppTokens.get(j));
7221bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        }
7222ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7223bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        // And add in the still active app tokens in Z order.
7224bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        NT = mAppTokens.size();
7225bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        for (int j=0; j<NT; j++) {
7226bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn            i = reAddAppWindowsLocked(i, mAppTokens.get(j));
7227a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        }
7228ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
72293b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        i -= lastWallpaper;
72309bfb707597898f54722460b48588007b682f3e2aDianne Hackborn        if (i != numRemoved) {
72318a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Rebuild removed " + numRemoved
72329bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    + " windows but added " + i);
7233f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            for (i=0; i<numRemoved; i++) {
7234f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                WindowState ws = mRebuildTmp[i];
7235f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (ws.mRebuilding) {
7236f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    StringWriter sw = new StringWriter();
7237f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    PrintWriter pw = new PrintWriter(sw);
7238a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    ws.dump(pw, "", true);
7239f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    pw.flush();
7240f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    Slog.w(TAG, "This window was lost: " + ws);
7241f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    Slog.w(TAG, sw.toString());
7242f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                }
7243f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            }
7244f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            Slog.w(TAG, "Current app token list:");
7245f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            dumpAppTokensLocked();
7246f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            Slog.w(TAG, "Final window list:");
7247f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            dumpWindowsLocked();
72489bfb707597898f54722460b48588007b682f3e2aDianne Hackborn        }
7249a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    }
7250ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
72519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void assignLayersLocked() {
72529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int N = mWindows.size();
72539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int curBaseLayer = 0;
72549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int curLayer = 0;
72559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i;
725606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
72576c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn        if (DEBUG_LAYERS) {
72586c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            RuntimeException here = new RuntimeException("here");
72596c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            here.fillInStackTrace();
72603ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn            Slog.v(TAG, "Assigning layers", here);
72616c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn        }
72626c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn
72639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=0; i<N; i++) {
7264e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState w = mWindows.get(i);
72657341d7a104b47996445d069a695e155a07184606Dianne Hackborn            if (w.mBaseLayer == curBaseLayer || w.mIsImWindow
72667341d7a104b47996445d069a695e155a07184606Dianne Hackborn                    || (i > 0 && w.mIsWallpaper)) {
72679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                curLayer += WINDOW_LAYER_MULTIPLIER;
72689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mLayer = curLayer;
72699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
72709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                curBaseLayer = curLayer = w.mBaseLayer;
72719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mLayer = curLayer;
72729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
72739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (w.mTargetAppToken != null) {
72749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mAnimLayer = w.mLayer + w.mTargetAppToken.animLayerAdjustment;
72759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (w.mAppToken != null) {
72769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mAnimLayer = w.mLayer + w.mAppToken.animLayerAdjustment;
72779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
72789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mAnimLayer = w.mLayer;
72799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
72809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (w.mIsImWindow) {
72819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mAnimLayer += mInputMethodAnimLayerAdjustment;
7282759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            } else if (w.mIsWallpaper) {
7283759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                w.mAnimLayer += mWallpaperAnimLayerAdjustment;
72849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
72858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_LAYERS) Slog.v(TAG, "Assign layer " + w + ": "
72869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + w.mAnimLayer);
72879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //System.out.println(
72889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //    "Assigned layer " + curLayer + " to " + w.mClient.asBinder());
72899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
72909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
72919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
72929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mInLayout = false;
72939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void performLayoutAndPlaceSurfacesLocked() {
72949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mInLayout) {
7295cfe6524071624b6679e5fa4db847328e8d0317c8Dave Bort            if (DEBUG) {
72969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Recursive call!");
72979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
72988a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "performLayoutAndPlaceSurfacesLocked called while in layout");
72999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
73009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
73019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7302e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        if (mWaitingForConfig) {
7303e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // Our configuration has changed (most likely rotation), but we
7304e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // don't yet have the complete configuration to report to
7305e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // applications.  Don't do any window layout until we have it.
7306e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            return;
7307e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        }
7308e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
7309ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        if (mDisplay == null) {
7310ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            // Not yet initialized, nothing to do.
7311ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            return;
7312ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
7313ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
73142e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn        mInLayout = true;
73159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean recoveringMemory = false;
73162e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn
73172e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn        try {
73182e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn            if (mForceRemoves != null) {
73192e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                recoveringMemory = true;
7320f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                // Wait a little bit for things to settle down, and off we go.
73212e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                for (int i=0; i<mForceRemoves.size(); i++) {
73222e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                    WindowState ws = mForceRemoves.get(i);
73232e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                    Slog.i(TAG, "Force removing: " + ws);
73242e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                    removeWindowInnerLocked(ws.mSession, ws);
73252e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                }
73262e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                mForceRemoves = null;
73272e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                Slog.w(TAG, "Due to memory failure, waiting a bit for next layout");
73282e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                Object tmp = new Object();
73292e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                synchronized (tmp) {
73302e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                    try {
73312e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                        tmp.wait(250);
73322e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                    } catch (InterruptedException e) {
73332e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                    }
73349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
73359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
73362e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn        } catch (RuntimeException e) {
73378962028b6e2f4176e6ceded281e584d223e44982Dianne Hackborn            Log.wtf(TAG, "Unhandled exception while force removing for memory", e);
73389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
73392e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn
73409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
73419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            performLayoutAndPlaceSurfacesLockedInner(recoveringMemory);
734206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7343f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            int N = mPendingRemove.size();
7344f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            if (N > 0) {
7345f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (mPendingRemoveTmp.length < N) {
7346f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    mPendingRemoveTmp = new WindowState[N+10];
73479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7348f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                mPendingRemove.toArray(mPendingRemoveTmp);
73499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPendingRemove.clear();
7350f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                for (int i=0; i<N; i++) {
7351f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    WindowState w = mPendingRemoveTmp[i];
7352f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    removeWindowInnerLocked(w.mSession, w);
7353f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                }
73549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInLayout = false;
73569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                assignLayersLocked();
73579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutNeeded = true;
73589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                performLayoutAndPlaceSurfacesLocked();
73599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
73619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInLayout = false;
73629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mLayoutNeeded) {
73639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    requestAnimationLocked(0);
73649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
73659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7366dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            if (mWindowsChanged && !mWindowChangeListeners.isEmpty()) {
73676e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev                mH.removeMessages(H.REPORT_WINDOWS_CHANGE);
73686e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev                mH.sendMessage(mH.obtainMessage(H.REPORT_WINDOWS_CHANGE));
7369dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            }
73709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
73719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInLayout = false;
73728962028b6e2f4176e6ceded281e584d223e44982Dianne Hackborn            Log.wtf(TAG, "Unhandled exception while laying out windows", e);
73739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
73749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
73759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73763a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown    private final int performLayoutLockedInner(boolean initial, boolean updateInputWindows) {
7377b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        if (!mLayoutNeeded) {
7378b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            return 0;
7379b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        }
7380b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
7381b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        mLayoutNeeded = false;
7382b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
738344bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        final int dw = mCurDisplayWidth;
738444bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn        final int dh = mCurDisplayHeight;
73859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7386df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn        final int NFW = mFakeWindows.size();
7387df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn        for (int i=0; i<NFW; i++) {
7388df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            mFakeWindows.get(i).layout(dw, dh);
7389df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn        }
7390df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn
73919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = mWindows.size();
73929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i;
73939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73948a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_LAYOUT) Slog.v(TAG, "performLayout: needed="
73959b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn                + mLayoutNeeded + " dw=" + dw + " dh=" + dh);
73969b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn
73971f903c3b577d20f7db7e3d5875cafe577d0d845fDianne Hackborn        mPolicy.beginLayoutLw(dw, dh, mRotation);
739806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7399b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        int seq = mLayoutSeq+1;
7400b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        if (seq < 0) seq = 0;
7401b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        mLayoutSeq = seq;
7402b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
7403b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        // First perform layout of any root windows (not attached
7404b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        // to another window).
7405b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        int topAttached = -1;
7406b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        for (i = N-1; i >= 0; i--) {
7407e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState win = mWindows.get(i);
7408b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
7409b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // Don't do layout of a window if it is not visible, or
7410b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // soon won't be visible, to avoid wasting time and funky
7411b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // changes while a window is animating away.
7412b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            final AppWindowToken atoken = win.mAppToken;
7413b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            final boolean gone = win.mViewVisibility == View.GONE
7414b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    || !win.mRelayoutCalled
7415ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn                    || (atoken == null && win.mRootToken.hidden)
7416b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    || (atoken != null && atoken.hiddenRequested)
7417b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    || win.mAttachedHidden
7418b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    || win.mExiting || win.mDestroying;
7419b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
74201c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn            if (DEBUG_LAYOUT && !win.mLayoutAttached) {
74211c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                Slog.v(TAG, "First pass " + win
7422b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + ": gone=" + gone + " mHaveFrame=" + win.mHaveFrame
7423b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + " mLayoutAttached=" + win.mLayoutAttached);
74241c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                if (gone) Slog.v(TAG, "  (mViewVisibility="
7425b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + win.mViewVisibility + " mRelayoutCalled="
7426b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + win.mRelayoutCalled + " hidden="
7427b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + win.mRootToken.hidden + " hiddenRequested="
7428b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + (atoken != null && atoken.hiddenRequested)
7429b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + " mAttachedHidden=" + win.mAttachedHidden);
7430b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            }
7431e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
7432b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // If this view is GONE, then skip it -- keep the current
7433b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // frame, and let the caller know so they can ignore it
7434b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // if they want.  (We do the normal layout for INVISIBLE
7435b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // windows, since that means "perform layout as normal,
7436b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // just don't display").
7437b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            if (!gone || !win.mHaveFrame) {
7438e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                if (!win.mLayoutAttached) {
74398e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                    if (initial) {
74400f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                        //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial");
74418e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        win.mContentChanged = false;
74428e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                    }
7443e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                    win.prelayout();
7444b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    mPolicy.layoutWindowLw(win, win.mAttrs, null);
7445b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    win.mLayoutSeq = seq;
7446b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (DEBUG_LAYOUT) Slog.v(TAG, "-> mFrame="
7447b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + win.mFrame + " mContainingFrame="
7448b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + win.mContainingFrame + " mDisplayFrame="
7449b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + win.mDisplayFrame);
7450b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                } else {
7451b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (topAttached < 0) topAttached = i;
74529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
74539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7454b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        }
745506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7456b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        // Now perform layout of attached windows, which usually
7457b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        // depend on the position of the window they are attached to.
7458b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        // XXX does not deal with windows that are attached to windows
7459b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        // that are themselves attached.
7460b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        for (i = topAttached; i >= 0; i--) {
7461e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState win = mWindows.get(i);
74629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7463b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            if (win.mLayoutAttached) {
7464b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (DEBUG_LAYOUT) Slog.v(TAG, "Second pass " + win
7465b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + " mHaveFrame=" + win.mHaveFrame
7466b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + " mViewVisibility=" + win.mViewVisibility
7467b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + " mRelayoutCalled=" + win.mRelayoutCalled);
74681c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                // If this view is GONE, then skip it -- keep the current
74691c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                // frame, and let the caller know so they can ignore it
74701c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                // if they want.  (We do the normal layout for INVISIBLE
74711c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                // windows, since that means "perform layout as normal,
74721c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                // just don't display").
7473b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if ((win.mViewVisibility != View.GONE && win.mRelayoutCalled)
7474b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        || !win.mHaveFrame) {
74758e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                    if (initial) {
74760f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                        //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial");
74778e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        win.mContentChanged = false;
74788e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                    }
7479e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                    win.prelayout();
7480b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    mPolicy.layoutWindowLw(win, win.mAttrs, win.mAttachedWindow);
7481b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    win.mLayoutSeq = seq;
7482b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (DEBUG_LAYOUT) Slog.v(TAG, "-> mFrame="
7483b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + win.mFrame + " mContainingFrame="
7484b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + win.mContainingFrame + " mDisplayFrame="
7485b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + win.mDisplayFrame);
74869bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                }
7487958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            }
74889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7489349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
7490349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // Window frames may have changed.  Tell the input dispatcher about it.
74913a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        mInputMonitor.setUpdateInputWindowsNeededLw();
74923a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        if (updateInputWindows) {
74932e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown            mInputMonitor.updateInputWindowsLw(false /*force*/);
74943a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        }
7495b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
7496b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        return mPolicy.finishLayoutLw();
74979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
749806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
74993ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn    void makeWindowFreezingScreenIfNeededLocked(WindowState w) {
75003ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn        // If the screen is currently frozen or off, then keep
75013ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn        // it frozen/off until this window draws at its new
75023ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn        // orientation.
75033ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn        if (mDisplayFrozen || !mPolicy.isScreenOnFully()) {
75043ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn            if (DEBUG_ORIENTATION) Slog.v(TAG,
75053ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn                    "Changing surface while display frozen: " + w);
75063ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn            w.mOrientationChanging = true;
75073ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn            if (!mWindowsFreezingScreen) {
75083ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn                mWindowsFreezingScreen = true;
75093ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn                // XXX should probably keep timeout from
75103ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn                // when we first froze the display.
75113ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn                mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT);
75123ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn                mH.sendMessageDelayed(mH.obtainMessage(
75133ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn                        H.WINDOW_FREEZE_TIMEOUT), 2000);
75143ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn            }
75153ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn        }
75163ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn    }
75173ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn
75186804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    // "Something has changed!  Let's make it correct now."
75199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void performLayoutAndPlaceSurfacesLockedInner(
75209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean recoveringMemory) {
752134bcebca707187393263183aa4dab32728763f2fJoe Onorato        if (mDisplay == null) {
752234bcebca707187393263183aa4dab32728763f2fJoe Onorato            Slog.i(TAG, "skipping performLayoutAndPlaceSurfacesLockedInner with no mDisplay");
752334bcebca707187393263183aa4dab32728763f2fJoe Onorato            return;
752434bcebca707187393263183aa4dab32728763f2fJoe Onorato        }
752534bcebca707187393263183aa4dab32728763f2fJoe Onorato
75269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long currentTime = SystemClock.uptimeMillis();
7527dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        final int dw = mCurDisplayWidth;
7528dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn        final int dh = mCurDisplayHeight;
752981e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        final int innerDw = mAppDisplayWidth;
753081e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        final int innerDh = mAppDisplayHeight;
7531e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn
75329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i;
75339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7534b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn        if (mFocusMayChange) {
7535b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn            mFocusMayChange = false;
75363a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown            updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
75373a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    false /*updateInputWindows*/);
7538b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn        }
7539b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn
75409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Initialize state of exiting tokens.
75419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=mExitingTokens.size()-1; i>=0; i--) {
75429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mExitingTokens.get(i).hasVisible = false;
75439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
75449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
75459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Initialize state of exiting applications.
75469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=mExitingAppTokens.size()-1; i>=0; i--) {
75479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mExitingAppTokens.get(i).hasVisible = false;
75489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
75499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
75509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean orientationChangeComplete = true;
75519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Session holdScreen = null;
75529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float screenBrightness = -1;
7553fb73f79340375013225618a5d87f46b958f698efMike Lockwood        float buttonBrightness = -1;
75549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean focusDisplayed = false;
75559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean animating = false;
7556fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        boolean createWatermark = false;
755789ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        boolean updateRotation = false;
755850660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn        boolean screenRotationFinished = false;
7559fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
7560fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        if (mFxSession == null) {
7561fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn            mFxSession = new SurfaceSession();
7562fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn            createWatermark = true;
7563fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
7564fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
756536991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn        if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
756636991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn                ">>> OPEN TRANSACTION performLayoutAndPlaceSurfaces");
75679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
75689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Surface.openTransaction();
7569fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
7570fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        if (createWatermark) {
7571fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn            createWatermark();
7572fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
7573fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        if (mWatermark != null) {
7574fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn            mWatermark.positionSurface(dw, dh);
7575fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
75766804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        if (mStrictModeFlash != null) {
75776804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            mStrictModeFlash.positionSurface(dw, dh);
75786804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        }
7579fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
75809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
7581de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn            boolean wallpaperForceHidingChanged = false;
7582b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            int repeats = 0;
7583b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            int changes = 0;
7584b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
75859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            do {
7586b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                repeats++;
7587b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (repeats > 6) {
7588b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    Slog.w(TAG, "Animation repeat aborted after too many iterations");
7589b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    mLayoutNeeded = false;
7590b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    break;
7591b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                }
7592b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
7593b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if ((changes&(WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER
7594b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        | WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG
7595b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        | WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT)) != 0) {
7596b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
7597b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        if ((adjustWallpaperWindowsLocked()&ADJUST_WALLPAPER_LAYERS_CHANGED) != 0) {
7598b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            assignLayersLocked();
7599b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            mLayoutNeeded = true;
7600b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        }
7601b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
7602b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG) != 0) {
7603b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        if (DEBUG_LAYOUT) Slog.v(TAG, "Computing new config from layout");
760494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        if (updateOrientationFromAppTokensLocked(true)) {
7605b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            mLayoutNeeded = true;
7606b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
7607b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        }
7608b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
7609b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT) != 0) {
7610b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        mLayoutNeeded = true;
7611b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
7612b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                }
7613b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
7614b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                // FIRST LOOP: Perform a layout, if needed.
7615b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (repeats < 4) {
76163a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    changes = performLayoutLockedInner(repeats == 0, false /*updateInputWindows*/);
7617b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (changes != 0) {
7618b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        continue;
7619b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
7620b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                } else {
7621b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    Slog.w(TAG, "Layout repeat skipped after too many iterations");
7622b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    changes = 0;
7623b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                }
7624b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
76259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int transactionSequence = ++mTransactionSequence;
76269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
76279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Update animations of all applications, including those
76289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // associated with exiting/removed apps
76299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean tokensAnimating = false;
76309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int NAT = mAppTokens.size();
76319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (i=0; i<NAT; i++) {
7632e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                    if (mAppTokens.get(i).stepAnimationLocked(currentTime,
7633e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                            innerDw, innerDh)) {
76349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        tokensAnimating = true;
76359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
76369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
76379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int NEAT = mExitingAppTokens.size();
76389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (i=0; i<NEAT; i++) {
7639e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                    if (mExitingAppTokens.get(i).stepAnimationLocked(currentTime,
7640e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                            innerDw, innerDh)) {
76419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        tokensAnimating = true;
76429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
76439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
76449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7645b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                // SECOND LOOP: Execute animations and update visibility of windows.
7646b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
76478a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "*** ANIM STEP: seq="
7648de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        + transactionSequence + " tokensAnimating="
7649de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        + tokensAnimating);
7650de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn
76519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                animating = tokensAnimating;
76529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7653f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                if (mScreenRotationAnimation != null) {
7654f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                    if (mScreenRotationAnimation.isAnimating()) {
7655f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                        if (mScreenRotationAnimation.stepAnimation(currentTime)) {
7656f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                            animating = true;
7657f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                        } else {
765850660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn                            screenRotationFinished = true;
765989ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                            updateRotation = true;
7660f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                        }
7661f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                    }
7662f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                }
7663f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn
76649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean tokenMayBeDrawn = false;
76656c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                boolean wallpaperMayChange = false;
7666b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                boolean forceHiding = false;
76676c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                WindowState windowDetachedWallpaper = null;
7668de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                WindowState windowAnimationBackground = null;
7669de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                int windowAnimationBackgroundColor = 0;
76709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
76719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPolicy.beginAnimationLw(dw, dh);
76729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7673bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                final int N = mWindows.size();
7674ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
76759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (i=N-1; i>=0; i--) {
7676e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    WindowState w = mWindows.get(i);
76779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
76789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final WindowManager.LayoutParams attrs = w.mAttrs;
76799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
76809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (w.mSurface != null) {
76818e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        // Take care of the window being ready to display.
76826c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                        if (w.commitFinishDrawingLocked(currentTime)) {
76836c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                            if ((w.mAttrs.flags
76846c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                                    & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) {
76858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_WALLPAPER) Slog.v(TAG,
76860586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                        "First draw done in potential wallpaper target " + w);
76876c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                                wallpaperMayChange = true;
76886c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                            }
76896c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                        }
7690ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
76916c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        final boolean wasAnimating = w.mAnimating;
76928e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn
7693e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                        int animDw = innerDw;
7694e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                        int animDh = innerDh;
76958e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn
76968e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        // If the window has moved due to its containing
76978e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        // content frame changing, then we'd like to animate
76988e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        // it.  The checks here are ordered by what is least
76993fe7f2f2e35692fe563ae00f62995030f1987c4fJoe Onorato                        // likely to be true first.
77001c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                        if (w.shouldAnimateMove()) {
77018e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            // Frame has moved, containing content frame
77028e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            // has also moved, and we're not currently animating...
77038e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            // let's do something.
77048e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            Animation a = AnimationUtils.loadAnimation(mContext,
77058e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                                    com.android.internal.R.anim.window_move_from_decor);
77068e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            w.setAnimation(a);
77078e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            animDw = w.mLastFrame.left - w.mFrame.left;
77088e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            animDh = w.mLastFrame.top - w.mFrame.top;
77098e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        }
77108e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn
77118e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        // Execute animation.
77128e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        final boolean nowAnimating = w.stepAnimationLocked(currentTime,
77138e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                                animDw, animDh);
77146c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn
77156c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        // If this window is animating, make a note that we have
77166c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        // an animating window and take care of a request to run
77176c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        // a detached wallpaper animation.
77186c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        if (nowAnimating) {
7719de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                            if (w.mAnimation != null) {
77206d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                                if ((w.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0
77216d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                                        && w.mAnimation.getDetachWallpaper()) {
7722de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                    windowDetachedWallpaper = w;
7723de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                }
7724de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                if (w.mAnimation.getBackgroundColor() != 0) {
7725d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn                                    if (windowAnimationBackground == null || w.mAnimLayer <
7726d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn                                            windowAnimationBackground.mAnimLayer) {
7727d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn                                        windowAnimationBackground = w;
7728d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn                                        windowAnimationBackgroundColor =
7729d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn                                                w.mAnimation.getBackgroundColor();
7730d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn                                    }
7731de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                }
77326c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                            }
77339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            animating = true;
77349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
77356c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn
77366c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        // If this window's app token is running a detached wallpaper
77376c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        // animation, make a note so we can ensure the wallpaper is
77386c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        // displayed behind it.
7739d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn                        if (w.mAppToken != null && w.mAppToken.animation != null
7740d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn                                && w.mAppToken.animating) {
77416d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                            if ((w.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0
77426d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                                    && w.mAppToken.animation.getDetachWallpaper()) {
7743de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                windowDetachedWallpaper = w;
7744de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                            }
7745de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                            if (w.mAppToken.animation.getBackgroundColor() != 0) {
7746d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn                                if (windowAnimationBackground == null || w.mAnimLayer <
7747d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn                                        windowAnimationBackground.mAnimLayer) {
7748d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn                                    windowAnimationBackground = w;
7749d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn                                    windowAnimationBackgroundColor =
7750d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn                                            w.mAppToken.animation.getBackgroundColor();
7751d02a9e95f4cf6295f1a060b4e31c6fbe41123649Dianne Hackborn                                }
7752de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                            }
77536c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        }
77546c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn
77556136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                        if (wasAnimating && !w.mAnimating && mWallpaperTarget == w) {
77566136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                            wallpaperMayChange = true;
77576136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                        }
7758ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
77593b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        if (mPolicy.doesForceHide(w, attrs)) {
77606c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                            if (!wasAnimating && nowAnimating) {
776120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                if (DEBUG_VISIBILITY) Slog.v(TAG,
77626c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                                        "Animation started that could impact force hide: "
776320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        + w);
77643b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                wallpaperForceHidingChanged = true;
7765b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                                mFocusMayChange = true;
77663b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            } else if (w.isReadyForDisplay() && w.mAnimation == null) {
77673b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                forceHiding = true;
77683b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            }
77693b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        } else if (mPolicy.canBeForceHidden(w, attrs)) {
77703b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            boolean changed;
77713b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            if (forceHiding) {
77723b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                changed = w.hideLw(false, false);
777320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                if (DEBUG_VISIBILITY && changed) Slog.v(TAG,
777420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        "Now policy hidden: " + w);
77753b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            } else {
77763b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                changed = w.showLw(false, false);
777720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                if (DEBUG_VISIBILITY && changed) Slog.v(TAG,
777820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        "Now policy shown: " + w);
777920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                if (changed) {
778020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                    if (wallpaperForceHidingChanged
7781b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                            && w.isVisibleNow() /*w.isReadyForDisplay()*/) {
778220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // Assume we will need to animate.  If
778320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // we don't (because the wallpaper will
778420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // stay with the lock screen), then we will
778520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // clean up later.
778620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        Animation a = mPolicy.createForceHideEnterAnimation();
778720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        if (a != null) {
778820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                            w.setAnimation(a);
778920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        }
779020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                    }
779120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                    if (mCurrentFocus == null ||
779220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                            mCurrentFocus.mLayer < w.mLayer) {
779320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // We are showing on to of the current
779420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // focus, so re-evaluate focus to make
779520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // sure it is correct.
779620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        mFocusMayChange = true;
77973b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                    }
77983b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                }
77993b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            }
78003b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            if (changed && (attrs.flags
78013b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                    & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) {
78023b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                wallpaperMayChange = true;
78033b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            }
78043b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        }
7805ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
78069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mPolicy.animatingWindowLw(w, attrs);
78079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
78089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
78099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final AppWindowToken atoken = w.mAppToken;
78109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (atoken != null && (!atoken.allDrawn || atoken.freezingScreen)) {
78119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (atoken.lastTransactionSequence != transactionSequence) {
78129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            atoken.lastTransactionSequence = transactionSequence;
78139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            atoken.numInterestingWindows = atoken.numDrawnWindows = 0;
78149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            atoken.startingDisplayed = false;
78159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
78169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if ((w.isOnScreen() || w.mAttrs.type
78179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                == WindowManager.LayoutParams.TYPE_BASE_APPLICATION)
78189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                && !w.mExiting && !w.mDestroying) {
78199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) {
78208a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.v(TAG, "Eval win " + w + ": isDrawn="
78217433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn                                        + w.isDrawnLw()
78229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + ", isAnimating=" + w.isAnimating());
78237433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn                                if (!w.isDrawnLw()) {
78248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                    Slog.v(TAG, "Not displayed: s=" + w.mSurface
78259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " pv=" + w.mPolicyVisibility
78269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " dp=" + w.mDrawPending
78279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " cdp=" + w.mCommitDrawPending
78289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " ah=" + w.mAttachedHidden
78299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " th=" + atoken.hiddenRequested
78309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " a=" + w.mAnimating);
78319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
78329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
78339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (w != atoken.startingWindow) {
78349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (!atoken.freezingScreen || !w.mAppFreezing) {
78359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    atoken.numInterestingWindows++;
78367433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn                                    if (w.isDrawnLw()) {
78379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        atoken.numDrawnWindows++;
78388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                        if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) Slog.v(TAG,
78399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                "tokenMayBeDrawn: " + atoken
78409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                + " freezingScreen=" + atoken.freezingScreen
78419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                + " mAppFreezing=" + w.mAppFreezing);
78429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        tokenMayBeDrawn = true;
78439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    }
78449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
78457433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn                            } else if (w.isDrawnLw()) {
78469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                atoken.startingDisplayed = true;
78479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
78489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
78499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (w.mReadyToShow) {
78509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.performShowLocked();
78519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
78529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
78539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7854b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                changes |= mPolicy.finishAnimationLw();
78559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
78569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (tokenMayBeDrawn) {
78579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // See if any windows have been drawn, so they (and others
78589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // associated with them) can now be shown.
7859f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    final int NT = mAppTokens.size();
78609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (i=0; i<NT; i++) {
7861f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                        AppWindowToken wtoken = mAppTokens.get(i);
78629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (wtoken.freezingScreen) {
78639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int numInteresting = wtoken.numInterestingWindows;
78649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
78658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_VISIBILITY) Slog.v(TAG,
78669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "allDrawn: " + wtoken
78679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " interesting=" + numInteresting
78689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " drawn=" + wtoken.numDrawnWindows);
78699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                wtoken.showAllWindowsLocked();
78709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                unsetAppFreezingScreenLocked(wtoken, false, true);
78713ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn                                if (DEBUG_ORIENTATION) Slog.i(TAG,
78723ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn                                        "Setting orientationChangeComplete=true because wtoken "
78733ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn                                        + wtoken + " numInteresting=" + numInteresting
78743ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn                                        + " numDrawn=" + wtoken.numDrawnWindows);
78759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                orientationChangeComplete = true;
78769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
78779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (!wtoken.allDrawn) {
78789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int numInteresting = wtoken.numInterestingWindows;
78799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
78808a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_VISIBILITY) Slog.v(TAG,
78819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "allDrawn: " + wtoken
78829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " interesting=" + numInteresting
78839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " drawn=" + wtoken.numDrawnWindows);
78849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                wtoken.allDrawn = true;
7885b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
78869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
78879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // We can now show all of the drawn windows!
78889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (!mOpeningApps.contains(wtoken)) {
78899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    wtoken.showAllWindowsLocked();
78909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
78919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
78929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
78939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
78949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
78959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
78969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If we are ready to perform an app transition, check through
78979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // all of the app tokens to be shown and see if they are ready
78989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // to go.
78999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mAppTransitionReady) {
79009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int NN = mOpeningApps.size();
79019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean goodToGo = true;
79028a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
79039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "Checking " + NN + " opening apps (frozen="
79049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mDisplayFrozen + " timeout="
79059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mAppTransitionTimeout + ")...");
79069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mDisplayFrozen && !mAppTransitionTimeout) {
79079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // If the display isn't frozen, wait to do anything until
79089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // all of the apps are ready.  Otherwise just go because
79099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // we'll unfreeze the display when everyone is ready.
79109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (i=0; i<NN && goodToGo; i++) {
79119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AppWindowToken wtoken = mOpeningApps.get(i);
79128a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
79139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Check opening app" + wtoken + ": allDrawn="
79149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + wtoken.allDrawn + " startingDisplayed="
79159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + wtoken.startingDisplayed);
79169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (!wtoken.allDrawn && !wtoken.startingDisplayed
79179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    && !wtoken.startingMoved) {
79189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                goodToGo = false;
79199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
79209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
79219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
79229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (goodToGo) {
79238a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO");
79249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int transit = mNextAppTransition;
79259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mSkipAppTransitionAnimation) {
7926bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                            transit = WindowManagerPolicy.TRANSIT_UNSET;
79279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
7928bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                        mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET;
79299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAppTransitionReady = false;
7930a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mAppTransitionRunning = true;
79319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAppTransitionTimeout = false;
79329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mStartingIconInTransition = false;
79339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mSkipAppTransitionAnimation = false;
79349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
79359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mH.removeMessages(H.APP_TRANSITION_TIMEOUT);
79369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7937a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // If there are applications waiting to come to the
7938a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // top of the stack, now is the time to move their windows.
7939a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // (Note that we don't do apps going to the bottom
7940a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // here -- we want to keep their windows in the old
7941a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // Z-order until the animation completes.)
7942a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        if (mToTopApps.size() > 0) {
7943a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                            NN = mAppTokens.size();
7944a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                            for (i=0; i<NN; i++) {
7945a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                                AppWindowToken wtoken = mAppTokens.get(i);
7946a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                                if (wtoken.sendingToTop) {
7947a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                                    wtoken.sendingToTop = false;
7948a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                                    moveAppWindowsLocked(wtoken, NN, false);
7949a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                                }
7950a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                            }
7951a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                            mToTopApps.clear();
7952a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        }
7953ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
795425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        WindowState oldWallpaper = mWallpaperTarget;
7955ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
79563be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        adjustWallpaperWindowsLocked();
79576c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                        wallpaperMayChange = false;
7958ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7959bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // The top-most window will supply the layout params,
7960bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // and we will determine it below.
7961bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        LayoutParams animLp = null;
7962bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        int bestAnimLayer = -1;
796308121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                        boolean fullscreenAnim = false;
7964ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
79658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
79663be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                                "New wallpaper target=" + mWallpaperTarget
79673be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                                + ", lower target=" + mLowerWallpaperTarget
79683be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                                + ", upper target=" + mUpperWallpaperTarget);
796925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        int foundWallpapers = 0;
7970bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // Do a first pass through the tokens for two
7971bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // things:
7972bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // (1) Determine if both the closing and opening
7973bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // app token sets are wallpaper targets, in which
7974bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // case special animations are needed
7975bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // (since the wallpaper needs to stay static
7976bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // behind them).
7977bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // (2) Find the layout params of the top-most
7978bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // application window in the tokens, which is
7979bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // what will control the animation theme.
7980bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        final int NC = mClosingApps.size();
7981bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        NN = NC + mOpeningApps.size();
7982bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        for (i=0; i<NN; i++) {
7983bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            AppWindowToken wtoken;
7984bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            int mode;
7985bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            if (i < NC) {
7986bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                wtoken = mClosingApps.get(i);
7987bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                mode = 1;
7988bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            } else {
7989bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                wtoken = mOpeningApps.get(i-NC);
7990bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                mode = 2;
7991f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                            }
7992bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            if (mLowerWallpaperTarget != null) {
7993bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                if (mLowerWallpaperTarget.mAppToken == wtoken
7994bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                        || mUpperWallpaperTarget.mAppToken == wtoken) {
7995bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                    foundWallpapers |= mode;
7996f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                                }
7997bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            }
7998bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            if (wtoken.appFullscreen) {
7999bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                WindowState ws = wtoken.findMainWindow();
8000bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                if (ws != null) {
8001ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                                    animLp = ws.mAttrs;
8002ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                                    bestAnimLayer = ws.mLayer;
800308121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                                    fullscreenAnim = true;
800408121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                                }
800508121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                            } else if (!fullscreenAnim) {
800608121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                                WindowState ws = wtoken.findMainWindow();
800708121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                                if (ws != null) {
800808121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                                    if (ws.mLayer > bestAnimLayer) {
8009bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                        animLp = ws.mAttrs;
8010bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                        bestAnimLayer = ws.mLayer;
8011bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                    }
8012f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                                }
8013f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                            }
801425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        }
8015ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
801625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        if (foundWallpapers == 3) {
80178a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
801825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    "Wallpaper animation!");
801925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            switch (transit) {
802025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN:
802125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                case WindowManagerPolicy.TRANSIT_TASK_OPEN:
802225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                case WindowManagerPolicy.TRANSIT_TASK_TO_FRONT:
802325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    transit = WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_OPEN;
802425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    break;
802525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                case WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE:
802625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                case WindowManagerPolicy.TRANSIT_TASK_CLOSE:
802725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                case WindowManagerPolicy.TRANSIT_TASK_TO_BACK:
802825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    transit = WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_CLOSE;
802925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    break;
8030f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                            }
80318a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
803225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    "New transit: " + transit);
803325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        } else if (oldWallpaper != null) {
803425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            // We are transitioning from an activity with
803525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            // a wallpaper to one without.
803625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            transit = WindowManagerPolicy.TRANSIT_WALLPAPER_CLOSE;
80378a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
803825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    "New transit away from wallpaper: " + transit);
803925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        } else if (mWallpaperTarget != null) {
804025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            // We are transitioning from an activity without
804125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            // a wallpaper to now showing the wallpaper
804225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            transit = WindowManagerPolicy.TRANSIT_WALLPAPER_OPEN;
80438a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
804425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    "New transit into wallpaper: " + transit);
8045f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                        }
8046ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
8047de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        // If all closing windows are obscured, then there is
8048de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        // no need to do an animation.  This is the case, for
8049de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        // example, when this transition is being done behind
8050de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        // the lock screen.
8051de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        if (!mPolicy.allowAppAnimationsLw()) {
8052de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            animLp = null;
8053de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        }
8054de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn
80559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        NN = mOpeningApps.size();
80569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (i=0; i<NN; i++) {
80579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AppWindowToken wtoken = mOpeningApps.get(i);
80588a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
80599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Now opening app" + wtoken);
80609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.reportedVisible = false;
80619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.inPendingTransaction = false;
806283360b3167f2c394125b74f655bc577070cb9ccaDianne Hackborn                            wtoken.animation = null;
8063e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                            setTokenVisibilityLocked(wtoken, animLp, true,
8064ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                                    transit, false);
80659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.updateReportedVisibilityLocked();
8066a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                            wtoken.waitingToShow = false;
80679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.showAllWindowsLocked();
80689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
80699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        NN = mClosingApps.size();
80709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (i=0; i<NN; i++) {
80719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AppWindowToken wtoken = mClosingApps.get(i);
80728a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
80739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Now closing app" + wtoken);
80749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.inPendingTransaction = false;
807583360b3167f2c394125b74f655bc577070cb9ccaDianne Hackborn                            wtoken.animation = null;
8076e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                            setTokenVisibilityLocked(wtoken, animLp, false,
8077ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                                    transit, false);
80789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.updateReportedVisibilityLocked();
8079a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                            wtoken.waitingToHide = false;
80809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Force the allDrawn flag, because we want to start
80819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // this guy's animations regardless of whether it's
80829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // gotten drawn.
80839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.allDrawn = true;
80849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
80859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
80868b571a817cc953ce96750f440645f104c7f55157Dianne Hackborn                        mNextAppTransitionPackage = null;
8087ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
80889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mOpeningApps.clear();
80899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mClosingApps.clear();
80909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
80919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // This has changed the visibility of windows, so perform
80929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // a new layout to get them all up-to-date.
809394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT
809494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                                | WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG;
80959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLayoutNeeded = true;
809620583ff9d49257bd4ccc60e7b6337661e34ed887Dianne Hackborn                        if (!moveInputMethodWindowsIfNeededLocked(true)) {
809720583ff9d49257bd4ccc60e7b6337661e34ed887Dianne Hackborn                            assignLayersLocked();
809820583ff9d49257bd4ccc60e7b6337661e34ed887Dianne Hackborn                        }
80993a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES,
81003a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                                false /*updateInputWindows*/);
8101b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                        mFocusMayChange = false;
81029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
81039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8104ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
810516064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                int adjResult = 0;
810616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn
8107a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                if (!animating && mAppTransitionRunning) {
8108a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // We have finished the animation of an app transition.  To do
8109a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // this, we have delayed a lot of operations like showing and
8110a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // hiding apps, moving apps in Z-order, etc.  The app token list
8111a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // reflects the correct Z-order, but the window list may now
8112a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // be out of sync with it.  So here we will just rebuild the
8113a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // entire app window list.  Fun!
8114a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    mAppTransitionRunning = false;
8115a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // Clear information about apps that were moving.
8116a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    mToBottomApps.clear();
8117ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
8118a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    rebuildAppWindowListLocked();
8119b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT;
812016064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                    adjResult |= ADJUST_WALLPAPER_LAYERS_CHANGED;
8121a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    moveInputMethodWindowsIfNeededLocked(false);
8122a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    wallpaperMayChange = true;
8123c9568e3989f1491abaa7960eca986af12743cb05Suchi Amalapurapu                    // Since the window list has been rebuilt, focus might
8124c9568e3989f1491abaa7960eca986af12743cb05Suchi Amalapurapu                    // have to be recomputed since the actual order of windows
8125c9568e3989f1491abaa7960eca986af12743cb05Suchi Amalapurapu                    // might have changed again.
8126b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                    mFocusMayChange = true;
8127a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                }
8128ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
8129b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (wallpaperForceHidingChanged && changes == 0 && !mAppTransitionReady) {
81303b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // At this point, there was a window with a wallpaper that
81313b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // was force hiding other windows behind it, but now it
81323b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // is going away.  This may be simple -- just animate
81333b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // away the wallpaper and its window -- or it may be
81343b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // hard -- the wallpaper now needs to be shown behind
81353b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // something that was hidden.
81363b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    WindowState oldWallpaper = mWallpaperTarget;
8137de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                    if (mLowerWallpaperTarget != null
8138de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            && mLowerWallpaperTarget.mAppToken != null) {
81398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_WALLPAPER) Slog.v(TAG,
8140de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                                "wallpaperForceHiding changed with lower="
8141de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                                + mLowerWallpaperTarget);
81428a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_WALLPAPER) Slog.v(TAG,
8143de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                                "hidden=" + mLowerWallpaperTarget.mAppToken.hidden +
8144de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                                " hiddenRequested=" + mLowerWallpaperTarget.mAppToken.hiddenRequested);
8145de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        if (mLowerWallpaperTarget.mAppToken.hidden) {
8146de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            // The lower target has become hidden before we
8147de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            // actually started the animation...  let's completely
8148de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            // re-evaluate everything.
8149de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            mLowerWallpaperTarget = mUpperWallpaperTarget = null;
8150b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
8151de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        }
8152de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                    }
815316064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                    adjResult |= adjustWallpaperWindowsLocked();
81543b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    wallpaperMayChange = false;
8155de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                    wallpaperForceHidingChanged = false;
81568a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WALLPAPER) Slog.v(TAG, "****** OLD: " + oldWallpaper
8157de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            + " NEW: " + mWallpaperTarget
8158de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            + " LOWER: " + mLowerWallpaperTarget);
81593b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    if (mLowerWallpaperTarget == null) {
81603b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        // Whoops, we don't need a special wallpaper animation.
81613b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        // Clear them out.
81623b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        forceHiding = false;
81633b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        for (i=N-1; i>=0; i--) {
8164e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                            WindowState w = mWindows.get(i);
81653b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            if (w.mSurface != null) {
81663b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                final WindowManager.LayoutParams attrs = w.mAttrs;
8167c03d28b9e96f667d29ec6e480bed171bbd07169dSuchi Amalapurapu                                if (mPolicy.doesForceHide(w, attrs) && w.isVisibleLw()) {
81688a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                    if (DEBUG_FOCUS) Slog.i(TAG, "win=" + w + " force hides other windows");
81693b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                    forceHiding = true;
81703b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                } else if (mPolicy.canBeForceHidden(w, attrs)) {
81713b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                    if (!w.mAnimating) {
81723b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                        // We set the animation above so it
81733b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                        // is not yet running.
81743b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                        w.clearAnimation();
81753b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                    }
81763b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                }
81773b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            }
81783b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        }
81793b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    }
81803b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                }
8181ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
81826c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                if (mWindowDetachedWallpaper != windowDetachedWallpaper) {
81836c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                    if (DEBUG_WALLPAPER) Slog.v(TAG,
81846c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                            "Detached wallpaper changed from " + mWindowDetachedWallpaper
8185ba24e4d8bbeb60e96d74f05e21691dad61ce497eDianne Hackborn                            + " to " + windowDetachedWallpaper);
81866c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                    mWindowDetachedWallpaper = windowDetachedWallpaper;
81876c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                    wallpaperMayChange = true;
81886c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                }
81896c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn
8190de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                if (windowAnimationBackgroundColor != 0) {
8191ba24e4d8bbeb60e96d74f05e21691dad61ce497eDianne Hackborn                    // If the window that wants black is the current wallpaper
81929e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                    // target, then the black goes *below* the wallpaper so we
81939e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                    // don't cause the wallpaper to suddenly disappear.
81949e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                    WindowState target = windowAnimationBackground;
81959e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                    if (mWallpaperTarget == windowAnimationBackground
81969e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                            || mLowerWallpaperTarget == windowAnimationBackground
81979e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                            || mUpperWallpaperTarget == windowAnimationBackground) {
81989e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                        for (i=0; i<mWindows.size(); i++) {
81999e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                            WindowState w = mWindows.get(i);
82009e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                            if (w.mIsWallpaper) {
82019e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                                target = w;
82029e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                                break;
82039e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                            }
82049e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                        }
82059e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                    }
8206de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                    if (mWindowAnimationBackgroundSurface == null) {
8207de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                        mWindowAnimationBackgroundSurface = new DimSurface(mFxSession);
8208de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                    }
8209de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                    mWindowAnimationBackgroundSurface.show(dw, dh,
82109e4e727b4a164c17944e8ae6eb2d2532a98737f8Dianne Hackborn                            target.mAnimLayer - LAYER_OFFSET_DIM,
8211de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                            windowAnimationBackgroundColor);
8212de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                } else if (mWindowAnimationBackgroundSurface != null) {
8213de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                    mWindowAnimationBackgroundSurface.hide();
8214de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                }
8215de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn
82166c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                if (wallpaperMayChange) {
82178a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WALLPAPER) Slog.v(TAG,
82180586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                            "Wallpaper may change!  Adjusting");
821916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                    adjResult |= adjustWallpaperWindowsLocked();
82203b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                }
8221ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
82223b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                if ((adjResult&ADJUST_WALLPAPER_LAYERS_CHANGED) != 0) {
82238a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WALLPAPER) Slog.v(TAG,
82243b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            "Wallpaper layer changed: assigning layers + relayout");
8225b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT;
82263b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    assignLayersLocked();
82273b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                } else if ((adjResult&ADJUST_WALLPAPER_VISIBILITY_CHANGED) != 0) {
82288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WALLPAPER) Slog.v(TAG,
82293b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            "Wallpaper visibility changed: relayout");
8230b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT;
82313b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                }
8232ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
8233b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                if (mFocusMayChange) {
8234b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                    mFocusMayChange = false;
82353a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    if (updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES,
82363a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                            false /*updateInputWindows*/)) {
8237b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
82383b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        adjResult = 0;
8239a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    }
82406c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                }
82413b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn
82423b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                if (mLayoutNeeded) {
8243b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT;
82443b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                }
8245ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
8246b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "*** ANIM STEP: changes=0x"
8247b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + Integer.toHexString(changes));
8248b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            } while (changes != 0);
82499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
82509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // THIRD LOOP: Update the surfaces of all windows.
82519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
82529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final boolean someoneLosingFocus = mLosingFocus.size() != 0;
82539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
82549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean obscured = false;
82559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean blurring = false;
82569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean dimming = false;
82579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean covered = false;
82589ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn            boolean syswin = false;
82599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8260bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn            final int N = mWindows.size();
8261ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
82629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (i=N-1; i>=0; i--) {
8263e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState w = mWindows.get(i);
82649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
82659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean displayed = false;
82669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final WindowManager.LayoutParams attrs = w.mAttrs;
82679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int attrFlags = attrs.flags;
82689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
82699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (w.mSurface != null) {
8270ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // XXX NOTE: The logic here could be improved.  We have
8271ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // the decision about whether to resize a window separated
8272ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // from whether to hide the surface.  This can cause us to
8273ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // resize a surface even if we are going to hide it.  You
8274ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // can see this by (1) holding device in landscape mode on
8275ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // home screen; (2) tapping browser icon (device will rotate
8276ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // to landscape; (3) tap home.  The wallpaper will be resized
8277ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // in step 2 but then immediately hidden, causing us to
8278ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // have to resize and then redraw it again in step 3.  It
8279ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // would be nice to figure out how to avoid this, but it is
8280ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // difficult because we do need to resize surfaces in some
8281ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // cases while they are hidden such as when first showing a
8282ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // window.
8283ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn
82849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.computeShownFrameLocked();
82858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (localLOGV) Slog.v(
82869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            TAG, "Placing surface #" + i + " " + w.mSurface
8287ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                            + ": new=" + w.mShownFrame);
82889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8289fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                    if (w.mSurface != null) {
8290b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        int width, height;
8291b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        if ((w.mAttrs.flags & w.mAttrs.FLAG_SCALED) != 0) {
8292b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                            // for a scaled surface, we just want to use
8293b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                            // the requested size.
8294b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                            width  = w.mRequestedWidth;
8295b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                            height = w.mRequestedHeight;
8296b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        } else {
8297b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                            width = w.mCompatFrame.width();
8298b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                            height = w.mCompatFrame.height();
8299b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        }
8300b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn
8301b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        if (width < 1) {
8302b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                            width = 1;
8303b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        }
8304b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        if (height < 1) {
8305b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                            height = 1;
8306b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        }
8307b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        final boolean surfaceResized = w.mSurfaceW != width || w.mSurfaceH != height;
8308b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        if (surfaceResized) {
8309b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                            w.mSurfaceW = width;
8310b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                            w.mSurfaceH = height;
8311b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        }
8312b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn
8313fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                        if (w.mSurfaceX != w.mShownFrame.left
8314fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                || w.mSurfaceY != w.mShownFrame.top) {
8315fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                            try {
8316fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                if (SHOW_TRANSACTIONS) logSurface(w,
8317fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        "POS " + w.mShownFrame.left
8318fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + ", " + w.mShownFrame.top, null);
8319fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                w.mSurfaceX = w.mShownFrame.left;
8320fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                w.mSurfaceY = w.mShownFrame.top;
8321fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                w.mSurface.setPosition(w.mShownFrame.left, w.mShownFrame.top);
8322fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                            } catch (RuntimeException e) {
8323fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                Slog.w(TAG, "Error positioning surface of " + w
8324fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + " pos=(" + w.mShownFrame.left
8325fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + "," + w.mShownFrame.top + ")", e);
8326fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                if (!recoveringMemory) {
8327648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                    reclaimSomeSurfaceMemoryLocked(w, "position", true);
8328fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                }
8329fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                            }
8330fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                        }
8331fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown
8332b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        if (surfaceResized) {
83339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            try {
8334b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                if (SHOW_TRANSACTIONS) logSurface(w,
8335b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                                        "SIZE " + width + "x" + height, null);
8336ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                                w.mSurfaceResized = true;
83379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mSurface.setSize(width, height);
83389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } catch (RuntimeException e) {
83399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // If something goes wrong with the surface (such
83409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // as running out of memory), don't take down the
83419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // entire system.
8342fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                Slog.e(TAG, "Error resizing surface of " + w
8343fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + " size=(" + width + "x" + height + ")", e);
83449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (!recoveringMemory) {
8345648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                    reclaimSomeSurfaceMemoryLocked(w, "size", true);
83469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
83479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
83489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
83499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8350fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown
8351e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    if (!w.mAppFreezing && w.mLayoutSeq == mLayoutSeq) {
8352b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        w.mContentInsetsChanged |=
83539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            !w.mLastContentInsets.equals(w.mContentInsets);
8354b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        w.mVisibleInsetsChanged |=
83559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            !w.mLastVisibleInsets.equals(w.mVisibleInsets);
8356e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                        boolean configChanged =
8357e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                            w.mConfiguration != mCurConfiguration
8358e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                            && (w.mConfiguration == null
8359e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                                    || mCurConfiguration.diff(w.mConfiguration) != 0);
8360694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        if (DEBUG_CONFIGURATION && configChanged) {
8361694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            Slog.v(TAG, "Win " + w + " config changed: "
8362694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                    + mCurConfiguration);
8363694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        }
83648a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (localLOGV) Slog.v(TAG, "Resizing " + w
8365e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                                + ": configChanged=" + configChanged
8366b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                                + " last=" + w.mLastFrame + " frame=" + w.mFrame);
8367b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        w.mLastFrame.set(w.mFrame);
8368b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                        if (w.mContentInsetsChanged
8369e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                                || w.mVisibleInsetsChanged
8370ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                                || w.mSurfaceResized
8371e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                                || configChanged) {
8372fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                            if (DEBUG_RESIZE || DEBUG_ORIENTATION) {
8373fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                Slog.v(TAG, "Resize reasons: "
8374fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + " contentInsetsChanged=" + w.mContentInsetsChanged
8375fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + " visibleInsetsChanged=" + w.mVisibleInsetsChanged
8376fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + " surfaceResized=" + w.mSurfaceResized
8377fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + " configChanged=" + configChanged);
8378fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                            }
8379fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown
83809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            w.mLastContentInsets.set(w.mContentInsets);
83819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            w.mLastVisibleInsets.set(w.mVisibleInsets);
83823ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn                            makeWindowFreezingScreenIfNeededLocked(w);
83839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // If the orientation is changing, then we need to
83849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // hold off on unfreezing the display until this
83859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // window has been redrawn; to do that, we need
83869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // to go through the process of getting informed
83879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // by the application when it has finished drawing.
83889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (w.mOrientationChanging) {
83898a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_ORIENTATION) Slog.v(TAG,
83909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "Orientation start waiting for draw in "
83919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + w + ", surface " + w.mSurface);
83929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mDrawPending = true;
83939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mCommitDrawPending = false;
83949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mReadyToShow = false;
83959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (w.mAppToken != null) {
83969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    w.mAppToken.allDrawn = false;
83979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
83989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
8399b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                            if (!mResizingWindows.contains(w)) {
8400b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                                if (DEBUG_RESIZE || DEBUG_ORIENTATION) Slog.v(TAG,
8401b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                                        "Resizing window " + w + " to " + w.mSurfaceW
8402b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                                        + "x" + w.mSurfaceH);
8403b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                                mResizingWindows.add(w);
8404b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                            }
84059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (w.mOrientationChanging) {
84069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (!w.mDrawPending && !w.mCommitDrawPending) {
84078a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_ORIENTATION) Slog.v(TAG,
84089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "Orientation not waiting for draw in "
84099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + w + ", surface " + w.mSurface);
84109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mOrientationChanging = false;
84119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
84129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
84139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
84149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
84153b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    if (w.mAttachedHidden || !w.isReadyForDisplay()) {
84169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!w.mLastHidden) {
84179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            //dump();
84189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            w.mLastHidden = true;
8419b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            if (SHOW_TRANSACTIONS) logSurface(w,
8420b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                    "HIDE (performLayout)", null);
84219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (w.mSurface != null) {
842216064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                w.mSurfaceShown = false;
84239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                try {
84249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    w.mSurface.hide();
84259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                } catch (RuntimeException e) {
84268a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                    Slog.w(TAG, "Exception hiding surface in " + w);
84279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
84289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
84299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
84309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // If we are waiting for this window to handle an
84319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // orientation change, well, it is hidden, so
84329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // doesn't really matter.  Note that this does
84339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // introduce a potential glitch if the window
84349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // becomes unhidden before it has drawn for the
84359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // new orientation.
84369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (w.mOrientationChanging) {
84379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            w.mOrientationChanging = false;
84388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_ORIENTATION) Slog.v(TAG,
84399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Orientation change skips hidden " + w);
84409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
84419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (w.mLastLayer != w.mAnimLayer
84429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastAlpha != w.mShownAlpha
84439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastDsDx != w.mDsDx
84449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastDtDx != w.mDtDx
84459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastDsDy != w.mDsDy
84469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastDtDy != w.mDtDy
84479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastHScale != w.mHScale
84489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastVScale != w.mVScale
84499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastHidden) {
84509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        displayed = true;
84519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastAlpha = w.mShownAlpha;
84529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastLayer = w.mAnimLayer;
84539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastDsDx = w.mDsDx;
84549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastDtDx = w.mDtDx;
84559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastDsDy = w.mDsDy;
84569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastDtDy = w.mDtDy;
84579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastHScale = w.mHScale;
84589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastVScale = w.mVScale;
8459b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        if (SHOW_TRANSACTIONS) logSurface(w,
8460b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                "alpha=" + w.mShownAlpha + " layer=" + w.mAnimLayer
84610586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                + " matrix=[" + (w.mDsDx*w.mHScale)
84620586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                + "," + (w.mDtDx*w.mVScale)
84630586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                + "][" + (w.mDsDy*w.mHScale)
8464b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                + "," + (w.mDtDy*w.mVScale) + "]", null);
84659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (w.mSurface != null) {
84669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            try {
846716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                w.mSurfaceAlpha = w.mShownAlpha;
84689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mSurface.setAlpha(w.mShownAlpha);
846916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                w.mSurfaceLayer = w.mAnimLayer;
84709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mSurface.setLayer(w.mAnimLayer);
84719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mSurface.setMatrix(
84729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        w.mDsDx*w.mHScale, w.mDtDx*w.mVScale,
84739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        w.mDsDy*w.mHScale, w.mDtDy*w.mVScale);
84749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } catch (RuntimeException e) {
84758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.w(TAG, "Error updating surface in " + w, e);
84769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (!recoveringMemory) {
8477648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                    reclaimSomeSurfaceMemoryLocked(w, "update", true);
84789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
84799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
84809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
84819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
84829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (w.mLastHidden && !w.mDrawPending
84839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                && !w.mCommitDrawPending
84849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                && !w.mReadyToShow) {
8485b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            if (SHOW_TRANSACTIONS) logSurface(w,
8486b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                    "SHOW (performLayout)", null);
84878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + w
84889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + " during relayout");
84899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (showSurfaceRobustlyLocked(w)) {
84909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mHasDrawn = true;
84919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mLastHidden = false;
84929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } else {
84939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mOrientationChanging = false;
84949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
84959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
84969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (w.mSurface != null) {
84979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            w.mToken.hasVisible = true;
84989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
84999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
85009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        displayed = true;
85019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
85029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
85039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (displayed) {
85049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!covered) {
8505980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy                            if (attrs.width == LayoutParams.MATCH_PARENT
8506980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy                                    && attrs.height == LayoutParams.MATCH_PARENT) {
85079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                covered = true;
85089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
85099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
85109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (w.mOrientationChanging) {
85119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (w.mDrawPending || w.mCommitDrawPending) {
85129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                orientationChangeComplete = false;
85138a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_ORIENTATION) Slog.v(TAG,
85149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "Orientation continue waiting for draw in " + w);
85159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } else {
85169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mOrientationChanging = false;
85178a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_ORIENTATION) Slog.v(TAG,
85189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "Orientation change complete in " + w);
85199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
85209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
85219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mToken.hasVisible = true;
85229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
85239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (w.mOrientationChanging) {
85248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_ORIENTATION) Slog.v(TAG,
85259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "Orientation change skips hidden " + w);
85269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mOrientationChanging = false;
85279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
85289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
85290f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                if (w.mContentChanged) {
85300f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                    //Slog.i(TAG, "Window " + this + " clearing mContentChanged - done placing");
85310f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                    w.mContentChanged = false;
85320f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                }
85330f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
85349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final boolean canBeSeen = w.isDisplayedLw();
85359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
85369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (someoneLosingFocus && w == mCurrentFocus && canBeSeen) {
85379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    focusDisplayed = true;
85389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
85399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8540e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                final boolean obscuredChanged = w.mObscured != obscured;
8541ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
85429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Update effect.
85437341d7a104b47996445d069a695e155a07184606Dianne Hackborn                if (!(w.mObscured=obscured)) {
85449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (w.mSurface != null) {
85459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if ((attrFlags&FLAG_KEEP_SCREEN_ON) != 0) {
85469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            holdScreen = w.mSession;
85479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
85489ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn                        if (!syswin && w.mAttrs.screenBrightness >= 0
85499ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn                                && screenBrightness < 0) {
85509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            screenBrightness = w.mAttrs.screenBrightness;
85519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
8552fb73f79340375013225618a5d87f46b958f698efMike Lockwood                        if (!syswin && w.mAttrs.buttonBrightness >= 0
8553fb73f79340375013225618a5d87f46b958f698efMike Lockwood                                && buttonBrightness < 0) {
8554fb73f79340375013225618a5d87f46b958f698efMike Lockwood                            buttonBrightness = w.mAttrs.buttonBrightness;
8555fb73f79340375013225618a5d87f46b958f698efMike Lockwood                        }
855646af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood                        if (canBeSeen
855746af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood                                && (attrs.type == WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG
855846af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood                                 || attrs.type == WindowManager.LayoutParams.TYPE_KEYGUARD
855946af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood                                 || attrs.type == WindowManager.LayoutParams.TYPE_SYSTEM_ERROR)) {
85609ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn                            syswin = true;
85619ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn                        }
85629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
85631ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
856425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                    boolean opaqueDrawn = canBeSeen && w.isOpaqueDrawn();
8565e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                    if (opaqueDrawn && w.isFullscreen(innerDw, innerDh)) {
85669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // This window completely covers everything behind it,
85679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // so we want to leave all of them as unblurred (for
85689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // performance reasons).
85699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        obscured = true;
85703b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    } else if (canBeSeen && !obscured &&
85719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            (attrFlags&FLAG_BLUR_BEHIND|FLAG_DIM_BEHIND) != 0) {
85728a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (localLOGV) Slog.v(TAG, "Win " + w
85739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ": blurring=" + blurring
85749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " obscured=" + obscured
85759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " displayed=" + displayed);
85769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if ((attrFlags&FLAG_DIM_BEHIND) != 0) {
85779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (!dimming) {
85788a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                //Slog.i(TAG, "DIM BEHIND: " + w);
85799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                dimming = true;
85800a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                if (mDimAnimator == null) {
85810a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                    mDimAnimator = new DimAnimator(mFxSession);
85829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
858348a7651823030ed3c0f4c084b423430044425feaDianne Hackborn                                mDimAnimator.show(innerDw, innerDh);
85841c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                                mDimAnimator.updateParameters(mContext.getResources(),
85851c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                                        w, currentTime);
85869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
85879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
85889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if ((attrFlags&FLAG_BLUR_BEHIND) != 0) {
85899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (!blurring) {
85908a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                //Slog.i(TAG, "BLUR BEHIND: " + w);
85919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                blurring = true;
85929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (mBlurSurface == null) {
85939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    try {
859406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                                        mBlurSurface = new Surface(mFxSession, 0,
85955d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian                                                "BlurSurface",
85969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                -1, 16, 16,
85979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                PixelFormat.OPAQUE,
85989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                Surface.FX_SURFACE_BLUR);
85999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    } catch (Exception e) {
86008a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                        Slog.e(TAG, "Exception creating Blur surface", e);
86019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    }
8602ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                                    if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BLUR "
8603ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                                            + mBlurSurface + ": CREATE");
86049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
86059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (mBlurSurface != null) {
860616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                    if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BLUR "
860716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                            + mBlurSurface + ": pos=(0,0) (" +
860816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                            dw + "x" + dh + "), layer=" + (w.mAnimLayer-1));
86099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    mBlurSurface.setPosition(0, 0);
86109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    mBlurSurface.setSize(dw, dh);
8611de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                    mBlurSurface.setLayer(w.mAnimLayer-LAYER_OFFSET_BLUR);
861216064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                    if (!mBlurShown) {
861316064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                        try {
861416064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                            if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BLUR "
861516064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                                    + mBlurSurface + ": SHOW");
861616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                            mBlurSurface.show();
861716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                        } catch (RuntimeException e) {
861816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                            Slog.w(TAG, "Failure showing blur surface", e);
861916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                        }
862016064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                        mBlurShown = true;
86219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    }
86229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
86239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
86249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
86259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
86269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8627ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
8628e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                if (obscuredChanged && mWallpaperTarget == w) {
8629e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    // This is the wallpaper target and its obscured state
8630e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    // changed... make sure the current wallaper's visibility
8631e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    // has been updated accordingly.
8632e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    updateWallpaperVisibilityLocked();
8633e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                }
86349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8635ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
86360a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima            if (mDimAnimator != null && mDimAnimator.mDimShown) {
8637de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                animating |= mDimAnimator.updateSurface(dimming, currentTime,
8638bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn                        mDisplayFrozen || !mDisplayEnabled || !mPolicy.isScreenOnFully());
86399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
864006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
86419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!blurring && mBlurShown) {
86428a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BLUR " + mBlurSurface
86439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": HIDE");
86449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
86459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mBlurSurface.hide();
86469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IllegalArgumentException e) {
86478a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Illegal argument exception hiding blur surface");
86489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
86499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mBlurShown = false;
86509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
86517916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
86527916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (mBlackFrame != null) {
86537916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                if (mScreenRotationAnimation != null) {
86547916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    mBlackFrame.setMatrix(
86557916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                            mScreenRotationAnimation.getEnterTransformation().getMatrix());
86567916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                } else {
86577916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    mBlackFrame.clearMatrix();
86587916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                }
86597916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
86609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
86618962028b6e2f4176e6ceded281e584d223e44982Dianne Hackborn            Log.wtf(TAG, "Unhandled exception in Window Manager", e);
86629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
86639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
86649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Surface.closeTransaction();
866506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
866636991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn        if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
866736991744a221c30a47085442e6416bdde40b85e8Dianne Hackborn                "<<< CLOSE TRANSACTION performLayoutAndPlaceSurfaces");
866894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn
8669b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        if (mWatermark != null) {
8670b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            mWatermark.drawIfNeeded();
8671b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        }
8672b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn
86738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_ORIENTATION && mDisplayFrozen) Slog.v(TAG,
86749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "With display frozen, orientationChangeComplete="
86759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + orientationChangeComplete);
86769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (orientationChangeComplete) {
86779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mWindowsFreezingScreen) {
86789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindowsFreezingScreen = false;
86799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT);
86809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8681e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            stopFreezingDisplayLocked();
86829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
868306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
86849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        i = mResizingWindows.size();
86859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (i > 0) {
86869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            do {
86879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
86889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState win = mResizingWindows.get(i);
86899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
8690ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    if (DEBUG_RESIZE || DEBUG_ORIENTATION) Slog.v(TAG,
8691ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                            "Reporting new frame to " + win + ": " + win.mCompatFrame);
8692694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    int diff = 0;
8693e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    boolean configChanged =
8694e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                        win.mConfiguration != mCurConfiguration
8695e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                        && (win.mConfiguration == null
8696694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                || (diff=mCurConfiguration.diff(win.mConfiguration)) != 0);
8697694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    if ((DEBUG_RESIZE || DEBUG_ORIENTATION || DEBUG_CONFIGURATION)
8698694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            && configChanged) {
86998a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.i(TAG, "Sending new config to window " + win + ": "
8700b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn                                + win.mSurfaceW + "x" + win.mSurfaceH
8701694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                + " / " + mCurConfiguration + " / 0x"
8702694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                + Integer.toHexString(diff));
8703e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    }
8704694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    win.mConfiguration = mCurConfiguration;
87053ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn                    if (DEBUG_ORIENTATION && win.mDrawPending) Slog.i(
87063ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn                            TAG, "Resizing " + win + " WITH DRAW PENDING");
8707d040edbae968d826aa2c82d382345811a45c646bDianne Hackborn                    win.mClient.resized((int)win.mSurfaceW, (int)win.mSurfaceH,
8708d040edbae968d826aa2c82d382345811a45c646bDianne Hackborn                            win.mLastContentInsets, win.mLastVisibleInsets, win.mDrawPending,
8709e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                            configChanged ? win.mConfiguration : null);
87109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mContentInsetsChanged = false;
87119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mVisibleInsetsChanged = false;
8712ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    win.mSurfaceResized = false;
87139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
87149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mOrientationChanging = false;
87159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
87169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } while (i > 0);
87179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResizingWindows.clear();
87189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
871906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
87209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Destroy the surface of any windows that are no longer visible.
87217341d7a104b47996445d069a695e155a07184606Dianne Hackborn        boolean wallpaperDestroyed = false;
87229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        i = mDestroySurface.size();
87239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (i > 0) {
87249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            do {
87259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
87269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState win = mDestroySurface.get(i);
87279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mDestroying = false;
87289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mInputMethodWindow == win) {
87299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mInputMethodWindow = null;
87309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
87317341d7a104b47996445d069a695e155a07184606Dianne Hackborn                if (win == mWallpaperTarget) {
87327341d7a104b47996445d069a695e155a07184606Dianne Hackborn                    wallpaperDestroyed = true;
87337341d7a104b47996445d069a695e155a07184606Dianne Hackborn                }
87349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.destroySurfaceLocked();
87359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } while (i > 0);
87369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDestroySurface.clear();
87379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
87389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
87399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Time to remove any exiting tokens?
87409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=mExitingTokens.size()-1; i>=0; i--) {
87419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken token = mExitingTokens.get(i);
87429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!token.hasVisible) {
87439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mExitingTokens.remove(i);
87444c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                if (token.windowType == TYPE_WALLPAPER) {
87454c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mWallpaperTokens.remove(token);
87464c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
87479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
87489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
87499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
87509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Time to remove any exiting applications?
87519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=mExitingAppTokens.size()-1; i>=0; i--) {
87529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken token = mExitingAppTokens.get(i);
87539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!token.hasVisible && !mClosingApps.contains(token)) {
87549bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                // Make sure there is no animation running on this token,
87559bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                // so any windows associated with it will be removed as
87569bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                // soon as their animations are complete
87579bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                token.animation = null;
87589bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                token.animating = false;
8759f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG,
8760f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                        "performLayout: App token exiting now removed" + token);
87619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppTokens.remove(token);
87629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mExitingAppTokens.remove(i);
87639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
87649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
87659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8766a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        boolean needRelayout = false;
8767ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
8768a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        if (!animating && mAppTransitionRunning) {
8769a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // We have finished the animation of an app transition.  To do
8770a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // this, we have delayed a lot of operations like showing and
8771a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // hiding apps, moving apps in Z-order, etc.  The app token list
8772a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // reflects the correct Z-order, but the window list may now
8773a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // be out of sync with it.  So here we will just rebuild the
8774a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // entire app window list.  Fun!
8775a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            mAppTransitionRunning = false;
8776a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            needRelayout = true;
8777a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            rebuildAppWindowListLocked();
877816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn            assignLayersLocked();
8779a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // Clear information about apps that were moving.
8780a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            mToBottomApps.clear();
8781a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        }
8782ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
87839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (focusDisplayed) {
87849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendEmptyMessage(H.REPORT_LOSING_FOCUS);
87859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
87867341d7a104b47996445d069a695e155a07184606Dianne Hackborn        if (wallpaperDestroyed) {
87870586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn            needRelayout = adjustWallpaperWindowsLocked() != 0;
87887341d7a104b47996445d069a695e155a07184606Dianne Hackborn        }
8789a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        if (needRelayout) {
87907341d7a104b47996445d069a695e155a07184606Dianne Hackborn            requestAnimationLocked(0);
87917341d7a104b47996445d069a695e155a07184606Dianne Hackborn        } else if (animating) {
8792222357f33a105ce08177b94334c7d14af29df8f6Mathias Agopian            final int refreshTimeUs = (int)(1000 / mDisplay.getRefreshRate());
8793222357f33a105ce08177b94334c7d14af29df8f6Mathias Agopian            requestAnimationLocked(currentTime + refreshTimeUs - SystemClock.uptimeMillis());
87949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8795eb857f12d605659b385d168ef1ea7d4ba5193585Jeff Brown
87963a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        // Finally update all input windows now that the window changes have stabilized.
87972e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown        mInputMonitor.updateInputWindowsLw(true /*force*/);
8798eb857f12d605659b385d168ef1ea7d4ba5193585Jeff Brown
87998e03b7566c42621fda01186b66b019142eb84fbfJeff Brown        setHoldScreenLocked(holdScreen != null);
8800428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn        if (!mDisplayFrozen) {
8801428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            if (screenBrightness < 0 || screenBrightness > 1.0f) {
8802428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                mPowerManager.setScreenBrightnessOverride(-1);
8803428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            } else {
8804428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                mPowerManager.setScreenBrightnessOverride((int)
8805428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        (screenBrightness * Power.BRIGHTNESS_ON));
8806428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            }
8807428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            if (buttonBrightness < 0 || buttonBrightness > 1.0f) {
8808428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                mPowerManager.setButtonBrightnessOverride(-1);
8809428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            } else {
8810428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                mPowerManager.setButtonBrightnessOverride((int)
8811428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        (buttonBrightness * Power.BRIGHTNESS_ON));
8812428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            }
8813fb73f79340375013225618a5d87f46b958f698efMike Lockwood        }
88149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (holdScreen != mHoldingScreenOn) {
88159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHoldingScreenOn = holdScreen;
88169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Message m = mH.obtainMessage(H.HOLD_SCREEN_CHANGED, holdScreen);
88179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendMessage(m);
88189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8819ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
882093e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        if (mTurnOnScreen) {
8821b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn            if (DEBUG_VISIBILITY) Slog.v(TAG, "Turning screen on after layout!");
882293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn            mPowerManager.userActivity(SystemClock.uptimeMillis(), false,
882393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                    LocalPowerManager.BUTTON_EVENT, true);
882493e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn            mTurnOnScreen = false;
882593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        }
8826f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn
882750660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn        if (screenRotationFinished && mScreenRotationAnimation != null) {
882850660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn            mScreenRotationAnimation.kill();
882950660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn            mScreenRotationAnimation = null;
883050660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn        }
883150660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn
883289ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        if (updateRotation) {
883389ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation");
883401a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            boolean changed = updateRotationUncheckedLocked(false);
883589ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            if (changed) {
88363e4f9d0452a2592338c15cf1b6d774761b929a28Dianne Hackborn                mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
8837bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn            } else {
8838bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn                updateRotation = false;
883989ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            }
884089ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        }
884129aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn
8842bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn        if (orientationChangeComplete && !needRelayout && !updateRotation) {
8843bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn            checkDrawnWindowsLocked();
8844bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn        }
884529aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn
8846f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn        // Check to see if we are now in a state where the screen should
8847f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn        // be enabled, because the window obscured flags have changed.
8848f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn        enableScreenIfNeededLocked();
88499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
885029aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn
885138e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn    void checkDrawnWindowsLocked() {
885238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn        if (mWaitingForDrawn.size() > 0) {
885338e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn            for (int j=mWaitingForDrawn.size()-1; j>=0; j--) {
885438e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                Pair<WindowState, IRemoteCallback> pair = mWaitingForDrawn.get(j);
885538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                WindowState win = pair.first;
885638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                //Slog.i(TAG, "Waiting for drawn " + win + ": removed="
885738e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                //        + win.mRemoved + " visible=" + win.isVisibleLw()
885838e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                //        + " shown=" + win.mSurfaceShown);
885938e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                if (win.mRemoved || !win.isVisibleLw()) {
886038e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                    // Window has been removed or made invisible; no draw
886138e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                    // will now happen, so stop waiting.
886238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                    Slog.w(TAG, "Aborted waiting for drawn: " + pair.first);
886338e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                    try {
886438e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                        pair.second.sendResult(null);
886538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                    } catch (RemoteException e) {
886629aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                    }
886738e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                    mWaitingForDrawn.remove(pair);
886838e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                    mH.removeMessages(H.WAITING_FOR_DRAWN_TIMEOUT, pair);
886938e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                } else if (win.mSurfaceShown) {
887038e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                    // Window is now drawn (and shown).
887138e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                    try {
887238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                        pair.second.sendResult(null);
887338e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                    } catch (RemoteException e) {
887429aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                    }
887538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                    mWaitingForDrawn.remove(pair);
887638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                    mH.removeMessages(H.WAITING_FOR_DRAWN_TIMEOUT, pair);
887729aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn                }
887829aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn            }
887929aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn        }
888029aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn    }
888129aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn
888238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn    public void waitForWindowDrawn(IBinder token, IRemoteCallback callback) {
888338e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn        synchronized (mWindowMap) {
888438e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn            WindowState win = windowForClientLocked(null, token, true);
888538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn            if (win != null) {
888638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                Pair<WindowState, IRemoteCallback> pair =
888738e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                        new Pair<WindowState, IRemoteCallback>(win, callback);
888838e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                Message m = mH.obtainMessage(H.WAITING_FOR_DRAWN_TIMEOUT, pair);
888938e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                mH.sendMessageDelayed(m, 2000);
889038e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                mWaitingForDrawn.add(pair);
889138e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                checkDrawnWindowsLocked();
889238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn            }
889338e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn        }
889438e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn    }
889538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn
889646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    /**
889746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     * Must be called with the main window manager lock held.
889846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     */
889946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    void setHoldScreenLocked(boolean holding) {
890046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        boolean state = mHoldingScreenWakeLock.isHeld();
890146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        if (holding != state) {
890246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            if (holding) {
89030601eb7953cbf77d92826bef3ca37e208d922de7Daniel Sandler                mPolicy.screenOnStartedLw();
890446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                mHoldingScreenWakeLock.acquire();
890546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            } else {
890646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                mPolicy.screenOnStoppedLw();
890746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                mHoldingScreenWakeLock.release();
890846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            }
890946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
891046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
89119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
89129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void requestAnimationLocked(long delay) {
89139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mAnimationPending) {
89149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAnimationPending = true;
89159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendMessageDelayed(mH.obtainMessage(H.ANIMATE), delay);
89169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
89179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
891806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
89199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
89209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Have the surface flinger show a surface, robustly dealing with
89219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * error conditions.  In particular, if there is not enough memory
89229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to show the surface, then we will try to get rid of other surfaces
89239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in order to succeed.
892406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     *
89259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the surface was successfully shown.
89269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
89279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean showSurfaceRobustlyLocked(WindowState win) {
89289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
89299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.mSurface != null) {
893016064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                win.mSurfaceShown = true;
89319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mSurface.show();
893293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                if (win.mTurnOnScreen) {
8933b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                    if (DEBUG_VISIBILITY) Slog.v(TAG,
8934b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                            "Show surface turning screen on: " + win);
893593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                    win.mTurnOnScreen = false;
893693e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                    mTurnOnScreen = true;
893793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                }
89389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
89399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
89409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
894194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            Slog.w(TAG, "Failure showing surface " + win.mSurface + " in " + win, e);
89429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
894306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
8944648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        reclaimSomeSurfaceMemoryLocked(win, "show", true);
894506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
89469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
89479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
894806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
8949648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn    boolean reclaimSomeSurfaceMemoryLocked(WindowState win, String operation, boolean secure) {
89509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Surface surface = win.mSurface;
8951648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        boolean leakedSurface = false;
8952648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        boolean killedApps = false;
895306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
8954ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker        EventLog.writeEvent(EventLogTags.WM_NO_SURFACE_MEMORY, win.toString(),
89559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mSession.mPid, operation);
895606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
89579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mForceRemoves == null) {
89589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mForceRemoves = new ArrayList<WindowState>();
89599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
896006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
89619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long callingIdentity = Binder.clearCallingIdentity();
89629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
89639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // There was some problem...   first, do a sanity check of the
89649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // window list to make sure we haven't left any dangling surfaces
89659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // around.
89669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = mWindows.size();
89678a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.i(TAG, "Out of memory for surface!  Looking for leaks...");
89689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
8969e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState ws = mWindows.get(i);
89709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ws.mSurface != null) {
89719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mSessions.contains(ws.mSession)) {
89728a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "LEAKED SURFACE (session doesn't exist): "
89739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ws + " surface=" + ws.mSurface
89749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " token=" + win.mToken
89759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " pid=" + ws.mSession.mPid
89769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " uid=" + ws.mSession.mUid);
897794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        if (SHOW_TRANSACTIONS) logSurface(ws, "LEAK DESTROY", null);
89780586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                        ws.mSurface.destroy();
897916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                        ws.mSurfaceShown = false;
89809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ws.mSurface = null;
89819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mForceRemoves.add(ws);
89829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        i--;
89839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        N--;
89849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        leakedSurface = true;
898594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    } else if (ws.mAppToken != null && ws.mAppToken.clientHidden) {
89868a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "LEAKED SURFACE (app token hidden): "
89879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ws + " surface=" + ws.mSurface
89889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " token=" + win.mAppToken);
898994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        if (SHOW_TRANSACTIONS) logSurface(ws, "LEAK DESTROY", null);
89900586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                        ws.mSurface.destroy();
899116064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                        ws.mSurfaceShown = false;
89929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ws.mSurface = null;
89939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        leakedSurface = true;
89949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
89959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
89969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
899706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
89989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!leakedSurface) {
89998a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "No leaked surfaces; killing applicatons!");
90009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SparseIntArray pidCandidates = new SparseIntArray();
90019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
9002e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    WindowState ws = mWindows.get(i);
90039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ws.mSurface != null) {
90049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pidCandidates.append(ws.mSession.mPid, ws.mSession.mPid);
90059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
90069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
90079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pidCandidates.size() > 0) {
90089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int[] pids = new int[pidCandidates.size()];
90099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i=0; i<pids.length; i++) {
90109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pids[i] = pidCandidates.keyAt(i);
90119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
90129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
9013648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        if (mActivityManager.killPids(pids, "Free memory", secure)) {
90149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            killedApps = true;
90159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
90169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (RemoteException e) {
90179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
90189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
90199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
902006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
90219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (leakedSurface || killedApps) {
90229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We managed to reclaim some memory, so get rid of the trouble
90239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // surface and ask the app to request another one.
90248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Looks like we have reclaimed some memory, clearing surface for retry.");
90259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (surface != null) {
90265fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                    if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) logSurface(win,
90275fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                            "RECOVER DESTROY", null);
90280586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                    surface.destroy();
902916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                    win.mSurfaceShown = false;
90309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mSurface = null;
90319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
903206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
90339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
90349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mClient.dispatchGetNewSurface();
90359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
90369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
90379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
90389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
90399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(callingIdentity);
90409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9041648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn
9042648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        return leakedSurface || killedApps;
90439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
904406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
90453a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown    private boolean updateFocusedWindowLocked(int mode, boolean updateInputWindows) {
90469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState newFocus = computeFocusedWindowLocked();
90479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mCurrentFocus != newFocus) {
90489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // This check makes sure that we don't already have the focus
90499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // change message pending.
90509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.removeMessages(H.REPORT_FOCUS_CHANGE);
90519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendEmptyMessage(H.REPORT_FOCUS_CHANGE);
90528a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (localLOGV) Slog.v(
90539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Changing focus from " + mCurrentFocus + " to " + newFocus);
90549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final WindowState oldFocus = mCurrentFocus;
90559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentFocus = newFocus;
90569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLosingFocus.remove(newFocus);
9057df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            int focusChanged = mPolicy.focusChangedLw(oldFocus, newFocus);
905806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
90599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final WindowState imWindow = mInputMethodWindow;
90609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (newFocus != imWindow && oldFocus != imWindow) {
9061c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                if (moveInputMethodWindowsIfNeededLocked(
90629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mode != UPDATE_FOCUS_WILL_ASSIGN_LAYERS &&
9063c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                        mode != UPDATE_FOCUS_WILL_PLACE_SURFACES)) {
9064c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                    mLayoutNeeded = true;
9065c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                }
90669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mode == UPDATE_FOCUS_PLACING_SURFACES) {
90673a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    performLayoutLockedInner(true /*initial*/, updateInputWindows);
9068df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                    focusChanged &= ~WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
9069c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                } else if (mode == UPDATE_FOCUS_WILL_PLACE_SURFACES) {
9070c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                    // Client will do the layout, but we need to assign layers
9071c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                    // for handleNewWindowLocked() below.
9072c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                    assignLayersLocked();
90739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
90749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9075df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn
9076df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            if ((focusChanged&WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT) != 0) {
9077df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                // The change in focus caused us to need to do a layout.  Okay.
9078df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                mLayoutNeeded = true;
9079df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                if (mode == UPDATE_FOCUS_PLACING_SURFACES) {
9080df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                    performLayoutLockedInner(true /*initial*/, updateInputWindows);
9081df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                }
9082df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            }
9083df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn
9084349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown            if (mode != UPDATE_FOCUS_WILL_ASSIGN_LAYERS) {
9085349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown                // If we defer assigning layers, then the caller is responsible for
9086349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown                // doing this part.
90873a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                finishUpdateFocusedWindowAfterAssignLayersLocked(updateInputWindows);
9088c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            }
90899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
90909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
90919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
90929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9093349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
90943a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown    private void finishUpdateFocusedWindowAfterAssignLayersLocked(boolean updateInputWindows) {
90953a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        mInputMonitor.setInputFocusLw(mCurrentFocus, updateInputWindows);
9096349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    }
90979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
90989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowState computeFocusedWindowLocked() {
90999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState result = null;
91009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState win;
91019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i = mWindows.size() - 1;
91039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int nextAppIndex = mAppTokens.size()-1;
91049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowToken nextApp = nextAppIndex >= 0
91059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ? mAppTokens.get(nextAppIndex) : null;
91069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (i >= 0) {
9108e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            win = mWindows.get(i);
91099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91108a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (localLOGV || DEBUG_FOCUS) Slog.v(
91119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Looking for focus: " + i
91129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " = " + win
91139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", flags=" + win.mAttrs.flags
91149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", canReceive=" + win.canReceiveKeys());
91159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken thisApp = win.mAppToken;
911706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
91189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If this window's application has been removed, just skip it.
91199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (thisApp != null && thisApp.removed) {
91209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
91219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
91229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
912306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
91249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If there is a focused app, don't allow focus to go to any
91259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // windows below it.  If this is an application window, step
91269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // through the app tokens until we find its app.
91279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (thisApp != null && nextApp != null && thisApp != nextApp
91289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && win.mAttrs.type != TYPE_APPLICATION_STARTING) {
91299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int origAppIndex = nextAppIndex;
91309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (nextAppIndex > 0) {
91319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (nextApp == mFocusedApp) {
91329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Whoops, we are below the focused app...  no focus
91339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // for you!
91348a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (localLOGV || DEBUG_FOCUS) Slog.v(
91359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            TAG, "Reached focused app: " + mFocusedApp);
91369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return null;
91379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
91389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    nextAppIndex--;
91399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    nextApp = mAppTokens.get(nextAppIndex);
91409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (nextApp == thisApp) {
91419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
91429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
91439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
91449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (thisApp != nextApp) {
91459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Uh oh, the app token doesn't exist!  This shouldn't
91469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // happen, but if it does we can get totally hosed...
91479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // so restart at the original app.
91489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    nextAppIndex = origAppIndex;
91499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    nextApp = mAppTokens.get(nextAppIndex);
91509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
91519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
91529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Dispatch to this window if it is wants key events.
91549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.canReceiveKeys()) {
91558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_FOCUS) Slog.v(
91569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        TAG, "Found focus @ " + i + " = " + win);
91579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = win;
91589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
91599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
91609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            i--;
91629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
91639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
91659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
91669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
916794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn    private void startFreezingDisplayLocked(boolean inTransaction) {
91689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDisplayFrozen) {
91699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
91709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
917106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
9172bc1aa7bbc753ebcd32da4507fa23215489b6d314Dianne Hackborn        if (mDisplay == null || !mPolicy.isScreenOnFully()) {
91738e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn            // No need to freeze the screen before the system is ready or if
91748e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn            // the screen is off.
91758e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn            return;
91768e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn        }
91778e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn
91789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenFrozenLock.acquire();
917906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
91809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDisplayFrozen = true;
9181349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
918200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        mInputMonitor.freezeInputDispatchingLw();
9183349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
9184bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn        if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
9185bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn            mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET;
91863b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            mNextAppTransitionPackage = null;
91879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAppTransitionReady = true;
91889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
918906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
91909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (PROFILE_ORIENTATION) {
91919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            File file = new File("/data/system/frozen");
91929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Debug.startMethodTracing(file.toString(), 8 * 1024 * 1024);
91939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9194a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn
9195a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn        if (CUSTOM_SCREEN_ROTATION) {
9196f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn            if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) {
9197f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                mScreenRotationAnimation.kill();
9198f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                mScreenRotationAnimation = null;
9199f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn            }
9200a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn            if (mScreenRotationAnimation == null) {
9201f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                mScreenRotationAnimation = new ScreenRotationAnimation(mContext,
9202bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                        mFxSession, inTransaction, mCurDisplayWidth, mCurDisplayHeight,
9203bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                        mDisplay.getRotation());
9204a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn            }
9205de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            if (!mScreenRotationAnimation.hasScreenshot()) {
9206de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                Surface.freezeDisplay(0);
9207de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            }
9208a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn        } else {
9209a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn            Surface.freezeDisplay(0);
9210a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn        }
92119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
921206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
92139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void stopFreezingDisplayLocked() {
92149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mDisplayFrozen) {
92159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
92169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
921706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
9218e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        if (mWaitingForConfig || mAppsFreezingScreen > 0 || mWindowsFreezingScreen) {
9219e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            return;
9220e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        }
9221e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
92229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDisplayFrozen = false;
92239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.removeMessages(H.APP_FREEZE_TIMEOUT);
92249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (PROFILE_ORIENTATION) {
92259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Debug.stopMethodTracing();
92269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9227a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn
922889ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        boolean updateRotation = false;
922989ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn
9230de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn        if (CUSTOM_SCREEN_ROTATION && mScreenRotationAnimation != null
9231de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                && mScreenRotationAnimation.hasScreenshot()) {
92323ec891ae8067dd7afac5c0b5a8af0b726f4a4726Dianne Hackborn            if (DEBUG_ORIENTATION) Slog.i(TAG, "**** Dismissing screen rotation animation");
9233de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            if (mScreenRotationAnimation.dismiss(mFxSession, MAX_ANIMATION_DURATION,
9234bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                    mTransitionAnimationScale, mCurDisplayWidth, mCurDisplayHeight)) {
9235de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                requestAnimationLocked(0);
9236de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            } else {
9237de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                mScreenRotationAnimation = null;
9238de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                updateRotation = true;
9239a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn            }
9240a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn        } else {
9241de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            if (mScreenRotationAnimation != null) {
9242de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                mScreenRotationAnimation.kill();
9243de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                mScreenRotationAnimation = null;
9244de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            }
9245de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            updateRotation = true;
9246a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn        }
9247161dc80ea754d987a905bc5814872168d581040dDianne Hackborn        Surface.unfreezeDisplay(0);
924806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
924900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        mInputMonitor.thawInputDispatchingLw();
92509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9251420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn        boolean configChanged;
9252420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn
9253b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        // While the display is frozen we don't re-compute the orientation
9254b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        // to avoid inconsistent states.  However, something interesting
9255b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        // could have actually changed during that time so re-evaluate it
9256b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        // now to catch that.
9257420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn        configChanged = updateOrientationFromAppTokensLocked(false);
9258b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate
92599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // A little kludge: a lot could have happened while the
92609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // display was frozen, so now that we are coming back we
92619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // do a gc so that any remote references the system
92629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // processes holds on others can be released if they are
92639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // no longer needed.
92649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.removeMessages(H.FORCE_GC);
92659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.sendMessageDelayed(mH.obtainMessage(H.FORCE_GC),
92669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                2000);
926706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
92689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenFrozenLock.release();
926989ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn
927089ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        if (updateRotation) {
927189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation");
927201a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            configChanged |= updateRotationUncheckedLocked(false);
9273420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn        }
9274420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn
9275420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn        if (configChanged) {
9276420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn            mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
927789ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        }
92789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
927906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
9280b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn    static int getPropertyInt(String[] tokens, int index, int defUnits, int defDps,
9281b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            DisplayMetrics dm) {
9282b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        if (index < tokens.length) {
9283b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            String str = tokens[index];
9284b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            if (str != null && str.length() > 0) {
9285b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                try {
9286b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                    int val = Integer.parseInt(str);
9287b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                    return val;
9288b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                } catch (Exception e) {
9289b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                }
9290b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            }
9291fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
9292fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        if (defUnits == TypedValue.COMPLEX_UNIT_PX) {
9293fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn            return defDps;
9294fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
9295fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        int val = (int)TypedValue.applyDimension(defUnits, defDps, dm);
9296fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        return val;
9297fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn    }
9298fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
9299fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn    void createWatermark() {
9300fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        if (mWatermark != null) {
9301fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn            return;
9302fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
9303fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
9304b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        File file = new File("/system/etc/setup.conf");
9305b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        FileInputStream in = null;
9306b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        try {
9307b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            in = new FileInputStream(file);
9308b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            DataInputStream ind = new DataInputStream(in);
9309b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            String line = ind.readLine();
9310b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            if (line != null) {
9311b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                String[] toks = line.split("%");
9312b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                if (toks != null && toks.length > 0) {
9313bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                    mWatermark = new Watermark(mRealDisplayMetrics, mFxSession, toks);
9314b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                }
9315b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            }
9316b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        } catch (FileNotFoundException e) {
9317b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        } catch (IOException e) {
9318b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        } finally {
9319b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            if (in != null) {
9320b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                try {
9321b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                    in.close();
9322b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                } catch (IOException e) {
9323b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                }
9324b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            }
9325fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
9326fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn    }
9327fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
93289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9329664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    public void statusBarVisibilityChanged(int visibility) {
9330df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR)
9331df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                != PackageManager.PERMISSION_GRANTED) {
9332df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            throw new SecurityException("Caller does not hold permission "
9333df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                    + android.Manifest.permission.STATUS_BAR);
9334df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn        }
9335df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn
9336df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn        synchronized (mWindowMap) {
9337df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            mLastStatusBarVisibility = visibility;
9338df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            visibility = mPolicy.adjustSystemUiVisibilityLw(visibility);
9339df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            updateStatusBarVisibilityLocked(visibility);
9340df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn        }
9341df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn    }
9342df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn
9343df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn    void updateStatusBarVisibilityLocked(int visibility) {
934405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown        mInputManager.setSystemUiVisibility(visibility);
9345df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn        final int N = mWindows.size();
9346df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn        for (int i = 0; i < N; i++) {
9347df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            WindowState ws = mWindows.get(i);
9348df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            try {
9349df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                int curValue = ws.mSystemUiVisibility;
9350df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                int diff = curValue ^ visibility;
9351df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                // We are only interested in differences of one of the
9352df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                // clearable flags...
9353df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                diff &= View.SYSTEM_UI_CLEARABLE_FLAGS;
9354df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                // ...if it has actually been cleared.
9355df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                diff &= ~visibility;
9356df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                int newValue = (curValue&~diff) | (visibility&diff);
9357df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                if (newValue != curValue) {
9358df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                    ws.mSeq++;
9359df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                    ws.mSystemUiVisibility = newValue;
9360df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                }
9361df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                if (newValue != curValue || ws.mAttrs.hasSystemUiListeners) {
9362df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                    ws.mClient.dispatchSystemUiVisibilityChanged(ws.mSeq,
9363df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                            visibility, newValue, diff);
9364df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                }
9365df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            } catch (RemoteException e) {
9366df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                // so sorry
9367df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            }
9368df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn        }
9369df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn    }
9370df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn
9371df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn    @Override
9372df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn    public void reevaluateStatusBarVisibility() {
9373df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn        synchronized (mWindowMap) {
9374df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            int visibility = mPolicy.adjustSystemUiVisibilityLw(mLastStatusBarVisibility);
9375df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            updateStatusBarVisibilityLocked(visibility);
9376df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            performLayoutAndPlaceSurfacesLocked();
9377df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn        }
9378df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn    }
93799a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn
9380df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn    @Override
9381df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn    public FakeWindow addFakeWindow(Looper looper, InputHandler inputHandler,
9382df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            String name, int windowType, int layoutParamsFlags, boolean canReceiveKeys,
9383df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            boolean hasFocus, boolean touchFullscreen) {
9384664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        synchronized (mWindowMap) {
9385df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            FakeWindowImpl fw = new FakeWindowImpl(this, looper, inputHandler, name, windowType,
9386df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                    layoutParamsFlags, canReceiveKeys, hasFocus, touchFullscreen);
9387df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            int i=0;
9388df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            while (i<mFakeWindows.size()) {
9389df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                if (mFakeWindows.get(i).mWindowLayer <= fw.mWindowLayer) {
9390df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                    break;
9391664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                }
9392664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            }
9393df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            mFakeWindows.add(i, fw);
9394df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            mInputMonitor.updateInputWindowsLw(true);
9395df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            return fw;
9396df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn        }
9397df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn    }
9398df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn
9399df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn    boolean removeFakeWindowLocked(FakeWindow window) {
9400df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn        synchronized (mWindowMap) {
9401df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            if (mFakeWindows.remove(window)) {
9402df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                mInputMonitor.updateInputWindowsLw(true);
9403df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                return true;
9404df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            }
9405df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            return false;
9406664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        }
9407664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    }
9408664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato
94090c4ccff36930ff4f0292b94ad51e164c9fa060a3Daniel Sandler    @Override
94100c4ccff36930ff4f0292b94ad51e164c9fa060a3Daniel Sandler    public boolean hasNavigationBar() {
94110c4ccff36930ff4f0292b94ad51e164c9fa060a3Daniel Sandler        return mPolicy.hasNavigationBar();
94120c4ccff36930ff4f0292b94ad51e164c9fa060a3Daniel Sandler    }
94130c4ccff36930ff4f0292b94ad51e164c9fa060a3Daniel Sandler
9414a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    void dumpInput(FileDescriptor fd, PrintWriter pw, boolean dumpAll) {
9415a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.println("WINDOW MANAGER INPUT (dumpsys window input)");
941600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        mInputManager.dump(pw);
9417a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    }
9418a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
9419a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    void dumpPolicyLocked(FileDescriptor fd, PrintWriter pw, String[] args, boolean dumpAll) {
9420a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.println("WINDOW MANAGER POLICY STATE (dumpsys window policy)");
9421a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        mPolicy.dump("    ", fd, pw, args);
9422a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    }
9423a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
9424a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    void dumpTokensLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll) {
9425a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.println("WINDOW MANAGER TOKENS (dumpsys window tokens)");
9426a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mTokenMap.size() > 0) {
9427a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  All tokens:");
9428a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            Iterator<WindowToken> it = mTokenMap.values().iterator();
9429a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            while (it.hasNext()) {
9430a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                WindowToken token = it.next();
9431a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print("  Token "); pw.print(token.token);
9432a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (dumpAll) {
9433a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println(':');
9434a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    token.dump(pw, "    ");
9435a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                } else {
9436a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
94379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
94389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9439a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9440a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mWallpaperTokens.size() > 0) {
9441a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
9442a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  Wallpaper tokens:");
9443a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            for (int i=mWallpaperTokens.size()-1; i>=0; i--) {
9444a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                WindowToken token = mWallpaperTokens.get(i);
9445a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print("  Wallpaper #"); pw.print(i);
9446a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.print(' '); pw.print(token);
9447a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (dumpAll) {
9448a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println(':');
9449a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    token.dump(pw, "    ");
9450a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                } else {
9451a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
94529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
94539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9454a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9455a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mAppTokens.size() > 0) {
9456a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
9457a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  Application tokens in Z order:");
9458a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            for (int i=mAppTokens.size()-1; i>=0; i--) {
9459a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print("  App #"); pw.print(i); pw.print(": ");
9460a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.println(mAppTokens.get(i));
94619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9462a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9463a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mFinishedStarting.size() > 0) {
9464a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
9465a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  Finishing start of application tokens:");
9466a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            for (int i=mFinishedStarting.size()-1; i>=0; i--) {
9467a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                WindowToken token = mFinishedStarting.get(i);
9468a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print("  Finished Starting #"); pw.print(i);
9469a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.print(' '); pw.print(token);
9470a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (dumpAll) {
9471a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println(':');
9472a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    token.dump(pw, "    ");
9473a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                } else {
9474a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
94759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
94769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9477a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9478a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mExitingTokens.size() > 0) {
9479a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
9480a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  Exiting tokens:");
9481a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            for (int i=mExitingTokens.size()-1; i>=0; i--) {
9482a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                WindowToken token = mExitingTokens.get(i);
9483a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print("  Exiting #"); pw.print(i);
9484a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.print(' '); pw.print(token);
9485a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (dumpAll) {
9486a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println(':');
9487a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    token.dump(pw, "    ");
9488a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                } else {
9489a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
94909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
94919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9492a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9493a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mExitingAppTokens.size() > 0) {
9494a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
9495a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  Exiting application tokens:");
9496a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            for (int i=mExitingAppTokens.size()-1; i>=0; i--) {
9497a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                WindowToken token = mExitingAppTokens.get(i);
9498a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print("  Exiting App #"); pw.print(i);
9499a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.print(' '); pw.print(token);
9500a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (dumpAll) {
9501a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println(':');
95029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    token.dump(pw, "    ");
9503a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                } else {
9504a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
95059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
95069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9507a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9508a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.println();
9509a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mOpeningApps.size() > 0) {
9510a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print("  mOpeningApps="); pw.println(mOpeningApps);
9511a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9512a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mClosingApps.size() > 0) {
9513a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print("  mClosingApps="); pw.println(mClosingApps);
9514a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9515a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mToTopApps.size() > 0) {
9516a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print("  mToTopApps="); pw.println(mToTopApps);
9517a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9518a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mToBottomApps.size() > 0) {
9519a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print("  mToBottomApps="); pw.println(mToBottomApps);
9520a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9521a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    }
9522a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
9523a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    void dumpSessionsLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll) {
9524a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.println("WINDOW MANAGER SESSIONS (dumpsys window sessions)");
9525a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mSessions.size() > 0) {
9526a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            Iterator<Session> it = mSessions.iterator();
9527a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            while (it.hasNext()) {
9528a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                Session s = it.next();
9529a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print("  Session "); pw.print(s); pw.println(':');
9530a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                s.dump(pw, "    ");
9531a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
9532a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9533a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    }
9534a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
9535a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    void dumpWindowsLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll,
9536a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            ArrayList<WindowState> windows) {
9537a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.println("WINDOW MANAGER WINDOWS (dumpsys window windows)");
9538a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        for (int i=mWindows.size()-1; i>=0; i--) {
9539a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            WindowState w = mWindows.get(i);
9540a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (windows == null || windows.contains(w)) {
9541a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print("  Window #"); pw.print(i); pw.print(' ');
9542a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.print(w); pw.println(":");
95438962028b6e2f4176e6ceded281e584d223e44982Dianne Hackborn                w.dump(pw, "    ", dumpAll || windows != null);
9544a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
9545a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9546a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mInputMethodDialogs.size() > 0) {
9547a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
9548a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  Input method dialogs:");
9549a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            for (int i=mInputMethodDialogs.size()-1; i>=0; i--) {
9550a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                WindowState w = mInputMethodDialogs.get(i);
9551a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (windows == null || windows.contains(w)) {
9552a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print("  IM Dialog #"); pw.print(i); pw.print(": "); pw.println(w);
95534c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
95544c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
9555a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9556a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mPendingRemove.size() > 0) {
9557a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
9558a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  Remove pending for:");
9559a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            for (int i=mPendingRemove.size()-1; i>=0; i--) {
9560a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                WindowState w = mPendingRemove.get(i);
9561a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (windows == null || windows.contains(w)) {
9562a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print("  Remove #"); pw.print(i); pw.print(' ');
9563a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                            pw.print(w);
9564a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    if (dumpAll) {
9565a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.println(":");
9566a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        w.dump(pw, "    ", true);
9567a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    } else {
9568a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.println();
9569a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    }
95709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
95719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9572a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9573a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mForceRemoves != null && mForceRemoves.size() > 0) {
9574a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
9575a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  Windows force removing:");
9576a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            for (int i=mForceRemoves.size()-1; i>=0; i--) {
9577a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                WindowState w = mForceRemoves.get(i);
9578a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print("  Removing #"); pw.print(i); pw.print(' ');
9579a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.print(w);
9580a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (dumpAll) {
9581a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println(":");
9582a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    w.dump(pw, "    ", true);
9583a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                } else {
9584a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println();
95859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
95869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9587a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9588a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mDestroySurface.size() > 0) {
9589a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
9590a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  Windows waiting to destroy their surface:");
9591a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            for (int i=mDestroySurface.size()-1; i>=0; i--) {
9592a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                WindowState w = mDestroySurface.get(i);
9593a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (windows == null || windows.contains(w)) {
9594a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print("  Destroy #"); pw.print(i); pw.print(' ');
9595a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                            pw.print(w);
9596a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    if (dumpAll) {
9597a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.println(":");
9598a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        w.dump(pw, "    ", true);
9599a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    } else {
9600a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.println();
9601a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    }
96029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
96039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9604a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9605a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mLosingFocus.size() > 0) {
9606a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
9607a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  Windows losing focus:");
9608a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            for (int i=mLosingFocus.size()-1; i>=0; i--) {
9609a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                WindowState w = mLosingFocus.get(i);
9610a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (windows == null || windows.contains(w)) {
9611a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print("  Losing #"); pw.print(i); pw.print(' ');
9612a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                            pw.print(w);
9613a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    if (dumpAll) {
9614a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.println(":");
9615a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        w.dump(pw, "    ", true);
9616a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    } else {
9617a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.println();
9618a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    }
9619a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                }
9620a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
9621a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9622a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mResizingWindows.size() > 0) {
9623a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
9624a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  Windows waiting to resize:");
9625a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            for (int i=mResizingWindows.size()-1; i>=0; i--) {
9626a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                WindowState w = mResizingWindows.get(i);
9627a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (windows == null || windows.contains(w)) {
9628a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print("  Resizing #"); pw.print(i); pw.print(' ');
9629a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                            pw.print(w);
9630a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    if (dumpAll) {
9631a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.println(":");
9632a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        w.dump(pw, "    ", true);
9633a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    } else {
9634a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.println();
9635a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    }
96369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
96379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9638a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
963938e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn        if (mWaitingForDrawn.size() > 0) {
964038e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn            pw.println();
964138e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn            pw.println("  Clients waiting for these windows to be drawn:");
964238e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn            for (int i=mWaitingForDrawn.size()-1; i>=0; i--) {
964338e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                Pair<WindowState, IRemoteCallback> pair = mWaitingForDrawn.get(i);
964438e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                pw.print("  Waiting #"); pw.print(i); pw.print(' '); pw.print(pair.first);
964538e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn                        pw.print(": "); pw.println(pair.second);
964638e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn            }
964738e29a61d0c87fe3e391d24e2eb11dd1800d107dDianne Hackborn        }
9648a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.println();
9649a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mDisplay != null) {
9650a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print("  Display: init="); pw.print(mInitialDisplayWidth); pw.print("x");
9651a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(mInitialDisplayHeight); pw.print(" base=");
9652a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(mBaseDisplayWidth); pw.print("x"); pw.print(mBaseDisplayHeight);
9653a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" cur=");
9654a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(mCurDisplayWidth); pw.print("x"); pw.print(mCurDisplayHeight);
9655a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" app=");
9656a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(mAppDisplayWidth); pw.print("x"); pw.print(mAppDisplayHeight);
9657a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" raw="); pw.print(mDisplay.getRawWidth());
9658a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print("x"); pw.println(mDisplay.getRawHeight());
9659a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        } else {
9660a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("  NO DISPLAY");
9661a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9662a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.print("  mCurConfiguration="); pw.println(this.mCurConfiguration);
9663a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.print("  mCurrentFocus="); pw.println(mCurrentFocus);
9664a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mLastFocus != mCurrentFocus) {
96651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mLastFocus="); pw.println(mLastFocus);
9666a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9667a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.print("  mFocusedApp="); pw.println(mFocusedApp);
9668a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mInputMethodTarget != null) {
96691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mInputMethodTarget="); pw.println(mInputMethodTarget);
9670a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9671a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        pw.print("  mInTouchMode="); pw.print(mInTouchMode);
9672a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print(" mLayoutSeq="); pw.println(mLayoutSeq);
9673a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (dumpAll) {
9674df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            if (mLastStatusBarVisibility != 0) {
9675df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                pw.print("  mLastStatusBarVisibility=0x");
9676df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn                        pw.println(Integer.toHexString(mLastStatusBarVisibility));
9677df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn            }
9678a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (mInputMethodWindow != null) {
9679a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print("  mInputMethodWindow="); pw.println(mInputMethodWindow);
9680a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
9681f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            pw.print("  mWallpaperTarget="); pw.println(mWallpaperTarget);
9682284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            if (mLowerWallpaperTarget != null && mUpperWallpaperTarget != null) {
9683284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                pw.print("  mLowerWallpaperTarget="); pw.println(mLowerWallpaperTarget);
9684284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                pw.print("  mUpperWallpaperTarget="); pw.println(mUpperWallpaperTarget);
9685284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            }
96866c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            if (mWindowDetachedWallpaper != null) {
96876c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                pw.print("  mWindowDetachedWallpaper="); pw.println(mWindowDetachedWallpaper);
96886c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            }
9689a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.print("  mLastWallpaperX="); pw.print(mLastWallpaperX);
9690a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.print(" mLastWallpaperY="); pw.println(mLastWallpaperY);
9691a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (mInputMethodAnimLayerAdjustment != 0 ||
9692a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    mWallpaperAnimLayerAdjustment != 0) {
9693a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.print("  mInputMethodAnimLayerAdjustment=");
9694a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.print(mInputMethodAnimLayerAdjustment);
9695a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.print("  mWallpaperAnimLayerAdjustment=");
9696a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        pw.println(mWallpaperAnimLayerAdjustment);
9697a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
9698de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            if (mWindowAnimationBackgroundSurface != null) {
9699de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                pw.println("  mWindowAnimationBackgroundSurface:");
9700de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                mWindowAnimationBackgroundSurface.printTo("    ", pw);
9701de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            }
97021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mSystemBooted="); pw.print(mSystemBooted);
97031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(" mDisplayEnabled="); pw.println(mDisplayEnabled);
97041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mLayoutNeeded="); pw.print(mLayoutNeeded);
97051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(" mBlurShown="); pw.println(mBlurShown);
97060a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima            if (mDimAnimator != null) {
9707de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                pw.println("  mDimAnimator:");
9708de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                mDimAnimator.printTo("    ", pw);
97090a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima            } else {
9710a2e92266b3f768f74ab7fcb42972a22d6c739b39Dianne Hackborn                pw.println( "  no DimAnimator ");
97110a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima            }
97121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mDisplayFrozen="); pw.print(mDisplayFrozen);
97131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(" mWindowsFreezingScreen="); pw.print(mWindowsFreezingScreen);
9714e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    pw.print(" mAppsFreezingScreen="); pw.print(mAppsFreezingScreen);
9715e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    pw.print(" mWaitingForConfig="); pw.println(mWaitingForConfig);
97161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mRotation="); pw.print(mRotation);
9717dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn                    pw.print(" mAltOrientation="); pw.println(mAltOrientation);
9718bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn            pw.print("  mLastWindowForcedOrientation"); pw.print(mLastWindowForcedOrientation);
9719bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                    pw.print(" mForcedAppOrientation="); pw.println(mForcedAppOrientation);
972001a98ddbdfbaf1f0d2bc602537e6e314364902a3Jeff Brown            pw.print("  mDeferredRotationPauseCount="); pw.println(mDeferredRotationPauseCount);
97211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mAnimationPending="); pw.print(mAnimationPending);
97221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(" mWindowAnimationScale="); pw.print(mWindowAnimationScale);
97231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(" mTransitionWindowAnimationScale="); pw.println(mTransitionAnimationScale);
97241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mNextAppTransition=0x");
97251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(Integer.toHexString(mNextAppTransition));
97269d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn                    pw.print(" mAppTransitionReady="); pw.println(mAppTransitionReady);
97279d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn            pw.print("  mAppTransitionRunning="); pw.print(mAppTransitionRunning);
97289d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn                    pw.print(" mAppTransitionTimeout="); pw.println( mAppTransitionTimeout);
97293b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if (mNextAppTransitionPackage != null) {
97303b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                pw.print("  mNextAppTransitionPackage=");
97313b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    pw.print(mNextAppTransitionPackage);
97329d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn                    pw.print(" mNextAppTransitionEnter=0x");
97333b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    pw.print(Integer.toHexString(mNextAppTransitionEnter));
97349d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn                    pw.print(" mNextAppTransitionExit=0x");
97353b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    pw.print(Integer.toHexString(mNextAppTransitionExit));
97363b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            }
97371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mStartingIconInTransition="); pw.print(mStartingIconInTransition);
97381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(", mSkipAppTransitionAnimation="); pw.println(mSkipAppTransitionAnimation);
9739a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9740a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    }
9741a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
9742a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    boolean dumpWindows(FileDescriptor fd, PrintWriter pw, String name, String[] args,
9743a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            int opti, boolean dumpAll) {
9744a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        ArrayList<WindowState> windows = new ArrayList<WindowState>();
9745a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if ("visible".equals(name)) {
9746a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            synchronized(mWindowMap) {
9747a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                for (int i=mWindows.size()-1; i>=0; i--) {
9748a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    WindowState w = mWindows.get(i);
9749a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    if (w.mSurfaceShown) {
9750a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        windows.add(w);
9751a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    }
9752a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                }
97531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
9754a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        } else {
9755a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            int objectId = 0;
9756a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            // See if this is an object ID.
9757a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            try {
9758a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                objectId = Integer.parseInt(name, 16);
9759a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                name = null;
9760a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            } catch (RuntimeException e) {
97611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
9762a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            synchronized(mWindowMap) {
9763a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                for (int i=mWindows.size()-1; i>=0; i--) {
9764a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    WindowState w = mWindows.get(i);
9765a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    if (name != null) {
9766a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        if (w.mAttrs.getTitle().toString().contains(name)) {
9767a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                            windows.add(w);
9768a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        }
9769a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    } else if (System.identityHashCode(w) == objectId) {
9770a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                        windows.add(w);
9771a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    }
9772a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                }
9773a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
9774a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9775a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
9776a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (windows.size() <= 0) {
9777a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            return false;
9778a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9779a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
9780a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        synchronized(mWindowMap) {
9781a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            dumpWindowsLocked(fd, pw, dumpAll, windows);
9782a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9783a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        return true;
9784a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    }
9785a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
9786a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    @Override
9787a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
9788a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (mContext.checkCallingOrSelfPermission("android.permission.DUMP")
9789a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                != PackageManager.PERMISSION_GRANTED) {
9790a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println("Permission Denial: can't dump WindowManager from from pid="
9791a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    + Binder.getCallingPid()
9792a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    + ", uid=" + Binder.getCallingUid());
9793a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            return;
9794a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9795a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
9796a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        boolean dumpAll = false;
9797a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
9798a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        int opti = 0;
9799a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        while (opti < args.length) {
9800a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            String opt = args[opti];
9801a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (opt == null || opt.length() <= 0 || opt.charAt(0) != '-') {
9802a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                break;
9803a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
9804a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            opti++;
9805a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if ("-a".equals(opt)) {
9806a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                dumpAll = true;
9807a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            } else if ("-h".equals(opt)) {
9808a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("Window manager dump options:");
9809a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("  [-a] [-h] [cmd] ...");
9810a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("  cmd may be one of:");
9811a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("    i[input]: input subsystem state");
9812a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("    p[policy]: policy state");
9813a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("    s[essions]: active sessions");
9814a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("    t[okens]: token list");
9815a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("    w[indows]: window list");
9816a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("  cmd may also be a NAME to dump windows.  NAME may");
9817a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("    be a partial substring in a window name, a");
9818a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("    Window hex object identifier, or");
9819a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("    \"all\" for all windows, or");
9820a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("    \"visible\" for the visible windows.");
9821a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("  -a: include all available server state.");
9822a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                return;
982387fc30828209afa25be69ac7053241f4eaeb3378Dianne Hackborn            } else {
9824a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("Unknown argument: " + opt + "; use -h for help");
9825a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
9826a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9827a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
9828a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        // Is the caller requesting to dump a particular piece of data?
9829a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        if (opti < args.length) {
9830a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            String cmd = args[opti];
9831a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            opti++;
9832a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if ("input".equals(cmd) || "i".equals(cmd)) {
9833a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                dumpInput(fd, pw, true);
9834a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                return;
9835a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            } else if ("policy".equals(cmd) || "p".equals(cmd)) {
9836a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                synchronized(mWindowMap) {
9837a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    dumpPolicyLocked(fd, pw, args, true);
9838a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                }
9839a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                return;
9840a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            } else if ("sessions".equals(cmd) || "s".equals(cmd)) {
9841a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                synchronized(mWindowMap) {
9842a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    dumpSessionsLocked(fd, pw, true);
9843a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                }
9844a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                return;
9845a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            } else if ("tokens".equals(cmd) || "t".equals(cmd)) {
9846a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                synchronized(mWindowMap) {
9847a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    dumpTokensLocked(fd, pw, true);
9848a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                }
9849a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                return;
9850a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            } else if ("windows".equals(cmd) || "w".equals(cmd)) {
9851a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                synchronized(mWindowMap) {
9852a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    dumpWindowsLocked(fd, pw, true, null);
9853a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                }
9854a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                return;
9855a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            } else if ("all".equals(cmd) || "a".equals(cmd)) {
9856a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                synchronized(mWindowMap) {
9857a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    dumpWindowsLocked(fd, pw, true, null);
9858a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                }
9859a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                return;
9860a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            } else {
9861a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                // Dumping a single name?
9862a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                if (!dumpWindows(fd, pw, cmd, args, opti, dumpAll)) {
9863a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println("Bad window command, or no windows match: " + cmd);
9864a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                    pw.println("Use -h for help.");
9865a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                }
9866a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                return;
9867a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
9868a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        }
9869a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
9870a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        dumpInput(fd, pw, dumpAll);
9871a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn
9872a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn        synchronized(mWindowMap) {
9873a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (dumpAll) {
9874a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("-------------------------------------------------------------------------------");
9875a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
9876a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            dumpPolicyLocked(fd, pw, args, dumpAll);
9877a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
9878a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (dumpAll) {
9879a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("-------------------------------------------------------------------------------");
9880a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
9881a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            dumpSessionsLocked(fd, pw, dumpAll);
9882a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
9883a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (dumpAll) {
9884a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("-------------------------------------------------------------------------------");
9885a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            }
9886a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            dumpTokensLocked(fd, pw, dumpAll);
9887a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            pw.println();
9888a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            if (dumpAll) {
9889a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn                pw.println("-------------------------------------------------------------------------------");
989087fc30828209afa25be69ac7053241f4eaeb3378Dianne Hackborn            }
9891a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn            dumpWindowsLocked(fd, pw, dumpAll, null);
98929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
98939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
98949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9895349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    // Called by the heartbeat to ensure locks are not held indefnitely (for deadlock detection).
98969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void monitor() {
98979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) { }
9898983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood        synchronized (mKeyguardTokenWatcher) { }
9899ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    }
9900ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
99012992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    public interface OnHardKeyboardStatusChangeListener {
99022992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        public void onHardKeyboardStatusChange(boolean available, boolean enabled);
99032992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
99049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
9905