WindowManagerService.java revision 48a7651823030ed3c0f4c084b423430044425fea
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;
67ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne 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;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.LocalPowerManager;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Looper;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFileDescriptor;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Power;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PowerManager;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
86ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrickimport android.os.StrictMode;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemProperties;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.TokenWatcher;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Settings;
91723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackbornimport android.util.DisplayMetrics;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.EventLog;
93d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Millerimport android.util.Log;
948a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseIntArray;
96fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackbornimport android.util.TypedValue;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Display;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IApplicationToken;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IOnKeyguardExitResult;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IRotationWatcher;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindow;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindowManager;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindowSession;
10446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport android.view.InputChannel;
105c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brownimport android.view.InputDevice;
106bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brownimport android.view.InputEvent;
107a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tateimport android.view.InputHandler;
108a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tateimport android.view.InputQueue;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Surface;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SurfaceSession;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerImpl;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerPolicy;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager.LayoutParams;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Animation;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.AnimationUtils;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Transformation;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.BufferedWriter;
123b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackbornimport java.io.DataInputStream;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
126b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackbornimport java.io.FileInputStream;
127b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackbornimport java.io.FileNotFoundException;
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStream;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStreamWriter;
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.StringWriter;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.Socket;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashSet;
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator;
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List;
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** {@hide} */
141ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackbornpublic class WindowManagerService extends IWindowManager.Stub
14200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        implements Watchdog.Monitor {
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final String TAG = "WindowManager";
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG = false;
145f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn    static final boolean DEBUG_ADD_REMOVE = false;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_FOCUS = false;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_ANIM = false;
1489b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn    static final boolean DEBUG_LAYOUT = false;
149ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn    static final boolean DEBUG_RESIZE = false;
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_LAYERS = false;
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_INPUT = false;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_INPUT_METHOD = false;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_VISIBILITY = false;
154bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn    static final boolean DEBUG_WINDOW_MOVEMENT = false;
155f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn    static final boolean DEBUG_TOKEN_MOVEMENT = false;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_ORIENTATION = false;
157bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn    static final boolean DEBUG_APP_ORIENTATION = false;
158694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn    static final boolean DEBUG_CONFIGURATION = false;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_APP_TRANSITIONS = false;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_STARTING_WINDOW = false;
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_REORDER = false;
1627341d7a104b47996445d069a695e155a07184606Dianne Hackborn    static final boolean DEBUG_WALLPAPER = false;
163994ef9296a00523de1df424b4b760b4416ead58bChristopher Tate    static final boolean DEBUG_DRAG = false;
1645fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    static final boolean SHOW_SURFACE_ALLOC = false;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean SHOW_TRANSACTIONS = false;
1669bfb707597898f54722460b48588007b682f3e2aDianne Hackborn    static final boolean HIDE_STACK_CRAWLS = true;
16753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean PROFILE_ORIENTATION = false;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean BLUR = true;
170cfe6524071624b6679e5fa4db847328e8d0317c8Dave Bort    static final boolean localLOGV = DEBUG;
17106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** How much to multiply the policy's type layer, to reserve room
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for multiple windows of the same type and Z-ordering adjustment
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with TYPE_LAYER_OFFSET. */
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int TYPE_LAYER_MULTIPLIER = 10000;
17606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Offset from TYPE_LAYER_MULTIPLIER for moving a group of windows above
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or below others in the same layer. */
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int TYPE_LAYER_OFFSET = 1000;
18006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** How much to increment the layer for each window, to reserve room
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for effect surfaces between them.
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int WINDOW_LAYER_MULTIPLIER = 5;
18506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
186de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn    /**
187de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn     * Dim surface layer is immediately below target window.
188de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn     */
189de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn    static final int LAYER_OFFSET_DIM = 1;
190de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn
191de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn    /**
192de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn     * Blur surface layer is immediately below dim layer.
193de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn     */
194de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn    static final int LAYER_OFFSET_BLUR = 2;
195de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn
1967916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    /**
1977916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn     * Layer at which to put the rotation freeze snapshot.
1987916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn     */
1997916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    static final int FREEZE_LAYER = (TYPE_LAYER_MULTIPLIER * 200) + 1;
2007916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
2017916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    /**
2027916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn     * Layer at which to put the mask for emulated screen sizes.
2037916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn     */
2047916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    static final int MASK_LAYER = TYPE_LAYER_MULTIPLIER * 200;
2057916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** The maximum length we will accept for a loaded animation duration:
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this is 10 seconds.
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int MAX_ANIMATION_DURATION = 10*1000;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Amount of time (in milliseconds) to animate the dim surface from one
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value to another, when no window animation is driving it.
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int DEFAULT_DIM_DURATION = 200;
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2160a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima    /** Amount of time (in milliseconds) to animate the fade-in-out transition for
2170a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima     * compatible windows.
2180a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima     */
2190a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima    static final int DEFAULT_FADE_IN_OUT_DURATION = 400;
2200a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima
221a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn    /**
222a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * If true, the window manager will do its own custom freezing and general
223a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * management of the screen during rotation.
224a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     */
225a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn    static final boolean CUSTOM_SCREEN_ROTATION = true;
226a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn
2277fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    // Maximum number of milliseconds to wait for input event injection.
2287fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    // FIXME is this value reasonable?
2297fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    private static final int INJECTION_TIMEOUT_MILLIS = 30 * 1000;
230b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown
231b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown    // Maximum number of milliseconds to wait for input devices to be enumerated before
232b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown    // proceding with safe mode detection.
233b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown    private static final int INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS = 1000;
234349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
235349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    // Default input dispatching timeout in nanoseconds.
2366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    static final long DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS = 5000 * 1000000L;
23706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int UPDATE_FOCUS_NORMAL = 0;
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int UPDATE_FOCUS_WILL_ASSIGN_LAYERS = 1;
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int UPDATE_FOCUS_PLACING_SURFACES = 2;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int UPDATE_FOCUS_WILL_PLACE_SURFACES = 3;
24206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String SYSTEM_SECURE = "ro.secure";
24406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy    private static final String SYSTEM_DEBUGGABLE = "ro.debuggable";
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Condition waited on by {@link #reenableKeyguard} to know the call to
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the window policy has finished.
249983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood     * This is set to true only if mKeyguardTokenWatcher.acquired() has
250983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood     * actually disabled the keyguard.
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
252983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood    private boolean mKeyguardDisabled = false;
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
254284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    private static final int ALLOW_DISABLE_YES = 1;
255284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    private static final int ALLOW_DISABLE_NO = 0;
256284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    private static final int ALLOW_DISABLE_UNKNOWN = -1; // check with DevicePolicyManager
257284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    private int mAllowDisableKeyguard = ALLOW_DISABLE_UNKNOWN; // sync'd by mKeyguardTokenWatcher
258284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller
259983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood    final TokenWatcher mKeyguardTokenWatcher = new TokenWatcher(
260983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood            new Handler(), "WindowManagerService.mKeyguardTokenWatcher") {
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void acquired() {
262284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            if (shouldAllowDisableKeyguard()) {
263284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                mPolicy.enableKeyguard(false);
264284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                mKeyguardDisabled = true;
265284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            } else {
266284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                Log.v(TAG, "Not disabling keyguard since device policy is enforced");
267284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            }
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void released() {
270a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn            mPolicy.enableKeyguard(true);
271983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood            synchronized (mKeyguardTokenWatcher) {
272983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood                mKeyguardDisabled = false;
273983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood                mKeyguardTokenWatcher.notifyAll();
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
278284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
279284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        @Override
280284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        public void onReceive(Context context, Intent intent) {
281284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            mPolicy.enableKeyguard(true);
282284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            synchronized(mKeyguardTokenWatcher) {
283284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // lazily evaluate this next time we're asked to disable keyguard
284284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                mAllowDisableKeyguard = ALLOW_DISABLE_UNKNOWN;
285284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                mKeyguardDisabled = false;
286284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            }
287284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        }
288284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    };
289284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Context mContext;
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final boolean mHaveInputMethods;
29306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final boolean mLimitedAlphaCompositing;
29506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final WindowManagerPolicy mPolicy = PolicyManager.makeNewWindowManager();
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final IActivityManager mActivityManager;
29906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final IBatteryStats mBatteryStats;
30106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * All currently active sessions with clients.
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final HashSet<Session> mSessions = new HashSet<Session>();
30606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Mapping from an IWindow IBinder to the server's Window object.
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is also used as the lock for all of our state.
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final HashMap<IBinder, WindowState> mWindowMap = new HashMap<IBinder, WindowState>();
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Mapping from a token IBinder to a WindowToken object.
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final HashMap<IBinder, WindowToken> mTokenMap =
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            new HashMap<IBinder, WindowToken>();
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Window tokens that are in the process of exiting, but still
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on screen for animations.
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<WindowToken> mExitingTokens = new ArrayList<WindowToken>();
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Z-ordered (bottom-most first) list of all application tokens, for
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * controlling the ordering of windows in different applications.  This
328f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn     * contains AppWindowToken objects.
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<AppWindowToken> mAppTokens = new ArrayList<AppWindowToken>();
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Application tokens that are in the process of exiting, but still
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on screen for animations.
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<AppWindowToken> mExitingAppTokens = new ArrayList<AppWindowToken>();
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * List of window tokens that have finished starting their application,
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and now need to have the policy remove their windows.
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<AppWindowToken> mFinishedStarting = new ArrayList<AppWindowToken>();
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Z-ordered (bottom-most first) list of all Window objects.
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
347e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    final ArrayList<WindowState> mWindows = new ArrayList<WindowState>();
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Windows that are being resized.  Used so we can tell the client about
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the resize after closing the transaction in which we resized the
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * underlying surface.
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<WindowState> mResizingWindows = new ArrayList<WindowState>();
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Windows whose animations have ended and now must be removed.
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<WindowState> mPendingRemove = new ArrayList<WindowState>();
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
362f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn     * Used when processing mPendingRemove to avoid working on the original array.
363f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn     */
364f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn    WindowState[] mPendingRemoveTmp = new WindowState[20];
365f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn
366f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn    /**
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Windows whose surface should be destroyed.
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<WindowState> mDestroySurface = new ArrayList<WindowState>();
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Windows that have lost input focus and are waiting for the new
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focus window to be displayed before they are told about this.
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ArrayList<WindowState> mLosingFocus = new ArrayList<WindowState>();
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is set when we have run out of memory, and will either be an empty
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * list or contain windows that need to be force removed.
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ArrayList<WindowState> mForceRemoves;
38206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
383f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn    /**
384f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn     * Used when rebuilding window list to keep track of windows that have
385f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn     * been removed.
386f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn     */
387f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn    WindowState[] mRebuildTmp = new WindowState[20];
388f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    IInputMethodManager mInputMethodManager;
39006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SurfaceSession mFxSession;
3920a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima    private DimAnimator mDimAnimator = null;
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Surface mBlurSurface;
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mBlurShown;
395fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn    Watermark mWatermark;
3966804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    StrictModeFlash mStrictModeFlash;
397a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn    ScreenRotationAnimation mScreenRotationAnimation;
39806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3997916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    BlackFrame mBlackFrame;
4007916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mTransactionSequence = 0;
40206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final float[] mTmpFloats = new float[9];
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mSafeMode;
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mDisplayEnabled = false;
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mSystemBooted = false;
408b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate    int mInitialDisplayWidth = 0;
409b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate    int mInitialDisplayHeight = 0;
4107916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    int mBaseDisplayWidth = 0;
4117916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    int mBaseDisplayHeight = 0;
412ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    int mCurDisplayWidth = 0;
413ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    int mCurDisplayHeight = 0;
41481e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn    int mAppDisplayWidth = 0;
41581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn    int mAppDisplayHeight = 0;
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mRotation = 0;
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mRequestedRotation = 0;
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mForcedAppOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
41968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn    boolean mAltOrientation = false;
420321ae681cad03d00ad1efc6f06f74268e00172a9Dianne Hackborn    int mLastRotationFlags;
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ArrayList<IRotationWatcher> mRotationWatchers
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new ArrayList<IRotationWatcher>();
42389ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn    int mDeferredRotation;
42489ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn    int mDeferredRotationAnimFlags;
42506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mLayoutNeeded = true;
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAnimationPending = false;
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mDisplayFrozen = false;
429e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    boolean mWaitingForConfig = false;
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mWindowsFreezingScreen = false;
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mFreezeGcPending = 0;
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mAppsFreezingScreen = 0;
433bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn    int mLastWindowForcedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
435e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    int mLayoutSeq = 0;
436e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
437b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn    // State while inside of layoutAndPlaceSurfacesLocked().
438b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn    boolean mFocusMayChange;
439b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn
440e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    Configuration mCurConfiguration = new Configuration();
441e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // This is held as long as we have the screen frozen, to give us time to
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // perform a rotation animation when turning off shows the lock screen which
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // changes the orientation.
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PowerManager.WakeLock mScreenFrozenLock;
44606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // State management of app transitions.  When we are preparing for a
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // transition, mNextAppTransition will be the kind of transition to
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // perform or TRANSIT_NONE if we are not waiting.  If we are waiting,
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // mOpeningApps and mClosingApps are the lists of tokens that will be
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // made visible or hidden at the next transition.
452bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn    int mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET;
4533b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    String mNextAppTransitionPackage;
4543b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    int mNextAppTransitionEnter;
4553b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    int mNextAppTransitionExit;
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAppTransitionReady = false;
457a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    boolean mAppTransitionRunning = false;
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAppTransitionTimeout = false;
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mStartingIconInTransition = false;
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mSkipAppTransitionAnimation = false;
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<AppWindowToken> mOpeningApps = new ArrayList<AppWindowToken>();
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<AppWindowToken> mClosingApps = new ArrayList<AppWindowToken>();
463a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    final ArrayList<AppWindowToken> mToTopApps = new ArrayList<AppWindowToken>();
464a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    final ArrayList<AppWindowToken> mToBottomApps = new ArrayList<AppWindowToken>();
46506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Display mDisplay;
46706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4685fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    final DisplayMetrics mDisplayMetrics = new DisplayMetrics();
46948a7651823030ed3c0f4c084b423430044425feaDianne Hackborn    final DisplayMetrics mTmpDisplayMetrics = new DisplayMetrics();
4705fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    final DisplayMetrics mCompatDisplayMetrics = new DisplayMetrics();
4715fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    H mH = new H();
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    WindowState mCurrentFocus = null;
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    WindowState mLastFocus = null;
47606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // This just indicates the window the input method is on top of, not
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // necessarily the window its input is going to.
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    WindowState mInputMethodTarget = null;
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mInputMethodTargetWaitingAnim;
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mInputMethodAnimLayerAdjustment;
48206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    WindowState mInputMethodWindow = null;
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<WindowState> mInputMethodDialogs = new ArrayList<WindowState>();
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4862992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    boolean mHardKeyboardAvailable;
4872992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    boolean mHardKeyboardEnabled;
4882992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    OnHardKeyboardStatusChangeListener mHardKeyboardStatusChangeListener;
4892992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
4904c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    final ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>();
491ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
492759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn    // If non-null, this is the currently visible window that is associated
493759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn    // with the wallpaper.
494759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn    WindowState mWallpaperTarget = null;
4953be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    // If non-null, we are in the middle of animating from one wallpaper target
4963be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    // to another, and this is the lower one in Z-order.
4973be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    WindowState mLowerWallpaperTarget = null;
4983be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    // If non-null, we are in the middle of animating from one wallpaper target
4993be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    // to another, and this is the higher one in Z-order.
5003be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    WindowState mUpperWallpaperTarget = null;
5016c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn    // Window currently running an animation that has requested it be detached
5026c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn    // from the wallpaper.  This means we need to ensure the wallpaper is
5036c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn    // visible behind it in case it animates in a way that would allow it to be
5046c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn    // seen.
5056c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn    WindowState mWindowDetachedWallpaper = null;
506de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn    DimSurface mWindowAnimationBackgroundSurface = null;
507759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn    int mWallpaperAnimLayerAdjustment;
50873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn    float mLastWallpaperX = -1;
50973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn    float mLastWallpaperY = -1;
510bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen    float mLastWallpaperXStep = -1;
511bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen    float mLastWallpaperYStep = -1;
51219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    // This is set when we are waiting for a wallpaper to tell us it is done
51319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    // changing its scroll position.
51419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    WindowState mWaitingOnWallpaper;
51519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    // The last time we had a timeout when waiting for a wallpaper.
51619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    long mLastWallpaperTimeoutTime;
51719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    // We give a wallpaper up to 150ms to finish scrolling.
51819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    static final long WALLPAPER_TIMEOUT = 150;
51919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    // Time we wait after a timeout before trying to wait again.
52019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    static final long WALLPAPER_TIMEOUT_RECOVERY = 10000;
521ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AppWindowToken mFocusedApp = null;
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PowerManagerService mPowerManager;
52506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float mWindowAnimationScale = 1.0f;
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float mTransitionAnimationScale = 1.0f;
52806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
52946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    final InputManager mInputManager;
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Who is holding the screen on.
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Session mHoldingScreenOn;
53346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    PowerManager.WakeLock mHoldingScreenWakeLock;
53406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
53593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    boolean mTurnOnScreen;
536ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
537a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    DragState mDragState = null;
5386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final InputHandler mDragInputHandler = new BaseInputHandler() {
539a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        @Override
5403915bb845b032dc184dba5e60970b803390ca3edJeff Brown        public void handleMotion(MotionEvent event, InputQueue.FinishedCallback finishedCallback) {
5413915bb845b032dc184dba5e60970b803390ca3edJeff Brown            boolean handled = false;
542a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            try {
5433915bb845b032dc184dba5e60970b803390ca3edJeff Brown                if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0
5443915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        && mDragState != null) {
5453915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    boolean endDrag = false;
5463915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    final float newX = event.getRawX();
5473915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    final float newY = event.getRawY();
5483915bb845b032dc184dba5e60970b803390ca3edJeff Brown
549a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    switch (event.getAction()) {
550a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    case MotionEvent.ACTION_DOWN: {
551a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (DEBUG_DRAG) {
552a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                            Slog.w(TAG, "Unexpected ACTION_DOWN in drag layer");
553a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        }
554a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    } break;
555a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
556a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    case MotionEvent.ACTION_MOVE: {
557a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        synchronized (mWindowMap) {
5582c095f367779ef32130c72849936a2e3013c8492Christopher Tate                            // move the surface and tell the involved window(s) where we are
559a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                            mDragState.notifyMoveLw(newX, newY);
560a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        }
561a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    } break;
562a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
563a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    case MotionEvent.ACTION_UP: {
564a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (DEBUG_DRAG) Slog.d(TAG, "Got UP on move channel; dropping at "
565a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                                + newX + "," + newY);
566a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        synchronized (mWindowMap) {
567d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                            endDrag = mDragState.notifyDropLw(newX, newY);
568a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        }
569a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    } break;
570a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
571a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    case MotionEvent.ACTION_CANCEL: {
572a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (DEBUG_DRAG) Slog.d(TAG, "Drag cancelled!");
573a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        endDrag = true;
574a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    } break;
575a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
576a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
577a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    if (endDrag) {
578a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (DEBUG_DRAG) Slog.d(TAG, "Drag ended; tearing down state");
579a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        // tell all the windows that the drag has ended
5805994359f3009a3ebfbd37d82bb9a665e9b947851Chris Tate                        synchronized (mWindowMap) {
581d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                            mDragState.endDragLw();
5825994359f3009a3ebfbd37d82bb9a665e9b947851Chris Tate                        }
583a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
5843915bb845b032dc184dba5e60970b803390ca3edJeff Brown
5853915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    handled = true;
586a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                }
587a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            } catch (Exception e) {
588a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                Slog.e(TAG, "Exception caught by drag handleMotion", e);
589a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            } finally {
5903915bb845b032dc184dba5e60970b803390ca3edJeff Brown                finishedCallback.finished(handled);
591a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            }
592a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        }
593a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    };
594a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
595a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    /**
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Whether the UI is currently running in touch mode (not showing
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * navigational focus because the user is directly pressing the screen).
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mInTouchMode = false;
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ViewServer mViewServer;
602dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    private ArrayList<WindowChangeListener> mWindowChangeListeners =
603dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        new ArrayList<WindowChangeListener>();
604dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    private boolean mWindowsChanged = false;
605dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev
606dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    public interface WindowChangeListener {
607dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        public void windowsChanged();
6086e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        public void focusChanged();
609dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    }
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
611c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn    final Configuration mTempConfiguration = new Configuration();
6121ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
6132f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn    // The desired scaling factor for compatible apps.
614e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    float mCompatibleScreenScale;
6151ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static WindowManagerService main(Context context,
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            PowerManagerService pm, boolean haveInputMethods) {
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WMThread thr = new WMThread(context, pm, haveInputMethods);
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thr.start();
62006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (thr) {
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (thr.mService == null) {
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    thr.wait();
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (InterruptedException e) {
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
62806e57b5d46c87e9dd7bca1386b63b3a8522f51efJozef BABJAK            return thr.mService;
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
63106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class WMThread extends Thread {
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowManagerService mService;
63406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Context mContext;
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final PowerManagerService mPM;
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final boolean mHaveInputMethods;
63806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public WMThread(Context context, PowerManagerService pm,
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean haveInputMethods) {
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super("WindowManager");
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mContext = context;
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPM = pm;
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHaveInputMethods = haveInputMethods;
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
64606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void run() {
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Looper.prepare();
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowManagerService s = new WindowManagerService(mContext, mPM,
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mHaveInputMethods);
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            android.os.Process.setThreadPriority(
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    android.os.Process.THREAD_PRIORITY_DISPLAY);
653160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate            android.os.Process.setCanSelfBackground(false);
65406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mService = s;
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifyAll();
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
65906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
660ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // For debug builds, log event loop stalls to dropbox for analysis.
661ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            if (StrictMode.conditionallyEnableDebugLogging()) {
662ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick                Slog.i(TAG, "Enabled StrictMode logging for WMThread's Looper");
663ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            }
664ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Looper.loop();
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class PolicyThread extends Thread {
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final WindowManagerPolicy mPolicy;
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final WindowManagerService mService;
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Context mContext;
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final PowerManagerService mPM;
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean mRunning = false;
67506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PolicyThread(WindowManagerPolicy policy,
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowManagerService service, Context context,
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PowerManagerService pm) {
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super("WindowManagerPolicy");
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPolicy = policy;
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mService = service;
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mContext = context;
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPM = pm;
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
68506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void run() {
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Looper.prepare();
688ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn            WindowManagerPolicyThread.set(this, Looper.myLooper());
689ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Looper.myLooper().setMessageLogging(new LogPrinter(
6918a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            //        Log.VERBOSE, "WindowManagerPolicy", Log.LOG_ID_SYSTEM));
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            android.os.Process.setThreadPriority(
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    android.os.Process.THREAD_PRIORITY_FOREGROUND);
694160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate            android.os.Process.setCanSelfBackground(false);
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPolicy.init(mContext, mService, mPM);
69606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRunning = true;
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifyAll();
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
70106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
702ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // For debug builds, log event loop stalls to dropbox for analysis.
703ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            if (StrictMode.conditionallyEnableDebugLogging()) {
704ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick                Slog.i(TAG, "Enabled StrictMode for PolicyThread's Looper");
705ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            }
706ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Looper.loop();
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowManagerService(Context context, PowerManagerService pm,
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean haveInputMethods) {
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHaveInputMethods = haveInputMethods;
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLimitedAlphaCompositing = context.getResources().getBoolean(
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.bool.config_sf_limitedAlpha);
71706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPowerManager = pm;
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPowerManager.setPolicy(mPolicy);
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PowerManager pmc = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenFrozenLock = pmc.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SCREEN_FROZEN");
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenFrozenLock.setReferenceCounted(false);
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mActivityManager = ActivityManagerNative.getDefault();
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryStats = BatteryStatsService.getService();
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Get persisted window scale setting
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowAnimationScale = Settings.System.getFloat(context.getContentResolver(),
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Settings.System.WINDOW_ANIMATION_SCALE, mWindowAnimationScale);
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTransitionAnimationScale = Settings.System.getFloat(context.getContentResolver(),
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Settings.System.TRANSITION_ANIMATION_SCALE, mTransitionAnimationScale);
73306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
734284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        // Track changes to DevicePolicyManager state so we can enable/disable keyguard.
735284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        IntentFilter filter = new IntentFilter();
736284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
737284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        mContext.registerReceiver(mBroadcastReceiver, filter);
738284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller
73946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mHoldingScreenWakeLock = pmc.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK,
74046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                "KEEP_SCREEN_ON_FLAG");
74146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mHoldingScreenWakeLock.setReferenceCounted(false);
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
743e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        mInputManager = new InputManager(context, this);
74406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PolicyThread thr = new PolicyThread(mPolicy, this, context, pm);
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thr.start();
74706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (thr) {
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (!thr.mRunning) {
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    thr.wait();
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (InterruptedException e) {
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
75606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
75700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        mInputManager.start();
75806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Add ourself to the Watchdog monitors.
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Watchdog.getInstance().addMonitor(this);
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws RemoteException {
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return super.onTransact(code, data, reply, flags);
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // The window manager only throws security exceptions, so let's
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // log all others.
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!(e instanceof SecurityException)) {
7728a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.e(TAG, "Window Manager Crash", e);
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw e;
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
778e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    private void placeWindowAfter(WindowState pos, WindowState window) {
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int i = mWindows.indexOf(pos);
780f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Adding window " + window + " at "
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + (i+1) + " of " + mWindows.size() + " (after " + pos + ")");
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindows.add(i+1, window);
784dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        mWindowsChanged = true;
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
787e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    private void placeWindowBefore(WindowState pos, WindowState window) {
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int i = mWindows.indexOf(pos);
789f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Adding window " + window + " at "
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + i + " of " + mWindows.size() + " (before " + pos + ")");
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindows.add(i, window);
793dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        mWindowsChanged = true;
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //This method finds out the index of a window that has the same app token as
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //win. used for z ordering the windows in mWindows
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int findIdxBasedOnAppTokens(WindowState win) {
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //use a local variable to cache mWindows
800e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        ArrayList<WindowState> localmWindows = mWindows;
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int jmax = localmWindows.size();
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(jmax == 0) {
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return -1;
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int j = (jmax-1); j >= 0; j--) {
806e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState wentry = localmWindows.get(j);
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(wentry.mAppToken == win.mAppToken) {
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return j;
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
81306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void addWindowToListInOrderLocked(WindowState win, boolean addToToken) {
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final IWindow client = win.mClient;
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final WindowToken token = win.mToken;
817e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        final ArrayList<WindowState> localmWindows = mWindows;
81806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = localmWindows.size();
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final WindowState attached = win.mAttachedWindow;
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i;
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (attached == null) {
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int tokenWindowsPos = token.windows.size();
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token.appWindowToken != null) {
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int index = tokenWindowsPos-1;
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (index >= 0) {
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If this application has existing windows, we
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // simply place the new window on top of them... but
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // keep the starting window on top.
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (win.mAttrs.type == TYPE_BASE_APPLICATION) {
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Base windows go behind everything else.
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        placeWindowBefore(token.windows.get(0), win);
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        tokenWindowsPos = 0;
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        AppWindowToken atoken = win.mAppToken;
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (atoken != null &&
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                token.windows.get(index) == atoken.startingWindow) {
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            placeWindowBefore(token.windows.get(index), win);
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            tokenWindowsPos--;
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int newIdx =  findIdxBasedOnAppTokens(win);
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if(newIdx != -1) {
84306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                                //there is a window above this one associated with the same
84406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                                //apptoken note that the window could be a floating window
84506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                                //that was created later or a window at the top of the list of
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                //windows associated with this token.
847f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) {
848f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                    Slog.v(TAG, "Adding window " + win + " at "
849f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                            + (newIdx+1) + " of " + N);
850f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                }
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                localmWindows.add(newIdx+1, win);
852dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                                mWindowsChanged = true;
85306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                            }
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
8578a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (localLOGV) Slog.v(
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        TAG, "Figuring out where to add app window "
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + client.asBinder() + " (token=" + token + ")");
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Figure out where the window should go, based on the
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // order of applications.
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int NA = mAppTokens.size();
863e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    WindowState pos = null;
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (i=NA-1; i>=0; i--) {
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        AppWindowToken t = mAppTokens.get(i);
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (t == token) {
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            i--;
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            break;
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
870ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
871a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // We haven't reached the token yet; if this token
872a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // is not going to the bottom and has windows, we can
873a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // use it as an anchor for when we do reach the token.
874a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        if (!t.sendingToBottom && t.windows.size() > 0) {
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            pos = t.windows.get(0);
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // We now know the index into the apps.  If we found
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // an app window above, that gives us the position; else
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // we need to look some more.
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (pos != null) {
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Move behind any windows attached to this one.
883e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                        WindowToken atoken = mTokenMap.get(pos.mClient.asBinder());
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (atoken != null) {
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            final int NC = atoken.windows.size();
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (NC > 0) {
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                WindowState bottom = atoken.windows.get(0);
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (bottom.mSubLayer < 0) {
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    pos = bottom;
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        placeWindowBefore(pos, win);
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
895a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // Continue looking down until we find the first
896a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // token that has windows.
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        while (i >= 0) {
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AppWindowToken t = mAppTokens.get(i);
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            final int NW = t.windows.size();
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (NW > 0) {
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pos = t.windows.get(NW-1);
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                break;
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            i--;
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (pos != null) {
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Move in front of any windows attached to this
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // one.
909e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                            WindowToken atoken = mTokenMap.get(pos.mClient.asBinder());
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (atoken != null) {
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                final int NC = atoken.windows.size();
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (NC > 0) {
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    WindowState top = atoken.windows.get(NC-1);
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    if (top.mSubLayer >= 0) {
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        pos = top;
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    }
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            placeWindowAfter(pos, win);
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Just search for the start of this layer.
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            final int myLayer = win.mBaseLayer;
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            for (i=0; i<N; i++) {
924e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                                WindowState w = localmWindows.get(i);
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (w.mBaseLayer > myLayer) {
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    break;
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
929f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) {
930f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                Slog.v(TAG, "Adding window " + win + " at "
931f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                        + i + " of " + N);
932f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            }
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            localmWindows.add(i, win);
934dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                            mWindowsChanged = true;
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Figure out where window should go, based on layer.
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int myLayer = win.mBaseLayer;
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (i=N-1; i>=0; i--) {
942e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    if (localmWindows.get(i).mBaseLayer <= myLayer) {
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        i++;
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (i < 0) i = 0;
948f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(
9499bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                        TAG, "Adding window " + win + " at "
9509bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                        + i + " of " + N);
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                localmWindows.add(i, win);
952dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                mWindowsChanged = true;
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (addToToken) {
955f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token);
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                token.windows.add(tokenWindowsPos, win);
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Figure out this window's ordering relative to the window
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // it is attached to.
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int NA = token.windows.size();
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int sublayer = win.mSubLayer;
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int largestSublayer = Integer.MIN_VALUE;
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowState windowWithLargestSublayer = null;
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (i=0; i<NA; i++) {
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState w = token.windows.get(i);
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int wSublayer = w.mSubLayer;
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wSublayer >= largestSublayer) {
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    largestSublayer = wSublayer;
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    windowWithLargestSublayer = w;
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sublayer < 0) {
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // For negative sublayers, we go below all windows
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // in the same sublayer.
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wSublayer >= sublayer) {
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (addToToken) {
978f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token);
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            token.windows.add(i, win);
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        placeWindowBefore(
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wSublayer >= 0 ? attached : w, win);
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // For positive sublayers, we go above all windows
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // in the same sublayer.
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wSublayer > sublayer) {
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (addToToken) {
990f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token);
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            token.windows.add(i, win);
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        placeWindowBefore(w, win);
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (i >= NA) {
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (addToToken) {
1000f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token);
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    token.windows.add(win);
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sublayer < 0) {
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    placeWindowBefore(attached, win);
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    placeWindowAfter(largestSublayer >= 0
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     ? windowWithLargestSublayer
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     : attached,
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     win);
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
101306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (win.mAppToken != null && addToToken) {
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mAppToken.allAppWindows.add(win);
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
101806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static boolean canBeImeTarget(WindowState w) {
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int fl = w.mAttrs.flags
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                & (FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM);
1022e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn        if (fl == 0 || fl == (FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM)
1023e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                || w.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) {
1024e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn            if (DEBUG_INPUT_METHOD) {
1025e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                Slog.i(TAG, "isVisibleOrAdding " + w + ": " + w.isVisibleOrAdding());
1026e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                if (!w.isVisibleOrAdding()) {
1027e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    Slog.i(TAG, "  mSurface=" + w.mSurface + " reportDestroy=" + w.mReportDestroySurface
1028e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            + " relayoutCalled=" + w.mRelayoutCalled + " viewVis=" + w.mViewVisibility
1029e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            + " policyVis=" + w.mPolicyVisibility + " attachHid=" + w.mAttachedHidden
1030e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            + " exiting=" + w.mExiting + " destroying=" + w.mDestroying);
1031e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    if (w.mAppToken != null) {
1032e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        Slog.i(TAG, "  mAppToken.hiddenRequested=" + w.mAppToken.hiddenRequested);
1033e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    }
1034e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                }
1035e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn            }
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return w.isVisibleOrAdding();
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
104006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int findDesiredInputMethodWindowIndexLocked(boolean willMove) {
1042e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        final ArrayList<WindowState> localmWindows = mWindows;
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = localmWindows.size();
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState w = null;
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i = N;
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (i > 0) {
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            i--;
1048e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            w = localmWindows.get(i);
104906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1050e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn            if (DEBUG_INPUT_METHOD && willMove) Slog.i(TAG, "Checking window @" + i
1051e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    + " " + w + " fl=0x" + Integer.toHexString(w.mAttrs.flags));
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (canBeImeTarget(w)) {
10538a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                //Slog.i(TAG, "Putting input method here!");
105406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Yet more tricksyness!  If this window is a "starting"
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // window, we do actually want to be on top of it, but
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // it is not -really- where input will go.  So if the caller
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // is not actually looking to move the IME, look down below
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // for a real window to target...
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!willMove
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && w.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && i > 0) {
1063e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    WindowState wb = localmWindows.get(i-1);
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wb.mAppToken == w.mAppToken && canBeImeTarget(wb)) {
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        i--;
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w = wb;
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
107206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1073e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn        if (DEBUG_INPUT_METHOD && willMove) Slog.v(TAG, "Proposed new IME target: " + w);
1074e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn
10757eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        // Now, a special case -- if the last target's window is in the
10767eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        // process of exiting, and is above the new target, keep on the
10777eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        // last target to avoid flicker.  Consider for example a Dialog with
10787eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        // the IME shown: when the Dialog is dismissed, we want to keep
10797eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        // the IME above it until it is completely gone so it doesn't drop
10807eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        // behind the dialog or its full-screen scrim.
10817eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        if (mInputMethodTarget != null && w != null
10827eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn                && mInputMethodTarget.isDisplayedLw()
10837eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn                && mInputMethodTarget.mExiting) {
10847eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn            if (mInputMethodTarget.mAnimLayer > w.mAnimLayer) {
10857eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn                w = mInputMethodTarget;
10867eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn                i = localmWindows.indexOf(w);
1087e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Current target higher, switching to: " + w);
10887eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn            }
10897eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        }
109006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
10918a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Desired input method target="
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + w + " willMove=" + willMove);
109306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (willMove && w != null) {
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final WindowState curTarget = mInputMethodTarget;
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (curTarget != null && curTarget.mAppToken != null) {
109706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Now some fun for dealing with window animations that
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // modify the Z order.  We need to look at all windows below
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // the current target that are in this app, finding the highest
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // visible one in layering.
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AppWindowToken token = curTarget.mAppToken;
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState highestTarget = null;
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int highestPos = 0;
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (token.animating || token.animation != null) {
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int pos = 0;
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pos = localmWindows.indexOf(curTarget);
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    while (pos >= 0) {
1109e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                        WindowState win = localmWindows.get(pos);
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (win.mAppToken != token) {
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            break;
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!win.mRemoved) {
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (highestTarget == null || win.mAnimLayer >
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    highestTarget.mAnimLayer) {
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                highestTarget = win;
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                highestPos = pos;
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pos--;
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
112306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (highestTarget != null) {
11258a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_INPUT_METHOD) Slog.v(TAG, "mNextAppTransition="
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mNextAppTransition + " " + highestTarget
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " animating=" + highestTarget.isAnimating()
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " layer=" + highestTarget.mAnimLayer
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " new layer=" + w.mAnimLayer);
113006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1131bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                    if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // If we are currently setting up for an animation,
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // hold everything until we can find out what will happen.
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mInputMethodTargetWaitingAnim = true;
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mInputMethodTarget = highestTarget;
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return highestPos + 1;
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (highestTarget.isAnimating() &&
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            highestTarget.mAnimLayer > w.mAnimLayer) {
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // If the window we are currently targeting is involved
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // with an animation, and it is on top of the next target
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // we will be over, then hold off on moving until
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // that is done.
1143e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        mInputMethodTargetWaitingAnim = true;
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mInputMethodTarget = highestTarget;
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return highestPos + 1;
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
115006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
11518a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //Slog.i(TAG, "Placing input method @" + (i+1));
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (w != null) {
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (willMove) {
1154b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (DEBUG_INPUT_METHOD) {
1155b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    RuntimeException e = null;
1156b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (!HIDE_STACK_CRAWLS) {
1157b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        e = new RuntimeException();
1158b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        e.fillInStackTrace();
1159b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
1160b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    Slog.w(TAG, "Moving IM target from "
1161b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + mInputMethodTarget + " to " + w, e);
1162b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                }
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInputMethodTarget = w;
1164e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                mInputMethodTargetWaitingAnim = false;
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (w.mAppToken != null) {
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    setInputMethodAnimLayerAdjustment(w.mAppToken.animLayerAdjustment);
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    setInputMethodAnimLayerAdjustment(0);
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return i+1;
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (willMove) {
1174b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            if (DEBUG_INPUT_METHOD) {
1175b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                RuntimeException e = null;
1176b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (!HIDE_STACK_CRAWLS) {
1177b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    e = new RuntimeException();
1178b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    e.fillInStackTrace();
1179b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                }
1180b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                Slog.w(TAG, "Moving IM target from "
1181b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + mInputMethodTarget + " to null", e);
1182b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            }
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInputMethodTarget = null;
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setInputMethodAnimLayerAdjustment(0);
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
118806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void addInputMethodWindowToListLocked(WindowState win) {
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = findDesiredInputMethodWindowIndexLocked(true);
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pos >= 0) {
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mTargetAppToken = mInputMethodTarget.mAppToken;
1193f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            if (DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(
11949bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    TAG, "Adding input method window " + win + " at " + pos);
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindows.add(pos, win);
1196dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            mWindowsChanged = true;
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            moveInputMethodDialogsLocked(pos+1);
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        win.mTargetAppToken = null;
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        addWindowToListInOrderLocked(win, true);
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        moveInputMethodDialogsLocked(pos);
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
120406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setInputMethodAnimLayerAdjustment(int adj) {
12068a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_LAYERS) Slog.v(TAG, "Setting im layer adj to " + adj);
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInputMethodAnimLayerAdjustment = adj;
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState imw = mInputMethodWindow;
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (imw != null) {
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            imw.mAnimLayer = imw.mLayer + adj;
12118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + imw
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " anim layer: " + imw.mAnimLayer);
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int wi = imw.mChildWindows.size();
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (wi > 0) {
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wi--;
1216e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState cw = imw.mChildWindows.get(wi);
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cw.mAnimLayer = cw.mLayer + adj;
12188a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + cw
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " anim layer: " + cw.mAnimLayer);
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int di = mInputMethodDialogs.size();
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (di > 0) {
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            di --;
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            imw = mInputMethodDialogs.get(di);
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            imw.mAnimLayer = imw.mLayer + adj;
12278a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + imw
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " anim layer: " + imw.mAnimLayer);
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
123106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int tmpRemoveWindowLocked(int interestingPos, WindowState win) {
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int wpos = mWindows.indexOf(win);
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wpos >= 0) {
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wpos < interestingPos) interestingPos--;
12368a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Temp removing at " + wpos + ": " + win);
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindows.remove(wpos);
1238dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            mWindowsChanged = true;
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NC = win.mChildWindows.size();
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (NC > 0) {
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                NC--;
1242e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState cw = win.mChildWindows.get(NC);
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int cpos = mWindows.indexOf(cw);
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (cpos >= 0) {
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (cpos < interestingPos) interestingPos--;
12468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Temp removing child at "
12479bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                            + cpos + ": " + cw);
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mWindows.remove(cpos);
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return interestingPos;
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
125406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void reAddWindowToListInOrderLocked(WindowState win) {
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        addWindowToListInOrderLocked(win, false);
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // This is a hack to get all of the child windows added as well
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // at the right position.  Child windows should be rare and
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this case should be rare, so it shouldn't be that big a deal.
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int wpos = mWindows.indexOf(win);
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wpos >= 0) {
12628a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "ReAdd removing from " + wpos
12639bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    + ": " + win);
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindows.remove(wpos);
1265dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            mWindowsChanged = true;
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reAddWindowLocked(wpos, win);
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
126906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void logWindowList(String prefix) {
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int N = mWindows.size();
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (N > 0) {
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            N--;
12748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.v(TAG, prefix + "#" + N + ": " + mWindows.get(N));
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
127706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void moveInputMethodDialogsLocked(int pos) {
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ArrayList<WindowState> dialogs = mInputMethodDialogs;
128006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = dialogs.size();
12828a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Removing " + N + " dialogs w/pos=" + pos);
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos = tmpRemoveWindowLocked(pos, dialogs.get(i));
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_INPUT_METHOD) {
12878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.v(TAG, "Window list w/pos=" + pos);
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            logWindowList("  ");
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
129006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pos >= 0) {
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final AppWindowToken targetAppToken = mInputMethodTarget.mAppToken;
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (pos < mWindows.size()) {
1294e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState wp = mWindows.get(pos);
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wp == mInputMethodWindow) {
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pos++;
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12998a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Adding " + N + " dialogs at pos=" + pos);
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState win = dialogs.get(i);
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mTargetAppToken = targetAppToken;
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pos = reAddWindowLocked(pos, win);
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_INPUT_METHOD) {
13068a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.v(TAG, "Final window list:");
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                logWindowList("  ");
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowState win = dialogs.get(i);
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mTargetAppToken = null;
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reAddWindowToListInOrderLocked(win);
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_INPUT_METHOD) {
13168a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.v(TAG, "No IM target, final list:");
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                logWindowList("  ");
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
132106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean moveInputMethodWindowsIfNeededLocked(boolean needAssignLayers) {
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final WindowState imWin = mInputMethodWindow;
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int DN = mInputMethodDialogs.size();
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (imWin == null && DN == 0) {
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
132806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int imPos = findDesiredInputMethodWindowIndexLocked(true);
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (imPos >= 0) {
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // In this case, the input method windows are to be placed
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // immediately above the window they are targeting.
133306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // First check to see if the input method windows are already
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // located here, and contiguous.
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = mWindows.size();
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowState firstImWin = imPos < N
1338e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    ? mWindows.get(imPos) : null;
133906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Figure out the actual input method window that should be
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // at the bottom of their stack.
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowState baseImWin = imWin != null
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? imWin : mInputMethodDialogs.get(0);
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (baseImWin.mChildWindows.size() > 0) {
1345e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState cw = baseImWin.mChildWindows.get(0);
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (cw.mSubLayer < 0) baseImWin = cw;
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
134806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (firstImWin == baseImWin) {
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // The windows haven't moved...  but are they still contiguous?
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // First find the top IM window.
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int pos = imPos+1;
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (pos < N) {
1354e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    if (!(mWindows.get(pos)).mIsImWindow) {
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pos++;
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pos++;
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Now there should be no more input method windows above.
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (pos < N) {
1362e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    if ((mWindows.get(pos)).mIsImWindow) {
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pos++;
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pos >= N) {
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // All is good!
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
137206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imWin != null) {
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_INPUT_METHOD) {
13758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "Moving IM from " + imPos);
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    logWindowList("  ");
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imPos = tmpRemoveWindowLocked(imPos, imWin);
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_INPUT_METHOD) {
13807eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn                    Slog.v(TAG, "List after removing with new pos " + imPos + ":");
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    logWindowList("  ");
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imWin.mTargetAppToken = mInputMethodTarget.mAppToken;
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reAddWindowLocked(imPos, imWin);
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_INPUT_METHOD) {
13868a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "List after moving IM to " + imPos + ":");
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    logWindowList("  ");
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DN > 0) moveInputMethodDialogsLocked(imPos+1);
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                moveInputMethodDialogsLocked(imPos);
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
139306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // In this case, the input method windows go in a fixed layer,
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // because they aren't currently associated with a focus window.
139706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imWin != null) {
13998a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Moving IM from " + imPos);
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                tmpRemoveWindowLocked(0, imWin);
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imWin.mTargetAppToken = null;
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reAddWindowToListInOrderLocked(imWin);
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_INPUT_METHOD) {
14048a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "List with no IM target:");
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    logWindowList("  ");
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DN > 0) moveInputMethodDialogsLocked(-1);;
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                moveInputMethodDialogsLocked(-1);;
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
141106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
141306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (needAssignLayers) {
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assignLayersLocked();
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
141706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
142006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void adjustInputMethodDialogsLocked() {
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        moveInputMethodDialogsLocked(findDesiredInputMethodWindowIndexLocked(true));
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
142406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
142525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn    final boolean isWallpaperVisible(WindowState wallpaperTarget) {
14268a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper vis: target obscured="
142725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                + (wallpaperTarget != null ? Boolean.toString(wallpaperTarget.mObscured) : "??")
142825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                + " anim=" + ((wallpaperTarget != null && wallpaperTarget.mAppToken != null)
142925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        ? wallpaperTarget.mAppToken.animation : null)
143025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                + " upper=" + mUpperWallpaperTarget
143125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                + " lower=" + mLowerWallpaperTarget);
143225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn        return (wallpaperTarget != null
143325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        && (!wallpaperTarget.mObscured || (wallpaperTarget.mAppToken != null
143425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                && wallpaperTarget.mAppToken.animation != null)))
143525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                || mUpperWallpaperTarget != null
143625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                || mLowerWallpaperTarget != null;
143725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn    }
1438ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
14390586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    static final int ADJUST_WALLPAPER_LAYERS_CHANGED = 1<<1;
14400586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    static final int ADJUST_WALLPAPER_VISIBILITY_CHANGED = 1<<2;
1441ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
14420586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    int adjustWallpaperWindowsLocked() {
14430586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn        int changed = 0;
1444ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
144581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        final int dw = mAppDisplayWidth;
144681e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        final int dh = mAppDisplayHeight;
1447ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
14484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // First find top-most window that has asked to be on top of the
14494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // wallpaper; all wallpapers go behind it.
1450e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        final ArrayList<WindowState> localmWindows = mWindows;
14514c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        int N = localmWindows.size();
14524c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        WindowState w = null;
1453f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn        WindowState foundW = null;
1454f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn        int foundI = 0;
14553b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        WindowState topCurW = null;
14563b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        int topCurI = 0;
14576c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn        int windowDetachedI = -1;
14584c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        int i = N;
14594c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        while (i > 0) {
14604c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            i--;
1461e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            w = localmWindows.get(i);
14623b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if ((w.mAttrs.type == WindowManager.LayoutParams.TYPE_WALLPAPER)) {
14633b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                if (topCurW == null) {
14643b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    topCurW = w;
14653b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    topCurI = i;
14663b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                }
14673b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                continue;
14683b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            }
14693b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            topCurW = null;
14706c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            if (w != mWindowDetachedWallpaper && w.mAppToken != null) {
14713be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                // If this window's app token is hidden and not animating,
14723be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                // it is of no interest to us.
14733be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                if (w.mAppToken.hidden && w.mAppToken.animation == null) {
14748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WALLPAPER) Slog.v(TAG,
14756c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                            "Skipping not hidden or animating token: " + w);
14763be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    continue;
1477f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                }
1478f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            }
14798a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WALLPAPER) Slog.v(TAG, "Win " + w + ": readyfordisplay="
14803be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    + w.isReadyForDisplay() + " drawpending=" + w.mDrawPending
14813be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    + " commitdrawpending=" + w.mCommitDrawPending);
14827341d7a104b47996445d069a695e155a07184606Dianne Hackborn            if ((w.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0 && w.isReadyForDisplay()
14836c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                    && (mWallpaperTarget == w
14846c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                            || (!w.mDrawPending && !w.mCommitDrawPending))) {
14858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WALLPAPER) Slog.v(TAG,
14863be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        "Found wallpaper activity: #" + i + "=" + w);
1487f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                foundW = w;
1488f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                foundI = i;
14893b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                if (w == mWallpaperTarget && ((w.mAppToken != null
14903b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        && w.mAppToken.animation != null)
14913b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        || w.mAnimation != null)) {
14923be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    // The current wallpaper target is animating, so we'll
14933be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    // look behind it for another possible target and figure
14943be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    // out what is going on below.
14958a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WALLPAPER) Slog.v(TAG, "Win " + w
14963be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            + ": token animating, looking behind.");
1497f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                    continue;
1498f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                }
14994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                break;
15006c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            } else if (w == mWindowDetachedWallpaper) {
15016c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                windowDetachedI = i;
15024c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
15034c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
15044c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
15056c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn        if (foundW == null && windowDetachedI >= 0) {
15066c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            if (DEBUG_WALLPAPER) Slog.v(TAG,
15076c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                    "Found animating detached wallpaper activity: #" + i + "=" + w);
15086c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            foundW = w;
15096c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            foundI = windowDetachedI;
15106c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn        }
15116c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn
1512bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn        if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
1513f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // If we are currently waiting for an app transition, and either
1514f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // the current target or the next target are involved with it,
1515f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // then hold off on doing anything with the wallpaper.
1516f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // Note that we are checking here for just whether the target
1517f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // is part of an app token...  which is potentially overly aggressive
1518f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // (the app token may not be involved in the transition), but good
1519f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // enough (we'll just wait until whatever transition is pending
1520f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // executes).
1521f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            if (mWallpaperTarget != null && mWallpaperTarget.mAppToken != null) {
15228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WALLPAPER) Slog.v(TAG,
15233be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        "Wallpaper not changing: waiting for app anim in current target");
15240586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                return 0;
1525f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            }
1526f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            if (foundW != null && foundW.mAppToken != null) {
15278a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WALLPAPER) Slog.v(TAG,
15283be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        "Wallpaper not changing: waiting for app anim in found target");
15290586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                return 0;
1530f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            }
15317341d7a104b47996445d069a695e155a07184606Dianne Hackborn        }
1532ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1533f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn        if (mWallpaperTarget != foundW) {
1534f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            if (DEBUG_WALLPAPER) {
15358a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.v(TAG, "New wallpaper target: " + foundW
15363be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        + " oldTarget: " + mWallpaperTarget);
15373be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            }
1538ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
15393be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            mLowerWallpaperTarget = null;
15403be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            mUpperWallpaperTarget = null;
1541ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
15423be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            WindowState oldW = mWallpaperTarget;
15433be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            mWallpaperTarget = foundW;
1544ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
15453be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            // Now what is happening...  if the current and new targets are
15463be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            // animating, then we are in our super special mode!
15473b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if (foundW != null && oldW != null) {
15483b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                boolean oldAnim = oldW.mAnimation != null
15493b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        || (oldW.mAppToken != null && oldW.mAppToken.animation != null);
15503b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                boolean foundAnim = foundW.mAnimation != null
15513b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        || (foundW.mAppToken != null && foundW.mAppToken.animation != null);
15523be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                if (DEBUG_WALLPAPER) {
15538a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "New animation: " + foundAnim
15543b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            + " old animation: " + oldAnim);
15553be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                }
15563b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                if (foundAnim && oldAnim) {
15573be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    int oldI = localmWindows.indexOf(oldW);
15583be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    if (DEBUG_WALLPAPER) {
15598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.v(TAG, "New i: " + foundI + " old i: " + oldI);
15603be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    }
15613be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    if (oldI >= 0) {
15623be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        if (DEBUG_WALLPAPER) {
15638a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            Slog.v(TAG, "Animating wallpapers: old#" + oldI
15643be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                                    + "=" + oldW + "; new#" + foundI
15653be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                                    + "=" + foundW);
15663be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        }
1567ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
15683be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        // Set the new target correctly.
15693b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        if (foundW.mAppToken != null && foundW.mAppToken.hiddenRequested) {
15703be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            if (DEBUG_WALLPAPER) {
15718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.v(TAG, "Old wallpaper still the target.");
15723be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            }
15733be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            mWallpaperTarget = oldW;
15743be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        }
1575ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
15763be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        // Now set the upper and lower wallpaper targets
15773be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        // correctly, and make sure that we are positioning
15783be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        // the wallpaper below the lower.
15793be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        if (foundI > oldI) {
15803be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            // The new target is on top of the old one.
15813be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            if (DEBUG_WALLPAPER) {
15828a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.v(TAG, "Found target above old target.");
15833be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            }
15843be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            mUpperWallpaperTarget = foundW;
15853be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            mLowerWallpaperTarget = oldW;
15863be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            foundW = oldW;
15873be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            foundI = oldI;
15883be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        } else {
15893be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            // The new target is below the old one.
15903be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            if (DEBUG_WALLPAPER) {
15918a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.v(TAG, "Found target below old target.");
15923be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            }
15933be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            mUpperWallpaperTarget = oldW;
15943be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            mLowerWallpaperTarget = foundW;
15953be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        }
15963be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    }
15973be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                }
15983be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            }
1599ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16006b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn        } else if (mLowerWallpaperTarget != null) {
16013be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            // Is it time to stop animating?
16026b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn            boolean lowerAnimating = mLowerWallpaperTarget.mAnimation != null
16036b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn                    || (mLowerWallpaperTarget.mAppToken != null
16046b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn                            && mLowerWallpaperTarget.mAppToken.animation != null);
16056b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn            boolean upperAnimating = mUpperWallpaperTarget.mAnimation != null
16066b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn                    || (mUpperWallpaperTarget.mAppToken != null
16076b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn                            && mUpperWallpaperTarget.mAppToken.animation != null);
16086b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn            if (!lowerAnimating || !upperAnimating) {
16093be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                if (DEBUG_WALLPAPER) {
16108a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "No longer animating wallpaper targets!");
16113be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                }
16123be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                mLowerWallpaperTarget = null;
16133be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                mUpperWallpaperTarget = null;
1614f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            }
1615f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn        }
1616ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1617f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn        boolean visible = foundW != null;
1618759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        if (visible) {
16197341d7a104b47996445d069a695e155a07184606Dianne Hackborn            // The window is visible to the compositor...  but is it visible
16207341d7a104b47996445d069a695e155a07184606Dianne Hackborn            // to the user?  That is what the wallpaper cares about.
162125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn            visible = isWallpaperVisible(foundW);
16228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper visibility: " + visible);
1623ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16247341d7a104b47996445d069a695e155a07184606Dianne Hackborn            // If the wallpaper target is animating, we may need to copy
1625f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // its layer adjustment.  Only do this if we are not transfering
1626f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // between two wallpaper targets.
1627f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            mWallpaperAnimLayerAdjustment =
16283be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    (mLowerWallpaperTarget == null && foundW.mAppToken != null)
1629f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                    ? foundW.mAppToken.animLayerAdjustment : 0;
1630ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16316136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn            final int maxLayer = mPolicy.getMaxWallpaperLayer()
16326136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                    * TYPE_LAYER_MULTIPLIER
16336136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                    + TYPE_LAYER_OFFSET;
1634ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            // Now w is the window we are supposed to be behind...  but we
16364c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            // need to be sure to also be behind any of its attached windows,
16376136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn            // AND any starting window associated with it, AND below the
16386136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn            // maximum layer the policy allows for wallpapers.
1639f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            while (foundI > 0) {
1640e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState wb = localmWindows.get(foundI-1);
16416136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                if (wb.mBaseLayer < maxLayer &&
16426136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                        wb.mAttachedWindow != foundW &&
1643428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        (foundW.mAttachedWindow == null ||
1644428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                                wb.mAttachedWindow != foundW.mAttachedWindow) &&
16454c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                        (wb.mAttrs.type != TYPE_APPLICATION_STARTING ||
1646428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                                foundW.mToken == null || wb.mToken != foundW.mToken)) {
16474c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    // This window is not related to the previous one in any
16484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    // interesting way, so stop here.
16494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    break;
16504c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
1651f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                foundW = wb;
1652f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                foundI--;
16534c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
165425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn        } else {
16558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WALLPAPER) Slog.v(TAG, "No wallpaper target");
16564c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
1657ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16583b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        if (foundW == null && topCurW != null) {
16593b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            // There is no wallpaper target, so it goes at the bottom.
16603b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            // We will assume it is the same place as last time, if known.
16613b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            foundW = topCurW;
16623b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            foundI = topCurI+1;
16633b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        } else {
16643b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            // Okay i is the position immediately above the wallpaper.  Look at
16653b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            // what is below it for later.
1666e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            foundW = foundI > 0 ? localmWindows.get(foundI-1) : null;
16673b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        }
1668ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1669284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        if (visible) {
167073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            if (mWallpaperTarget.mWallpaperX >= 0) {
167173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                mLastWallpaperX = mWallpaperTarget.mWallpaperX;
1672bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                mLastWallpaperXStep = mWallpaperTarget.mWallpaperXStep;
167373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            }
167473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            if (mWallpaperTarget.mWallpaperY >= 0) {
167573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                mLastWallpaperY = mWallpaperTarget.mWallpaperY;
1676bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                mLastWallpaperYStep = mWallpaperTarget.mWallpaperYStep;
167773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            }
1678284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        }
1679ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16804c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // Start stepping backwards from here, ensuring that our wallpaper windows
16814c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // are correctly placed.
16824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        int curTokenIndex = mWallpaperTokens.size();
16834c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        while (curTokenIndex > 0) {
16844c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            curTokenIndex--;
16854c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            WindowToken token = mWallpaperTokens.get(curTokenIndex);
16860586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn            if (token.hidden == visible) {
16870586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                changed |= ADJUST_WALLPAPER_VISIBILITY_CHANGED;
16880586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                token.hidden = !visible;
16890586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                // Need to do a layout to ensure the wallpaper now has the
16900586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                // correct size.
16910586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                mLayoutNeeded = true;
16920586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn            }
1693ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            int curWallpaperIndex = token.windows.size();
16954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            while (curWallpaperIndex > 0) {
16964c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                curWallpaperIndex--;
16974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                WindowState wallpaper = token.windows.get(curWallpaperIndex);
1698ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
169972c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                if (visible) {
170019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    updateWallpaperOffsetLocked(wallpaper, dw, dh, false);
170172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                }
1702ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1703759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                // First, make sure the client has the current visibility
1704759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                // state.
1705759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                if (wallpaper.mWallpaperVisible != visible) {
1706759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    wallpaper.mWallpaperVisible = visible;
1707759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    try {
17088a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_VISIBILITY || DEBUG_WALLPAPER) Slog.v(TAG,
1709759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                                "Setting visibility of wallpaper " + wallpaper
1710759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                                + ": " + visible);
1711759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                        wallpaper.mClient.dispatchAppVisibility(visible);
1712759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    } catch (RemoteException e) {
1713759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    }
1714759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                }
1715ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1716759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                wallpaper.mAnimLayer = wallpaper.mLayer + mWallpaperAnimLayerAdjustment;
17178a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper win "
17187341d7a104b47996445d069a695e155a07184606Dianne Hackborn                        + wallpaper + " anim layer: " + wallpaper.mAnimLayer);
1719ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
17204c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // First, if this window is at the current index, then all
17214c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // is well.
1722f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                if (wallpaper == foundW) {
1723f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                    foundI--;
1724f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                    foundW = foundI > 0
1725e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                            ? localmWindows.get(foundI-1) : null;
17264c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    continue;
17274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
1728ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
17294c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // The window didn't match...  the current wallpaper window,
17304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // wherever it is, is in the wrong place, so make sure it is
17314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // not in the list.
17324c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                int oldIndex = localmWindows.indexOf(wallpaper);
17334c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                if (oldIndex >= 0) {
17348a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Wallpaper removing at "
17359bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                            + oldIndex + ": " + wallpaper);
17364c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    localmWindows.remove(oldIndex);
1737dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                    mWindowsChanged = true;
1738f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                    if (oldIndex < foundI) {
1739f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                        foundI--;
17404c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    }
17414c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
1742ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
17434c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // Now stick it in.
1744f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (DEBUG_WALLPAPER || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) {
1745f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    Slog.v(TAG, "Moving wallpaper " + wallpaper
1746f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            + " from " + oldIndex + " to " + foundI);
1747f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                }
1748ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1749f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                localmWindows.add(foundI, wallpaper);
1750dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                mWindowsChanged = true;
17510586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                changed |= ADJUST_WALLPAPER_LAYERS_CHANGED;
17524c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
17534c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
1754ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
17554c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return changed;
17564c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
17574c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
1758c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn    void setWallpaperAnimLayerAdjustmentLocked(int adj) {
17598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG,
17607341d7a104b47996445d069a695e155a07184606Dianne Hackborn                "Setting wallpaper layer adj to " + adj);
1761759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        mWallpaperAnimLayerAdjustment = adj;
1762759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        int curTokenIndex = mWallpaperTokens.size();
1763759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        while (curTokenIndex > 0) {
1764759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            curTokenIndex--;
1765759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            WindowToken token = mWallpaperTokens.get(curTokenIndex);
1766759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            int curWallpaperIndex = token.windows.size();
1767759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            while (curWallpaperIndex > 0) {
1768759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                curWallpaperIndex--;
1769759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                WindowState wallpaper = token.windows.get(curWallpaperIndex);
1770759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                wallpaper.mAnimLayer = wallpaper.mLayer + adj;
17718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper win "
17727341d7a104b47996445d069a695e155a07184606Dianne Hackborn                        + wallpaper + " anim layer: " + wallpaper.mAnimLayer);
1773759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            }
1774759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        }
1775759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn    }
1776759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn
177719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    boolean updateWallpaperOffsetLocked(WindowState wallpaperWin, int dw, int dh,
177819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            boolean sync) {
177972c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn        boolean changed = false;
17807341d7a104b47996445d069a695e155a07184606Dianne Hackborn        boolean rawChanged = false;
178173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        float wpx = mLastWallpaperX >= 0 ? mLastWallpaperX : 0.5f;
1782bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen        float wpxs = mLastWallpaperXStep >= 0 ? mLastWallpaperXStep : -1.0f;
1783ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn        int availw = wallpaperWin.mFrame.right-wallpaperWin.mFrame.left-dw;
178473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        int offset = availw > 0 ? -(int)(availw*wpx+.5f) : 0;
178573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        changed = wallpaperWin.mXOffset != offset;
178673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        if (changed) {
17878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WALLPAPER) Slog.v(TAG, "Update wallpaper "
178873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                    + wallpaperWin + " x: " + offset);
178973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            wallpaperWin.mXOffset = offset;
179073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        }
1791bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen        if (wallpaperWin.mWallpaperX != wpx || wallpaperWin.mWallpaperXStep != wpxs) {
179273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            wallpaperWin.mWallpaperX = wpx;
1793bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen            wallpaperWin.mWallpaperXStep = wpxs;
179473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            rawChanged = true;
1795c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        }
1796ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
179773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        float wpy = mLastWallpaperY >= 0 ? mLastWallpaperY : 0.5f;
1798bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen        float wpys = mLastWallpaperYStep >= 0 ? mLastWallpaperYStep : -1.0f;
179973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        int availh = wallpaperWin.mFrame.bottom-wallpaperWin.mFrame.top-dh;
180073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        offset = availh > 0 ? -(int)(availh*wpy+.5f) : 0;
180173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        if (wallpaperWin.mYOffset != offset) {
18028a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WALLPAPER) Slog.v(TAG, "Update wallpaper "
180373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                    + wallpaperWin + " y: " + offset);
180473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            changed = true;
180573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            wallpaperWin.mYOffset = offset;
180673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        }
1807bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen        if (wallpaperWin.mWallpaperY != wpy || wallpaperWin.mWallpaperYStep != wpys) {
180873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            wallpaperWin.mWallpaperY = wpy;
1809bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen            wallpaperWin.mWallpaperYStep = wpys;
181073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            rawChanged = true;
181172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn        }
1812ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
18137341d7a104b47996445d069a695e155a07184606Dianne Hackborn        if (rawChanged) {
181472c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn            try {
18158a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WALLPAPER) Slog.v(TAG, "Report new wp offset "
1816e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                        + wallpaperWin + " x=" + wallpaperWin.mWallpaperX
1817e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                        + " y=" + wallpaperWin.mWallpaperY);
181819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                if (sync) {
18197580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    mWaitingOnWallpaper = wallpaperWin;
182019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                }
182172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                wallpaperWin.mClient.dispatchWallpaperOffsets(
1822bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                        wallpaperWin.mWallpaperX, wallpaperWin.mWallpaperY,
1823bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                        wallpaperWin.mWallpaperXStep, wallpaperWin.mWallpaperYStep, sync);
182419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                if (sync) {
18257580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    if (mWaitingOnWallpaper != null) {
18267580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        long start = SystemClock.uptimeMillis();
18277580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        if ((mLastWallpaperTimeoutTime+WALLPAPER_TIMEOUT_RECOVERY)
18287580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                < start) {
18297580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                            try {
18308a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_WALLPAPER) Slog.v(TAG,
18317580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                        "Waiting for offset complete...");
18327580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                mWindowMap.wait(WALLPAPER_TIMEOUT);
18337580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                            } catch (InterruptedException e) {
18347580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                            }
18358a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_WALLPAPER) Slog.v(TAG, "Offset complete!");
18367580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                            if ((start+WALLPAPER_TIMEOUT)
18377580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                    < SystemClock.uptimeMillis()) {
18388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.i(TAG, "Timeout waiting for wallpaper to offset: "
18397580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                        + wallpaperWin);
18407580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                mLastWallpaperTimeoutTime = start;
184119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                            }
184219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                        }
18437580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        mWaitingOnWallpaper = null;
184419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    }
184519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                }
184672c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn            } catch (RemoteException e) {
184772c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn            }
1848c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        }
1849ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1850c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        return changed;
1851c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn    }
1852ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
185319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    void wallpaperOffsetsComplete(IBinder window) {
18547580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        synchronized (mWindowMap) {
185519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            if (mWaitingOnWallpaper != null &&
185619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    mWaitingOnWallpaper.mClient.asBinder() == window) {
185719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                mWaitingOnWallpaper = null;
18587580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                mWindowMap.notifyAll();
185919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            }
186019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn        }
186119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    }
1862ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
186373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn    boolean updateWallpaperOffsetLocked(WindowState changingTarget, boolean sync) {
186481e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        final int dw = mAppDisplayWidth;
186581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        final int dh = mAppDisplayHeight;
1866ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1867c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        boolean changed = false;
1868ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1869c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        WindowState target = mWallpaperTarget;
1870c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        if (target != null) {
187173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            if (target.mWallpaperX >= 0) {
187273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                mLastWallpaperX = target.mWallpaperX;
187373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            } else if (changingTarget.mWallpaperX >= 0) {
187473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                mLastWallpaperX = changingTarget.mWallpaperX;
187573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            }
187673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            if (target.mWallpaperY >= 0) {
187773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                mLastWallpaperY = target.mWallpaperY;
187873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            } else if (changingTarget.mWallpaperY >= 0) {
187973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                mLastWallpaperY = changingTarget.mWallpaperY;
188073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            }
188173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        }
1882ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
188373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        int curTokenIndex = mWallpaperTokens.size();
188473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        while (curTokenIndex > 0) {
188573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            curTokenIndex--;
188673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            WindowToken token = mWallpaperTokens.get(curTokenIndex);
188773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            int curWallpaperIndex = token.windows.size();
188873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            while (curWallpaperIndex > 0) {
188973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                curWallpaperIndex--;
189073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                WindowState wallpaper = token.windows.get(curWallpaperIndex);
189173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                if (updateWallpaperOffsetLocked(wallpaper, dw, dh, sync)) {
189273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                    wallpaper.computeShownFrameLocked();
189373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                    changed = true;
189473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                    // We only want to be synchronous with one wallpaper.
189573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                    sync = false;
1896c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn                }
1897c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn            }
1898c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        }
1899ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1900c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        return changed;
1901c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn    }
1902ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1903e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn    void updateWallpaperVisibilityLocked() {
190425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn        final boolean visible = isWallpaperVisible(mWallpaperTarget);
190581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        final int dw = mAppDisplayWidth;
190681e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        final int dh = mAppDisplayHeight;
1907ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1908e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn        int curTokenIndex = mWallpaperTokens.size();
1909e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn        while (curTokenIndex > 0) {
1910e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            curTokenIndex--;
1911e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            WindowToken token = mWallpaperTokens.get(curTokenIndex);
19120586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn            if (token.hidden == visible) {
19130586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                token.hidden = !visible;
19140586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                // Need to do a layout to ensure the wallpaper now has the
19150586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                // correct size.
19160586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                mLayoutNeeded = true;
19170586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn            }
1918ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1919e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            int curWallpaperIndex = token.windows.size();
1920e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            while (curWallpaperIndex > 0) {
1921e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                curWallpaperIndex--;
1922e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                WindowState wallpaper = token.windows.get(curWallpaperIndex);
1923e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                if (visible) {
192419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    updateWallpaperOffsetLocked(wallpaper, dw, dh, false);
1925e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                }
1926ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1927e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                if (wallpaper.mWallpaperVisible != visible) {
1928e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    wallpaper.mWallpaperVisible = visible;
1929e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    try {
19308a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_VISIBILITY || DEBUG_WALLPAPER) Slog.v(TAG,
193125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                "Updating visibility of wallpaper " + wallpaper
1932e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                                + ": " + visible);
1933e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                        wallpaper.mClient.dispatchAppVisibility(visible);
1934e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    } catch (RemoteException e) {
1935e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    }
1936e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                }
1937e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            }
1938e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn        }
1939e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn    }
194090d2db3d21d07c2a4b4cbbc558f5ec59d20098c3Dianne Hackborn
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int addWindow(Session session, IWindow client,
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowManager.LayoutParams attrs, int viewVisibility,
194346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            Rect outContentInsets, InputChannel outInputChannel) {
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int res = mPolicy.checkAddPermission(attrs);
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (res != WindowManagerImpl.ADD_OKAY) {
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return res;
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
194806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean reportNewConfig = false;
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState attachedWindow = null;
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState win = null;
19525132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn        long origId;
195306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDisplay == null) {
19565132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn                throw new IllegalStateException("Display has not been initialialized");
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
195806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mWindowMap.containsKey(client.asBinder())) {
19608a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Window " + client + " is already added");
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return WindowManagerImpl.ADD_DUPLICATE_ADD;
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (attrs.type >= FIRST_SUB_WINDOW && attrs.type <= LAST_SUB_WINDOW) {
1965e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                attachedWindow = windowForClientLocked(null, attrs.token, false);
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attachedWindow == null) {
19678a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add window with token that is not a window: "
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          + attrs.token + ".  Aborting.");
19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN;
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attachedWindow.mAttrs.type >= FIRST_SUB_WINDOW
19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && attachedWindow.mAttrs.type <= LAST_SUB_WINDOW) {
19738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add window with token that is a sub-window: "
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + attrs.token + ".  Aborting.");
19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN;
19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean addToken = false;
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken token = mTokenMap.get(attrs.token);
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token == null) {
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attrs.type >= FIRST_APPLICATION_WINDOW
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && attrs.type <= LAST_APPLICATION_WINDOW) {
19848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add application window with unknown token "
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          + attrs.token + ".  Aborting.");
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_BAD_APP_TOKEN;
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attrs.type == TYPE_INPUT_METHOD) {
19898a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add input method window with unknown token "
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          + attrs.token + ".  Aborting.");
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_BAD_APP_TOKEN;
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19934c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                if (attrs.type == TYPE_WALLPAPER) {
19948a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add wallpaper window with unknown token "
19954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                          + attrs.token + ".  Aborting.");
19964c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    return WindowManagerImpl.ADD_BAD_APP_TOKEN;
19974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
19986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                token = new WindowToken(this, attrs.token, -1, false);
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                addToken = true;
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (attrs.type >= FIRST_APPLICATION_WINDOW
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && attrs.type <= LAST_APPLICATION_WINDOW) {
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AppWindowToken atoken = token.appWindowToken;
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (atoken == null) {
20048a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add window with non-application token "
20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          + token + ".  Aborting.");
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_NOT_APP_TOKEN;
20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (atoken.removed) {
20088a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add window with exiting application token "
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          + token + ".  Aborting.");
20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_APP_EXITING;
20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attrs.type == TYPE_APPLICATION_STARTING && atoken.firstWindowDrawn) {
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // No need for this guy!
20148a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (localLOGV) Slog.v(
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            TAG, "**** NO NEED TO START: " + attrs.getTitle());
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_STARTING_NOT_NEEDED;
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (attrs.type == TYPE_INPUT_METHOD) {
20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (token.windowType != TYPE_INPUT_METHOD) {
20208a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add input method window with bad token "
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + attrs.token + ".  Aborting.");
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      return WindowManagerImpl.ADD_BAD_APP_TOKEN;
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20244c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            } else if (attrs.type == TYPE_WALLPAPER) {
20254c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                if (token.windowType != TYPE_WALLPAPER) {
20268a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add wallpaper window with bad token "
20274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                            + attrs.token + ".  Aborting.");
20284c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                      return WindowManagerImpl.ADD_BAD_APP_TOKEN;
20294c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            win = new WindowState(this, session, client, token,
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    attachedWindow, attrs, viewVisibility);
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.mDeathRecipient == null) {
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Client has apparently died, so there is no reason to
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // continue.
20378a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Adding window client " + client.asBinder()
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " that is dead, aborting.");
20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return WindowManagerImpl.ADD_APP_EXITING;
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPolicy.adjustWindowParamsLw(win.mAttrs);
204306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            res = mPolicy.prepareAddWindowLw(win, attrs);
20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res != WindowManagerImpl.ADD_OKAY) {
20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return res;
20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
204846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
204900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            if (outInputChannel != null) {
205000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                String name = win.makeInputChannelName();
205100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                InputChannel[] inputChannels = InputChannel.openInputChannelPair(name);
205200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                win.mInputChannel = inputChannels[0];
205300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                inputChannels[1].transferToBinderOutParameter(outInputChannel);
205400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown
2055928e054931d357326613c78e62f4d850b7c442ffJeff Brown                mInputManager.registerInputChannel(win.mInputChannel, win.mInputWindowHandle);
205646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            }
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // From now on, no exceptions or errors allowed!
20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            res = WindowManagerImpl.ADD_OKAY;
206106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20625132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            origId = Binder.clearCallingIdentity();
206306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (addToken) {
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTokenMap.put(attrs.token, token);
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.attach();
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowMap.put(client.asBinder(), win);
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (attrs.type == TYPE_APPLICATION_STARTING &&
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    token.appWindowToken != null) {
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                token.appWindowToken.startingWindow = win;
20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean imMayMove = true;
207606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (attrs.type == TYPE_INPUT_METHOD) {
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInputMethodWindow = win;
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                addInputMethodWindowToListLocked(win);
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imMayMove = false;
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (attrs.type == TYPE_INPUT_METHOD_DIALOG) {
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInputMethodDialogs.add(win);
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                addWindowToListInOrderLocked(win, true);
20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                adjustInputMethodDialogsLocked();
20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imMayMove = false;
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                addWindowToListInOrderLocked(win, true);
208819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                if (attrs.type == TYPE_WALLPAPER) {
208919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    mLastWallpaperTimeoutTime = 0;
209019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    adjustWallpaperWindowsLocked();
209119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                } else if ((attrs.flags&FLAG_SHOW_WALLPAPER) != 0) {
20924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    adjustWallpaperWindowsLocked();
20934c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
209506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mEnterAnimationPending = true;
209706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPolicy.getContentInsetHintLw(attrs, outContentInsets);
209906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mInTouchMode) {
21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                res |= WindowManagerImpl.ADD_FLAG_IN_TOUCH_MODE;
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win == null || win.mAppToken == null || !win.mAppToken.clientHidden) {
21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                res |= WindowManagerImpl.ADD_FLAG_APP_VISIBLE;
21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
210606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21072e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown            mInputMonitor.setUpdateInputWindowsNeededLw();
21082e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown
2109c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            boolean focusChanged = false;
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.canReceiveKeys()) {
21113a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                focusChanged = updateFocusedWindowLocked(UPDATE_FOCUS_WILL_ASSIGN_LAYERS,
21123a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        false /*updateInputWindows*/);
2113349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown                if (focusChanged) {
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    imMayMove = false;
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
211706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imMayMove) {
211906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                moveInputMethodWindowsIfNeededLocked(false);
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
212106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assignLayersLocked();
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Don't do layout here, the window must call
21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // relayout to be displayed, so we'll do it there.
212506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //dump();
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2128c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            if (focusChanged) {
21293a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                finishUpdateFocusedWindowAfterAssignLayersLocked(false /*updateInputWindows*/);
2130c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            }
21312e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown            mInputMonitor.updateInputWindowsLw(false /*force*/);
21323a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown
21338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (localLOGV) Slog.v(
21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "New client " + client.asBinder()
21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ": window=" + win);
2136e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
213794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            if (win.isVisibleOrAdding() && updateOrientationFromAppTokensLocked(false)) {
2138e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                reportNewConfig = true;
2139e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (reportNewConfig) {
21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendNewConfiguration();
21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21455132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn
21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
214706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return res;
21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
215006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeWindow(Session session, IWindow client) {
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
2153e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            WindowState win = windowForClientLocked(session, client, false);
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win == null) {
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            removeWindowLocked(session, win);
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
216006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeWindowLocked(Session session, WindowState win) {
21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21638a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (localLOGV || DEBUG_FOCUS) Slog.v(
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Remove " + win + " client="
21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + Integer.toHexString(System.identityHashCode(
21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mClient.asBinder()))
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + ", surface=" + win.mSurface);
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long origId = Binder.clearCallingIdentity();
2170c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
2171c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        win.disposeInputChannel();
217206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_APP_TRANSITIONS) Slog.v(
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Remove " + win + ": mSurface=" + win.mSurface
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " mExiting=" + win.mExiting
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " isAnimating=" + win.isAnimating()
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " app-animation="
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + (win.mAppToken != null ? win.mAppToken.animation : null)
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " inPendingTransaction="
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + (win.mAppToken != null ? win.mAppToken.inPendingTransaction : false)
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " mDisplayFrozen=" + mDisplayFrozen);
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Visibility of the removed window. Will be used later to update orientation later on.
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean wasVisible = false;
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // First, see if we need to run an animation.  If we do, we have
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // to hold off on removing the window until the animation is done.
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // If the display is frozen, just remove immediately, since the
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // animation wouldn't be seen.
2188de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn        if (win.mSurface != null && !mDisplayFrozen && mPolicy.isScreenOn()) {
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If we are not currently running the exit animation, we
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // need to see about starting one.
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wasVisible=win.isWinVisibleLw()) {
219206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int transit = WindowManagerPolicy.TRANSIT_EXIT;
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.getAttrs().type == TYPE_APPLICATION_STARTING) {
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    transit = WindowManagerPolicy.TRANSIT_PREVIEW_DONE;
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Try starting an animation.
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (applyAnimationLocked(win, transit, false)) {
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mExiting = true;
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.mExiting || win.isAnimating()) {
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // The exit animation is running... wait for it!
22048a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                //Slog.i(TAG, "*** Running exit animation...");
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mExiting = true;
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mRemoveOnExit = true;
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutNeeded = true;
22083a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
22093a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        false /*updateInputWindows*/);
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                performLayoutAndPlaceSurfacesLocked();
22112e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                mInputMonitor.updateInputWindowsLw(false /*force*/);
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.mAppToken != null) {
22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mAppToken.updateReportedVisibilityLocked();
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //dump();
22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.restoreCallingIdentity(origId);
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        removeWindowInnerLocked(session, win);
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Removing a visible window will effect the computed orientation
22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // So just update orientation if needed.
2224c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        if (wasVisible && computeForcedAppOrientationLocked()
2225e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                != mForcedAppOrientation
222694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                && updateOrientationFromAppTokensLocked(false)) {
2227e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22293a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/);
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
223206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void removeWindowInnerLocked(Session session, WindowState win) {
2234f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        if (win.mRemoved) {
2235f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            // Nothing to do.
2236f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            return;
2237f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        }
2238f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn
2239f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        for (int i=win.mChildWindows.size()-1; i>=0; i--) {
2240f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            WindowState cwin = win.mChildWindows.get(i);
2241f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            Slog.w(TAG, "Force-removing child win " + cwin + " from container "
2242f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    + win);
2243f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            removeWindowInnerLocked(cwin.mSession, cwin);
2244f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        }
2245f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        win.mRemoved = true;
224706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mInputMethodTarget == win) {
22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            moveInputMethodWindowsIfNeededLocked(false);
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
225106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
2252bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        if (false) {
2253bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn            RuntimeException e = new RuntimeException("here");
2254bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn            e.fillInStackTrace();
22558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Removing window " + win, e);
2256bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        }
2257ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPolicy.removeWindowLw(win);
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        win.removeLocked();
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2261f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        if (DEBUG_ADD_REMOVE) Slog.v(TAG, "removeWindowInnerLocked: " + win);
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowMap.remove(win.mClient.asBinder());
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindows.remove(win);
2264f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        mPendingRemove.remove(win);
2265dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        mWindowsChanged = true;
22668a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Final remove of window: " + win);
22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mInputMethodWindow == win) {
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInputMethodWindow = null;
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (win.mAttrs.type == TYPE_INPUT_METHOD_DIALOG) {
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInputMethodDialogs.remove(win);
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
227306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final WindowToken token = win.mToken;
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final AppWindowToken atoken = win.mAppToken;
2276f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Removing " + win + " from " + token);
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        token.windows.remove(win);
22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (atoken != null) {
22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            atoken.allAppWindows.remove(win);
22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22818a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (localLOGV) Slog.v(
22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "**** Removing window " + win + ": count="
22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + token.windows.size());
22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (token.windows.size() == 0) {
22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!token.explicit) {
22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTokenMap.remove(token.token);
22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (atoken != null) {
22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                atoken.firstWindowDrawn = false;
22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (atoken != null) {
22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (atoken.startingWindow == win) {
22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                atoken.startingWindow = null;
22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (atoken.allAppWindows.size() == 0 && atoken.startingData != null) {
22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this is the last window and we had requested a starting
22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // transition window, well there is no point now.
22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                atoken.startingData = null;
22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (atoken.allAppWindows.size() == 1 && atoken.startingView != null) {
23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this is the last window except for a starting transition
23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // window, we need to get rid of the starting transition.
23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_STARTING_WINDOW) {
23038a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "Schedule remove starting " + token
23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + ": no more real windows");
23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Message m = mH.obtainMessage(H.REMOVE_STARTING, atoken);
23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mH.sendMessage(m);
23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
231006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
231119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn        if (win.mAttrs.type == TYPE_WALLPAPER) {
231219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            mLastWallpaperTimeoutTime = 0;
231319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            adjustWallpaperWindowsLocked();
231419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn        } else if ((win.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0) {
2315e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            adjustWallpaperWindowsLocked();
2316e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn        }
2317ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mInLayout) {
23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assignLayersLocked();
23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLayoutNeeded = true;
23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            performLayoutAndPlaceSurfacesLocked();
23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.mAppToken != null) {
23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mAppToken.updateReportedVisibilityLocked();
23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2326c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
23272e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown        mInputMonitor.updateInputWindowsLw(true /*force*/);
23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    static void logSurface(WindowState w, String msg, RuntimeException where) {
2331b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        String str = "  SURFACE " + Integer.toHexString(w.hashCode())
2332b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                + ": " + msg + " / " + w.mAttrs.getTitle();
2333b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        if (where != null) {
2334b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            Slog.i(TAG, str, where);
2335b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        } else {
2336b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            Slog.i(TAG, str);
2337b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        }
2338b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn    }
2339b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
23406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void setTransparentRegionWindow(Session session, IWindow client, Region region) {
23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long origId = Binder.clearCallingIdentity();
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mWindowMap) {
2344e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                WindowState w = windowForClientLocked(session, client, false);
23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((w != null) && (w.mSurface != null)) {
234694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    if (SHOW_TRANSACTIONS) Slog.i(TAG,
234794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                            ">>> OPEN TRANSACTION setTransparentRegion");
23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Surface.openTransaction();
23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
2350b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        if (SHOW_TRANSACTIONS) logSurface(w,
2351b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                "transparentRegionHint=" + region, null);
23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mSurface.setTransparentRegionHint(region);
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } finally {
23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Surface.closeTransaction();
235594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        if (SHOW_TRANSACTIONS) Slog.i(TAG,
235694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                                "<<< CLOSE TRANSACTION setTransparentRegion");
23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(origId);
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setInsetsWindow(Session session, IWindow client,
236606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy            int touchableInsets, Rect contentInsets,
2367fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            Rect visibleInsets, Region touchableRegion) {
23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long origId = Binder.clearCallingIdentity();
23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mWindowMap) {
2371e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                WindowState w = windowForClientLocked(session, client, false);
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (w != null) {
23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mGivenInsetsPending = false;
23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mGivenContentInsets.set(contentInsets);
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mGivenVisibleInsets.set(visibleInsets);
2376fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    w.mGivenTouchableRegion.set(touchableRegion);
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mTouchableInsets = touchableInsets;
2378ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                    if (w.mGlobalScale != 1) {
2379ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                        w.mGivenContentInsets.scale(w.mGlobalScale);
2380ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                        w.mGivenVisibleInsets.scale(w.mGlobalScale);
2381ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                        w.mGivenTouchableRegion.scale(w.mGlobalScale);
2382ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                    }
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLayoutNeeded = true;
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    performLayoutAndPlaceSurfacesLocked();
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(origId);
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
239106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getWindowDisplayFrame(Session session, IWindow client,
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Rect outDisplayFrame) {
23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
2395e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            WindowState win = windowForClientLocked(session, client, false);
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win == null) {
23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outDisplayFrame.setEmpty();
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outDisplayFrame.set(win.mDisplayFrame);
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2404bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen    public void setWindowWallpaperPositionLocked(WindowState window, float x, float y,
2405bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen            float xStep, float yStep) {
2406c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        if (window.mWallpaperX != x || window.mWallpaperY != y)  {
2407c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn            window.mWallpaperX = x;
2408c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn            window.mWallpaperY = y;
2409bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen            window.mWallpaperXStep = xStep;
2410bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen            window.mWallpaperYStep = yStep;
241173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            if (updateWallpaperOffsetLocked(window, true)) {
241273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                performLayoutAndPlaceSurfacesLocked();
2413c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn            }
2414c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        }
2415c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn    }
2416ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
24177580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn    void wallpaperCommandComplete(IBinder window, Bundle result) {
24187580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        synchronized (mWindowMap) {
24197580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            if (mWaitingOnWallpaper != null &&
24207580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    mWaitingOnWallpaper.mClient.asBinder() == window) {
24217580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                mWaitingOnWallpaper = null;
24227580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                mWindowMap.notifyAll();
24237580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            }
24247580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        }
24257580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn    }
2426ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
24277580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn    public Bundle sendWindowWallpaperCommandLocked(WindowState window,
24287580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            String action, int x, int y, int z, Bundle extras, boolean sync) {
24297580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        if (window == mWallpaperTarget || window == mLowerWallpaperTarget
24307580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                || window == mUpperWallpaperTarget) {
24317580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            boolean doWait = sync;
24327580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            int curTokenIndex = mWallpaperTokens.size();
24337580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            while (curTokenIndex > 0) {
24347580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                curTokenIndex--;
24357580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                WindowToken token = mWallpaperTokens.get(curTokenIndex);
24367580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                int curWallpaperIndex = token.windows.size();
24377580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                while (curWallpaperIndex > 0) {
24387580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    curWallpaperIndex--;
24397580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    WindowState wallpaper = token.windows.get(curWallpaperIndex);
24407580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    try {
24417580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        wallpaper.mClient.dispatchWallpaperCommand(action,
24427580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                x, y, z, extras, sync);
24437580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        // We only want to be synchronous with one wallpaper.
24447580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        sync = false;
24457580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    } catch (RemoteException e) {
24467580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    }
24477580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                }
24487580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            }
2449ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
24507580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            if (doWait) {
24517580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                // XXX Need to wait for result.
24527580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            }
24537580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        }
2454ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
24557580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        return null;
24567580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn    }
2457ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int relayoutWindow(Session session, IWindow client,
24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowManager.LayoutParams attrs, int requestedWidth,
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int requestedHeight, int viewVisibility, boolean insetsPending,
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Rect outFrame, Rect outContentInsets, Rect outVisibleInsets,
2462694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            Configuration outConfig, Surface outSurface) {
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean displayed = false;
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean inTouchMode;
2465e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        boolean configChanged;
2466ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato
2467ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato        // if they don't have this permission, mask out the status bar bits
2468ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato        if (attrs != null) {
2469ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato            if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR)
2470ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato                    != PackageManager.PERMISSION_GRANTED) {
2471ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato                attrs.systemUiVisibility &= ~StatusBarManager.DISABLE_MASK;
2472ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato                attrs.subtreeSystemUiVisibility &= ~StatusBarManager.DISABLE_MASK;
2473ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato            }
2474ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato        }
24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long origId = Binder.clearCallingIdentity();
247606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
2478e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            WindowState win = windowForClientLocked(session, client, false);
24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win == null) {
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return 0;
24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mRequestedWidth = requestedWidth;
24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mRequestedHeight = requestedHeight;
24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (attrs != null) {
24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPolicy.adjustWindowParamsLw(attrs);
24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
248806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int attrChanges = 0;
24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flagChanges = 0;
24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (attrs != null) {
24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                flagChanges = win.mAttrs.flags ^= attrs.flags;
24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                attrChanges = win.mAttrs.copyFrom(attrs);
24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24968a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_LAYOUT) Slog.v(TAG, "Relayout " + win + ": " + win.mAttrs);
24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24985fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            win.mEnforceSizeCompat = (win.mAttrs.flags & FLAG_COMPATIBLE_WINDOW) != 0;
24995fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((attrChanges & WindowManager.LayoutParams.ALPHA_CHANGED) != 0) {
25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mAlpha = attrs.alpha;
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final boolean scaledWindow =
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ((win.mAttrs.flags & WindowManager.LayoutParams.FLAG_SCALED) != 0);
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (scaledWindow) {
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // requested{Width|Height} Surface's physical size
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // attrs.{width|height} Size on screen
25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mHScale = (attrs.width  != requestedWidth)  ?
25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        (attrs.width  / (float)requestedWidth) : 1.0f;
25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mVScale = (attrs.height != requestedHeight) ?
25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        (attrs.height / (float)requestedHeight) : 1.0f;
25149b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn            } else {
25159b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn                win.mHScale = win.mVScale = 1;
25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean imMayMove = (flagChanges&(
25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM |
25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)) != 0;
252106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean focusMayChange = win.mViewVisibility != viewVisibility
25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || ((flagChanges&WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) != 0)
25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || (!win.mRelayoutCalled);
252506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
25264c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            boolean wallpaperMayMove = win.mViewVisibility != viewVisibility
25274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    && (win.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0;
2528ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mRelayoutCalled = true;
25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int oldVisibility = win.mViewVisibility;
25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mViewVisibility = viewVisibility;
25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (viewVisibility == View.VISIBLE &&
25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (win.mAppToken == null || !win.mAppToken.clientHidden)) {
25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                displayed = !win.isVisibleLw();
25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.mExiting) {
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mExiting = false;
25373fe3851753e3623d3c7c468efa6ee17f17f9aa74Brad Fitzpatrick                    if (win.mAnimation != null) {
25383fe3851753e3623d3c7c468efa6ee17f17f9aa74Brad Fitzpatrick                        win.mAnimation.cancel();
25393fe3851753e3623d3c7c468efa6ee17f17f9aa74Brad Fitzpatrick                        win.mAnimation = null;
25403fe3851753e3623d3c7c468efa6ee17f17f9aa74Brad Fitzpatrick                    }
25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.mDestroying) {
25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mDestroying = false;
25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mDestroySurface.remove(win);
25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (oldVisibility == View.GONE) {
25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mEnterAnimationPending = true;
25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2549694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                if (displayed) {
2550694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    if (win.mSurface != null && !win.mDrawPending
2551694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            && !win.mCommitDrawPending && !mDisplayFrozen
2552694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            && mPolicy.isScreenOn()) {
2553694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        applyEnterAnimationLocked(win);
2554694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    }
2555694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    if ((win.mAttrs.flags
2556694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            & WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON) != 0) {
2557694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        if (DEBUG_VISIBILITY) Slog.v(TAG,
2558694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                "Relayout window turning screen on: " + win);
2559694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        win.mTurnOnScreen = true;
2560694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    }
2561694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    int diff = 0;
2562694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    if (win.mConfiguration != mCurConfiguration
2563694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            && (win.mConfiguration == null
2564694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                    || (diff=mCurConfiguration.diff(win.mConfiguration)) != 0)) {
2565694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        win.mConfiguration = mCurConfiguration;
2566694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        if (DEBUG_CONFIGURATION) {
2567694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            Slog.i(TAG, "Window " + win + " visible with new config: "
2568694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                    + win.mConfiguration + " / 0x"
2569694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                    + Integer.toHexString(diff));
2570694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        }
2571694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        outConfig.setTo(mCurConfiguration);
2572694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    }
257393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                }
25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((attrChanges&WindowManager.LayoutParams.FORMAT_CHANGED) != 0) {
25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // To change the format, we need to re-build the surface.
25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.destroySurfaceLocked();
25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    displayed = true;
25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Surface surface = win.createSurfaceLocked();
25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (surface != null) {
25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outSurface.copyFrom(surface);
25833b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        win.mReportDestroySurface = false;
25843b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        win.mSurfacePendingDestroy = false;
25858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (SHOW_TRANSACTIONS) Slog.i(TAG,
25860586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                "  OUT SURFACE " + outSurface + ": copied");
25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
25880586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                        // For some reason there isn't a surface.  Clear the
25890586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                        // caller's object so they see the same state.
25900586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                        outSurface.release();
25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (Exception e) {
25932e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                    mInputMonitor.updateInputWindowsLw(true /*force*/);
2594e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
25958a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Exception thrown when creating surface for client "
25960586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                             + client + " (" + win.mAttrs.getTitle() + ")",
25970586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                             e);
25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Binder.restoreCallingIdentity(origId);
25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return 0;
26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (displayed) {
26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    focusMayChange = true;
26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.mAttrs.type == TYPE_INPUT_METHOD
26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && mInputMethodWindow == null) {
26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mInputMethodWindow = win;
26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    imMayMove = true;
26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2609558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                if (win.mAttrs.type == TYPE_BASE_APPLICATION
2610558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                        && win.mAppToken != null
2611558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                        && win.mAppToken.startingWindow != null) {
2612558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                    // Special handling of starting window over the base
2613558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                    // window of the app: propagate lock screen flags to it,
2614558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                    // to provide the correct semantics while starting.
2615558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                    final int mask =
2616558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
2617ef73162887943e16587b8e737b19e59348338e8cMike Lockwood                        | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
2618ef73162887943e16587b8e737b19e59348338e8cMike Lockwood                        | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON;
2619558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                    WindowManager.LayoutParams sa = win.mAppToken.startingWindow.mAttrs;
2620558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                    sa.flags = (sa.flags&~mask) | (win.mAttrs.flags&mask);
2621558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                }
26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mEnterAnimationPending = false;
26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.mSurface != null) {
26258a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_VISIBILITY) Slog.i(TAG, "Relayout invis " + win
26263b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            + ": mExiting=" + win.mExiting
26273b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            + " mSurfacePendingDestroy=" + win.mSurfacePendingDestroy);
26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If we are not currently running the exit animation, we
26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // need to see about starting one.
26303b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    if (!win.mExiting || win.mSurfacePendingDestroy) {
26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Try starting an animation; if there isn't one, we
26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // can destroy the surface right away.
26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int transit = WindowManagerPolicy.TRANSIT_EXIT;
26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (win.getAttrs().type == TYPE_APPLICATION_STARTING) {
26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            transit = WindowManagerPolicy.TRANSIT_PREVIEW_DONE;
26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
26373b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        if (!win.mSurfacePendingDestroy && win.isWinVisibleLw() &&
26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              applyAnimationLocked(win, transit, false)) {
26393b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            focusMayChange = true;
26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            win.mExiting = true;
26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (win.isAnimating()) {
26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Currently in a hide animation... turn this into
26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // an exit.
26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            win.mExiting = true;
26456136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                        } else if (win == mWallpaperTarget) {
26466136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                            // If the wallpaper is currently behind this
26476136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                            // window, we need to change both of them inside
26486136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                            // of a transaction to avoid artifacts.
26496136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                            win.mExiting = true;
26506136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                            win.mAnimating = true;
26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (mInputMethodWindow == win) {
26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                mInputMethodWindow = null;
26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            win.destroySurfaceLocked();
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2659ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
26603b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                if (win.mSurface == null || (win.getAttrs().flags
26613b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        & WindowManager.LayoutParams.FLAG_KEEP_SURFACE_WHILE_ANIMATING) == 0
26623b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        || win.mSurfacePendingDestroy) {
26633b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // We are being called from a local process, which
26643b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // means outSurface holds its current surface.  Ensure the
26653b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // surface object is cleared, but we don't want it actually
26663b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // destroyed at this point.
26673b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    win.mSurfacePendingDestroy = false;
26683b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    outSurface.release();
26698a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_VISIBILITY) Slog.i(TAG, "Releasing surface in: " + win);
26703b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                } else if (win.mSurface != null) {
26718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_VISIBILITY) Slog.i(TAG,
26723b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            "Keeping surface, will report destroy: " + win);
26733b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    win.mReportDestroySurface = true;
26743b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    outSurface.copyFrom(win.mSurface);
26753b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                }
26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (focusMayChange) {
26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //System.out.println("Focus may change: " + win.mAttrs.getTitle());
26803a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                if (updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
26813a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        false /*updateInputWindows*/)) {
26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    imMayMove = false;
26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //System.out.println("Relayout " + win + ": focus=" + mCurrentFocus);
26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
268606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
2687c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            // updateFocusedWindowLocked() already assigned layers so we only need to
2688c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            // reassign them at this point if the IM window state gets shuffled
2689c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            boolean assignLayers = false;
269006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imMayMove) {
26928abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn                if (moveInputMethodWindowsIfNeededLocked(false) || displayed) {
26938abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn                    // Little hack here -- we -should- be able to rely on the
26948abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn                    // function to return true if the IME has moved and needs
26958abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn                    // its layer recomputed.  However, if the IME was hidden
26968abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn                    // and isn't actually moved in the list, its layer may be
26978abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn                    // out of data so we make sure to recompute it.
26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    assignLayers = true;
26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27014c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            if (wallpaperMayMove) {
27020586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                if ((adjustWallpaperWindowsLocked()&ADJUST_WALLPAPER_LAYERS_CHANGED) != 0) {
27034c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    assignLayers = true;
27044c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
27054c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
270606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
27079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLayoutNeeded = true;
27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mGivenInsetsPending = insetsPending;
27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assignLayers) {
27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                assignLayersLocked();
27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
271294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            configChanged = updateOrientationFromAppTokensLocked(false);
27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            performLayoutAndPlaceSurfacesLocked();
2714284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            if (displayed && win.mIsWallpaper) {
271581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn                updateWallpaperOffsetLocked(win, mAppDisplayWidth, mAppDisplayHeight, false);
2716284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            }
27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.mAppToken != null) {
27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mAppToken.updateReportedVisibilityLocked();
27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2720ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            outFrame.set(win.mCompatFrame);
27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outContentInsets.set(win.mContentInsets);
27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outVisibleInsets.set(win.mVisibleInsets);
27238a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (localLOGV) Slog.v(
27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Relayout given client " + client.asBinder()
272506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                + ", requestedWidth=" + requestedWidth
27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", requestedHeight=" + requestedHeight
27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", viewVisibility=" + viewVisibility
27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "\nRelayout returning frame=" + outFrame
27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", surface=" + outSurface);
27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27318a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (localLOGV || DEBUG_FOCUS) Slog.v(
27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Relayout of " + win + ": focusMayChange=" + focusMayChange);
27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            inTouchMode = mInTouchMode;
2735e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
27362e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown            mInputMonitor.updateInputWindowsLw(true /*force*/);
27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2739e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        if (configChanged) {
27409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendNewConfiguration();
27419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
274206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
274406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (inTouchMode ? WindowManagerImpl.RELAYOUT_IN_TOUCH_MODE : 0)
27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                | (displayed ? WindowManagerImpl.RELAYOUT_FIRST_TIME : 0);
27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2749648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn    public boolean outOfMemoryWindow(Session session, IWindow client) {
2750648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        long origId = Binder.clearCallingIdentity();
2751648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn
2752648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        try {
2753648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn            synchronized(mWindowMap) {
2754648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                WindowState win = windowForClientLocked(session, client, false);
2755648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                if (win == null) {
2756648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                    return false;
2757648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                }
2758648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                return reclaimSomeSurfaceMemoryLocked(win, "from-client", false);
2759648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn            }
2760648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        } finally {
2761648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn            Binder.restoreCallingIdentity(origId);
2762648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        }
2763648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn    }
2764648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn
27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finishDrawingWindow(Session session, IWindow client) {
27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long origId = Binder.clearCallingIdentity();
27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
2768e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            WindowState win = windowForClientLocked(session, client, false);
27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win != null && win.finishDrawingLocked()) {
2770759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                if ((win.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0) {
2771759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    adjustWallpaperWindowsLocked();
2772759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                }
27739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutNeeded = true;
27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                performLayoutAndPlaceSurfacesLocked();
27759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private AttributeCache.Entry getCachedAnimations(WindowManager.LayoutParams lp) {
278108121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn        if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: layout params pkg="
27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + (lp != null ? lp.packageName : null)
27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " resId=0x" + (lp != null ? Integer.toHexString(lp.windowAnimations) : null));
27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (lp != null && lp.windowAnimations != 0) {
27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If this is a system resource, don't try to load it from the
27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // application resources.  It is nice to avoid loading application
27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // resources if we can.
27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String packageName = lp.packageName != null ? lp.packageName : "android";
27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int resId = lp.windowAnimations;
27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((resId&0xFF000000) == 0x01000000) {
27919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                packageName = "android";
27929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27938a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: picked package="
27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + packageName);
27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return AttributeCache.instance().get(packageName, resId,
27969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.WindowAnimation);
27979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
280006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
28013b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    private AttributeCache.Entry getCachedAnimations(String packageName, int resId) {
280208121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn        if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: package="
28033b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                + packageName + " resId=0x" + Integer.toHexString(resId));
28043b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        if (packageName != null) {
28053b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if ((resId&0xFF000000) == 0x01000000) {
28063b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                packageName = "android";
28073b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            }
28088a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: picked package="
28093b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    + packageName);
28103b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            return AttributeCache.instance().get(packageName, resId,
28113b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    com.android.internal.R.styleable.WindowAnimation);
28123b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        }
28133b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        return null;
28143b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    }
28153b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn
28166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void applyEnterAnimationLocked(WindowState win) {
28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int transit = WindowManagerPolicy.TRANSIT_SHOW;
28189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (win.mEnterAnimationPending) {
28199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mEnterAnimationPending = false;
28209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            transit = WindowManagerPolicy.TRANSIT_ENTER;
28219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        applyAnimationLocked(win, transit, true);
28249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean applyAnimationLocked(WindowState win,
28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int transit, boolean isEntrance) {
28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (win.mLocalAnimating && win.mAnimationIsEntrance == isEntrance) {
28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If we are trying to apply an animation, but already running
28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // an animation of the same type, then just leave that one alone.
28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
283306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Only apply an animation if the display isn't frozen.  If it is
28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // frozen, there is no reason to animate and it can cause strange
28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // artifacts when we unfreeze the display if some different animation
28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // is running.
2838de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn        if (!mDisplayFrozen && mPolicy.isScreenOn()) {
28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int anim = mPolicy.selectAnimationLw(win, transit);
28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int attr = -1;
28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Animation a = null;
28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (anim != 0) {
28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                a = AnimationUtils.loadAnimation(mContext, anim);
28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                switch (transit) {
28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case WindowManagerPolicy.TRANSIT_ENTER:
28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        attr = com.android.internal.R.styleable.WindowAnimation_windowEnterAnimation;
28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case WindowManagerPolicy.TRANSIT_EXIT:
28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        attr = com.android.internal.R.styleable.WindowAnimation_windowExitAnimation;
28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case WindowManagerPolicy.TRANSIT_SHOW:
28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        attr = com.android.internal.R.styleable.WindowAnimation_windowShowAnimation;
28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case WindowManagerPolicy.TRANSIT_HIDE:
28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        attr = com.android.internal.R.styleable.WindowAnimation_windowHideAnimation;
28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attr >= 0) {
28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    a = loadAnimation(win.mAttrs, attr);
28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28638a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_ANIM) Slog.v(TAG, "applyAnimation: win=" + win
28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " anim=" + anim + " attr=0x" + Integer.toHexString(attr)
28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mAnimation=" + win.mAnimation
28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " isEntrance=" + isEntrance);
28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (a != null) {
28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_ANIM) {
2869b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    RuntimeException e = null;
2870b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (!HIDE_STACK_CRAWLS) {
2871b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        e = new RuntimeException();
2872b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        e.fillInStackTrace();
2873b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
28748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "Loaded animation " + a + " for " + win, e);
28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.setAnimation(a);
28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mAnimationIsEntrance = isEntrance;
28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.clearAnimation();
28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return win.mAnimation != null;
28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Animation loadAnimation(WindowManager.LayoutParams lp, int animAttr) {
28879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int anim = 0;
28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Context context = mContext;
28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (animAttr >= 0) {
28909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AttributeCache.Entry ent = getCachedAnimations(lp);
28919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ent != null) {
28929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                context = ent.context;
28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                anim = ent.array.getResourceId(animAttr, 0);
28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (anim != 0) {
28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return AnimationUtils.loadAnimation(context, anim);
28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
290106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
29023b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    private Animation loadAnimation(String packageName, int resId) {
29033b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        int anim = 0;
29043b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        Context context = mContext;
29053b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        if (resId >= 0) {
29063b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            AttributeCache.Entry ent = getCachedAnimations(packageName, resId);
29073b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if (ent != null) {
29083b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                context = ent.context;
29093b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                anim = resId;
29103b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            }
29113b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        }
29123b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        if (anim != 0) {
29133b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            return AnimationUtils.loadAnimation(context, anim);
29143b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        }
29153b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        return null;
29163b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    }
29173b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn
29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean applyAnimationLocked(AppWindowToken wtoken,
2919ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            WindowManager.LayoutParams lp, int transit, boolean enter) {
29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Only apply an animation if the display isn't frozen.  If it is
29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // frozen, there is no reason to animate and it can cause strange
29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // artifacts when we unfreeze the display if some different animation
29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // is running.
2924de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn        if (!mDisplayFrozen && mPolicy.isScreenOn()) {
29250a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima            Animation a;
2926ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            if (mNextAppTransitionPackage != null) {
29273b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                a = loadAnimation(mNextAppTransitionPackage, enter ?
29283b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        mNextAppTransitionEnter : mNextAppTransitionExit);
29290a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima            } else {
29300a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                int animAttr = 0;
29310a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                switch (transit) {
29320a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                    case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN:
29330a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        animAttr = enter
29340a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                ? com.android.internal.R.styleable.WindowAnimation_activityOpenEnterAnimation
29350a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                : com.android.internal.R.styleable.WindowAnimation_activityOpenExitAnimation;
29360a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        break;
29370a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                    case WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE:
29380a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        animAttr = enter
29390a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                ? com.android.internal.R.styleable.WindowAnimation_activityCloseEnterAnimation
29400a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                : com.android.internal.R.styleable.WindowAnimation_activityCloseExitAnimation;
29410a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        break;
29420a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                    case WindowManagerPolicy.TRANSIT_TASK_OPEN:
29430a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        animAttr = enter
29440a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                ? com.android.internal.R.styleable.WindowAnimation_taskOpenEnterAnimation
29450a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                : com.android.internal.R.styleable.WindowAnimation_taskOpenExitAnimation;
29460a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        break;
29470a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                    case WindowManagerPolicy.TRANSIT_TASK_CLOSE:
29480a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        animAttr = enter
29490a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                ? com.android.internal.R.styleable.WindowAnimation_taskCloseEnterAnimation
29500a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                : com.android.internal.R.styleable.WindowAnimation_taskCloseExitAnimation;
29510a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        break;
29520a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                    case WindowManagerPolicy.TRANSIT_TASK_TO_FRONT:
29530a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        animAttr = enter
29540a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                ? com.android.internal.R.styleable.WindowAnimation_taskToFrontEnterAnimation
29550a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                : com.android.internal.R.styleable.WindowAnimation_taskToFrontExitAnimation;
29560a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        break;
29570a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                    case WindowManagerPolicy.TRANSIT_TASK_TO_BACK:
29580a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        animAttr = enter
29595a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima                                ? com.android.internal.R.styleable.WindowAnimation_taskToBackEnterAnimation
29600a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                : com.android.internal.R.styleable.WindowAnimation_taskToBackExitAnimation;
29610a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        break;
296225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                    case WindowManagerPolicy.TRANSIT_WALLPAPER_OPEN:
296325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        animAttr = enter
296425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                ? com.android.internal.R.styleable.WindowAnimation_wallpaperOpenEnterAnimation
296525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                : com.android.internal.R.styleable.WindowAnimation_wallpaperOpenExitAnimation;
296625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        break;
296725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                    case WindowManagerPolicy.TRANSIT_WALLPAPER_CLOSE:
296825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        animAttr = enter
296925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                ? com.android.internal.R.styleable.WindowAnimation_wallpaperCloseEnterAnimation
297025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                : com.android.internal.R.styleable.WindowAnimation_wallpaperCloseExitAnimation;
297125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        break;
297225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                    case WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_OPEN:
2973f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                        animAttr = enter
297425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenEnterAnimation
297525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenExitAnimation;
2976f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                        break;
297725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                    case WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_CLOSE:
2978f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                        animAttr = enter
297925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseEnterAnimation
298025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseExitAnimation;
2981f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                        break;
29820a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                }
2983bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                a = animAttr != 0 ? loadAnimation(lp, animAttr) : null;
29848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_ANIM) Slog.v(TAG, "applyAnimation: wtoken=" + wtoken
29850a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        + " anim=" + a
29860a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        + " animAttr=0x" + Integer.toHexString(animAttr)
29870a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        + " transit=" + transit);
29889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (a != null) {
29909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_ANIM) {
2991b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    RuntimeException e = null;
2992b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (!HIDE_STACK_CRAWLS) {
2993b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        e = new RuntimeException();
2994b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        e.fillInStackTrace();
2995b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
29968a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "Loaded animation " + a + " for " + wtoken, e);
29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.setAnimation(a);
29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.clearAnimation();
30029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return wtoken.animation != null;
30059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
30089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Application Window Tokens
30099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void validateAppTokens(List tokens) {
30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int v = tokens.size()-1;
30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int m = mAppTokens.size()-1;
30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (v >= 0 && m >= 0) {
30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = mAppTokens.get(m);
30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken.removed) {
30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                m--;
30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tokens.get(v) != wtoken.token) {
30218a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Tokens out of sync: external is " + tokens.get(v)
30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + " @ " + v + ", internal is " + wtoken.token + " @ " + m);
30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            v--;
30259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            m--;
30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (v >= 0) {
30288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "External token not found: " + tokens.get(v) + " @ " + v);
30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            v--;
30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (m >= 0) {
30329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = mAppTokens.get(m);
30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!wtoken.removed) {
30348a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Invalid internal token: " + wtoken.token + " @ " + m);
30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            m--;
30379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean checkCallingPermission(String permission, String func) {
30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Quick check: if the calling permission is me, it's all okay.
30429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Binder.getCallingPid() == Process.myPid()) {
30439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
30449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
304506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
30469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mContext.checkCallingPermission(permission)
30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                == PackageManager.PERMISSION_GRANTED) {
30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String msg = "Permission Denial: " + func + " from pid="
30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Binder.getCallingPid()
30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", uid=" + Binder.getCallingUid()
30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " requires " + permission;
30548a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        Slog.w(TAG, msg);
30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
305706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AppWindowToken findAppWindowToken(IBinder token) {
30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowToken wtoken = mTokenMap.get(token);
30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wtoken == null) {
30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return wtoken.appWindowToken;
30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
306506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void addWindowToken(IBinder token, int type) {
30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "addWindowToken()")) {
3069cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
307106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken wtoken = mTokenMap.get(token);
30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken != null) {
30758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to add existing input method token: " + token);
30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
30779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            wtoken = new WindowToken(this, token, type, true);
30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTokenMap.put(token, wtoken);
30804c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            if (type == TYPE_WALLPAPER) {
30814c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                mWallpaperTokens.add(wtoken);
30824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
30839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
308506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeWindowToken(IBinder token) {
30879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "removeWindowToken()")) {
3089cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long origId = Binder.clearCallingIdentity();
30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken wtoken = mTokenMap.remove(token);
30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken != null) {
30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean delayed = false;
30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!wtoken.hidden) {
30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wtoken.hidden = true;
309906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int N = wtoken.windows.size();
31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean changed = false;
310206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i=0; i<N; i++) {
31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        WindowState win = wtoken.windows.get(i);
31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (win.isAnimating()) {
31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            delayed = true;
31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
310906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (win.isVisibleNow()) {
31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            applyAnimationLocked(win,
31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    WindowManagerPolicy.TRANSIT_EXIT, false);
31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            changed = true;
31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (changed) {
31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLayoutNeeded = true;
31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        performLayoutAndPlaceSurfacesLocked();
31203a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL,
31213a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                                false /*updateInputWindows*/);
31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
312306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (delayed) {
31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mExitingTokens.add(wtoken);
31264c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    } else if (wtoken.windowType == TYPE_WALLPAPER) {
31274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                        mWallpaperTokens.remove(wtoken);
31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
313006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31312e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                mInputMonitor.updateInputWindowsLw(true /*force*/);
31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
31338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to remove non-existing token: " + token);
31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void addAppToken(int addPos, IApplicationToken token,
31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int groupId, int requestedOrientation, boolean fullscreen) {
31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
31429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "addAppToken()")) {
3143cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3145349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
3146349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // Get the dispatching timeout here while we are not holding any locks so that it
3147349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // can be cached by the AppWindowToken.  The timeout value is used later by the
3148349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // input dispatcher in code that does hold locks.  If we did not cache the value
3149349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // here we would run the chance of introducing a deadlock between the window manager
3150349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // (which holds locks while updating the input dispatcher state) and the activity manager
3151349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // (which holds locks while querying the application token).
3152349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        long inputDispatchingTimeoutNanos;
3153349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        try {
3154349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown            inputDispatchingTimeoutNanos = token.getKeyDispatchingTimeout() * 1000000L;
3155349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        } catch (RemoteException ex) {
3156349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown            Slog.w(TAG, "Could not get dispatching timeout.", ex);
3157349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown            inputDispatchingTimeoutNanos = DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS;
3158349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        }
315906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token.asBinder());
31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken != null) {
31638a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to add existing app token: " + token);
31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            wtoken = new AppWindowToken(this, token);
3167349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown            wtoken.inputDispatchingTimeoutNanos = inputDispatchingTimeoutNanos;
31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.groupId = groupId;
31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.appFullscreen = fullscreen;
31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.requestedOrientation = requestedOrientation;
3171f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            if (DEBUG_TOKEN_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG, "addAppToken: " + wtoken);
31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAppTokens.add(addPos, wtoken);
31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTokenMap.put(token.asBinder(), wtoken);
317406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Application tokens start out hidden.
31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.hidden = true;
31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.hiddenRequested = true;
317806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //dump();
31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
318206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAppGroupId(IBinder token, int groupId) {
31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppStartingIcon()")) {
3186cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
31909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token);
31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null) {
31928a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to set group id of non-existing app token: " + token);
31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.groupId = groupId;
31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
319806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getOrientationFromWindowsLocked() {
3200bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn        if (mDisplayFrozen || mOpeningApps.size() > 0 || mClosingApps.size() > 0) {
3201bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn            // If the display is frozen, some activities may be in the middle
3202bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn            // of restarting, and thus have removed their old window.  If the
3203bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn            // window has the flag to hide the lock screen, then the lock screen
3204bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn            // can re-appear and inflict its own orientation on us.  Keep the
3205bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn            // orientation stable until this all settles down.
3206bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn            return mLastWindowForcedOrientation;
3207bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn        }
3208bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn
32099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = mWindows.size() - 1;
32109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (pos >= 0) {
3211e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState wtoken = mWindows.get(pos);
32129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos--;
32139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken.mAppToken != null) {
32149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We hit an application window. so the orientation will be determined by the
32159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // app window. No point in continuing further.
3216bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                return (mLastWindowForcedOrientation=ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
32179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3218b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate            if (!wtoken.isVisibleLw() || !wtoken.mPolicyVisibilityAfterAnim) {
32199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
32209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int req = wtoken.mAttrs.screenOrientation;
32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if((req == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) ||
32239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (req == ActivityInfo.SCREEN_ORIENTATION_BEHIND)){
32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
3226bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                return (mLastWindowForcedOrientation=req);
32279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3229bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn        return (mLastWindowForcedOrientation=ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
323106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getOrientationFromAppTokensLocked() {
3233e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        int pos = mAppTokens.size() - 1;
3234e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        int curGroup = 0;
3235e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        int lastOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
3236e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        boolean findingBehind = false;
3237e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        boolean haveGroup = false;
3238e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        boolean lastFullscreen = false;
3239e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        while (pos >= 0) {
3240e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            AppWindowToken wtoken = mAppTokens.get(pos);
3241e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            pos--;
3242bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn
3243bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn            if (DEBUG_APP_ORIENTATION) Slog.v(TAG, "Checking app orientation: " + wtoken);
3244bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn
3245e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // if we're about to tear down this window and not seek for
3246e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // the behind activity, don't use it for orientation
3247e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            if (!findingBehind
3248e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    && (!wtoken.hidden && wtoken.hiddenRequested)) {
3249bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                if (DEBUG_ORIENTATION) Slog.v(TAG, "Skipping " + wtoken
3250bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                        + " -- going to hide");
3251e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                continue;
3252e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
3253e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
3254e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            if (!haveGroup) {
3255e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // We ignore any hidden applications on the top.
3256e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                if (wtoken.hiddenRequested || wtoken.willBeHidden) {
3257bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                    if (DEBUG_ORIENTATION) Slog.v(TAG, "Skipping " + wtoken
3258bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                            + " -- hidden on top");
3259105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    continue;
3260105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                }
3261e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                haveGroup = true;
3262e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                curGroup = wtoken.groupId;
3263e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                lastOrientation = wtoken.requestedOrientation;
3264e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            } else if (curGroup != wtoken.groupId) {
3265e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // If we have hit a new application group, and the bottom
3266e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // of the previous group didn't explicitly say to use
3267e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // the orientation behind it, and the last app was
3268e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // full screen, then we'll stick with the
3269e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // user's orientation.
3270e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                if (lastOrientation != ActivityInfo.SCREEN_ORIENTATION_BEHIND
3271e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                        && lastFullscreen) {
3272bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                    if (DEBUG_ORIENTATION) Slog.v(TAG, "Done at " + wtoken
3273bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                            + " -- end of group, return " + lastOrientation);
3274e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    return lastOrientation;
3275e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                }
3276e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
3277e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            int or = wtoken.requestedOrientation;
3278e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // If this application is fullscreen, and didn't explicitly say
3279e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // to use the orientation behind it, then just take whatever
3280e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // orientation it has and ignores whatever is under it.
3281e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            lastFullscreen = wtoken.appFullscreen;
3282e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            if (lastFullscreen
3283e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    && or != ActivityInfo.SCREEN_ORIENTATION_BEHIND) {
3284bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                if (DEBUG_ORIENTATION) Slog.v(TAG, "Done at " + wtoken
3285bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                        + " -- full screen, return " + or);
3286e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                return or;
3287e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
3288e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // If this application has requested an explicit orientation,
3289e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // then use it.
3290e5439f228f603f60febe058f633d91d5af2fff76Dianne Hackborn            if (or != ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
3291e5439f228f603f60febe058f633d91d5af2fff76Dianne Hackborn                    && or != ActivityInfo.SCREEN_ORIENTATION_BEHIND) {
3292bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                if (DEBUG_ORIENTATION) Slog.v(TAG, "Done at " + wtoken
3293bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                        + " -- explicitly set, return " + or);
3294e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                return or;
3295e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
3296e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            findingBehind |= (or == ActivityInfo.SCREEN_ORIENTATION_BEHIND);
3297e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        }
3298bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn        if (DEBUG_ORIENTATION) Slog.v(TAG, "No app is requesting an orientation");
3299e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
33009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
330106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
33029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Configuration updateOrientationFromAppTokens(
3303105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            Configuration currentConfig, IBinder freezeThisOneIfNeeded) {
3304cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
3305cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn                "updateOrientationFromAppTokens()")) {
3306cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
3307cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn        }
3308ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
3309e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        Configuration config = null;
33109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long ident = Binder.clearCallingIdentity();
3311e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
33129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
33137916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            config = updateOrientationFromAppTokensLocked(currentConfig,
33147916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    freezeThisOneIfNeeded);
33157916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
33167916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
33177916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        Binder.restoreCallingIdentity(ident);
33187916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        return config;
33197916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    }
33207916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
33217916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    private Configuration updateOrientationFromAppTokensLocked(
33227916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            Configuration currentConfig, IBinder freezeThisOneIfNeeded) {
33237916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        Configuration config = null;
33247916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
33257916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        if (updateOrientationFromAppTokensLocked(false)) {
33267916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (freezeThisOneIfNeeded != null) {
33277916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                AppWindowToken wtoken = findAppWindowToken(
33287916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        freezeThisOneIfNeeded);
33297916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                if (wtoken != null) {
33307916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    startAppFreezingScreenLocked(wtoken,
33317916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                            ActivityInfo.CONFIG_ORIENTATION);
33327916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                }
33337916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
33347916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            config = computeNewConfigurationLocked();
33357916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
33367916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        } else if (currentConfig != null) {
33377916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            // No obvious action we need to take, but if our current
33387916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            // state mismatches the activity manager's, update it,
33397916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            // disregarding font scale, which should remain set to
33407916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            // the value of the previous configuration.
33417916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            mTempConfiguration.setToDefaults();
33427916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            mTempConfiguration.fontScale = currentConfig.fontScale;
33437916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (computeNewConfigurationLocked(mTempConfiguration)) {
33447916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                if (currentConfig.diff(mTempConfiguration) != 0) {
33457916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    mWaitingForConfig = true;
33467916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    mLayoutNeeded = true;
33477916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    startFreezingDisplayLocked(false);
33487916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    config = new Configuration(mTempConfiguration);
3349e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                }
3350bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn            }
33519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3352e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
33539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return config;
33549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
335506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
33569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
3357e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * Determine the new desired orientation of the display, returning
3358e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * a non-null new Configuration if it has changed from the current
3359e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * orientation.  IF TRUE IS RETURNED SOMEONE MUST CALL
3360e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * setNewConfiguration() TO TELL THE WINDOW MANAGER IT CAN UNFREEZE THE
3361e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * SCREEN.  This will typically be done for you if you call
3362e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * sendNewConfiguration().
3363e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     *
33649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The orientation is computed from non-application windows first. If none of
33659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the non-application windows specify orientation, the orientation is computed from
336606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     * application tokens.
33679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.IWindowManager#updateOrientationFromAppTokens(
33689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * android.os.IBinder)
33699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
337094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn    boolean updateOrientationFromAppTokensLocked(boolean inTransaction) {
33719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean changed = false;
33729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long ident = Binder.clearCallingIdentity();
33739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3374c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            int req = computeForcedAppOrientationLocked();
337506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
33769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (req != mForcedAppOrientation) {
33779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mForcedAppOrientation = req;
33789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //send a message to Policy indicating orientation change to take
33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //action like disabling/enabling sensors etc.,
3380c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                mPolicy.setCurrentOrientationLw(req);
3381e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                if (setRotationUncheckedLocked(WindowManagerPolicy.USE_LAST_ROTATION,
338294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        mLastRotationFlags | Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE,
338394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        inTransaction)) {
3384e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    changed = true;
33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
33869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3387105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
3388e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            return changed;
33899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
33909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(ident);
33919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
339306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3394c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    int computeForcedAppOrientationLocked() {
3395c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        int req = getOrientationFromWindowsLocked();
3396c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        if (req == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) {
3397c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            req = getOrientationFromAppTokensLocked();
3398c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        }
3399c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        return req;
3400c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
340106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3402e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    public void setNewConfiguration(Configuration config) {
3403e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
3404e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                "setNewConfiguration()")) {
3405e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
3406e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        }
3407e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
3408e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        synchronized(mWindowMap) {
3409e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            mCurConfiguration = new Configuration(config);
3410e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            mWaitingForConfig = false;
3411e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            performLayoutAndPlaceSurfacesLocked();
3412e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        }
3413e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    }
3414e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
34159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAppOrientation(IApplicationToken token, int requestedOrientation) {
34169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
34179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppOrientation()")) {
3418cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
34199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
342006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
34219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
34229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token.asBinder());
34239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null) {
34248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to set orientation of non-existing app token: " + token);
34259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
34269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
342706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
34289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.requestedOrientation = requestedOrientation;
34299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
343106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
34329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getAppOrientation(IApplicationToken token) {
34339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
34349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token.asBinder());
34359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null) {
34369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
34379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
343806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
34399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return wtoken.requestedOrientation;
34409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
344206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
34439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setFocusedApp(IBinder token, boolean moveFocusNow) {
34449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
34459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setFocusedApp()")) {
3446cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
34479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
34509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean changed = false;
34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token == null) {
34528a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_FOCUS) Slog.v(TAG, "Clearing focused app, was " + mFocusedApp);
34539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                changed = mFocusedApp != null;
34549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFocusedApp = null;
345500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                if (changed) {
345600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    mInputMonitor.setFocusedAppLw(null);
3457349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown                }
34589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
34599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AppWindowToken newFocus = findAppWindowToken(token);
34609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (newFocus == null) {
34618a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to set focus to non-existing app token: " + token);
34629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
34639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                changed = mFocusedApp != newFocus;
34659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFocusedApp = newFocus;
34668a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_FOCUS) Slog.v(TAG, "Set focused app to: " + mFocusedApp);
346700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                if (changed) {
346800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    mInputMonitor.setFocusedAppLw(newFocus);
3469349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown                }
34709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (moveFocusNow && changed) {
34739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final long origId = Binder.clearCallingIdentity();
34743a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/);
34759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.restoreCallingIdentity(origId);
34769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34807da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn    public void prepareAppTransition(int transit, boolean alwaysKeepCurrent) {
34819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
34829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "prepareAppTransition()")) {
3483cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
34849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
348506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
34869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
34878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_APP_TRANSITIONS) Slog.v(
34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    TAG, "Prepare app transition: transit=" + transit
34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mNextAppTransition=" + mNextAppTransition);
3490b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn            if (!mDisplayFrozen && mPolicy.isScreenOn()) {
3491bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET
3492bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                        || mNextAppTransition == WindowManagerPolicy.TRANSIT_NONE) {
34939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNextAppTransition = transit;
34947da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                } else if (!alwaysKeepCurrent) {
34957da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    if (transit == WindowManagerPolicy.TRANSIT_TASK_OPEN
34967da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            && mNextAppTransition == WindowManagerPolicy.TRANSIT_TASK_CLOSE) {
34977da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        // Opening a new task always supersedes a close for the anim.
34987da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        mNextAppTransition = transit;
34997da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    } else if (transit == WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN
35007da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            && mNextAppTransition == WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE) {
35017da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        // Opening a new activity always supersedes a close for the anim.
35027da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        mNextAppTransition = transit;
35037da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    }
35049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppTransitionReady = false;
35069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppTransitionTimeout = false;
35079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStartingIconInTransition = false;
35089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSkipAppTransitionAnimation = false;
35099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mH.removeMessages(H.APP_TRANSITION_TIMEOUT);
35109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mH.sendMessageDelayed(mH.obtainMessage(H.APP_TRANSITION_TIMEOUT),
35119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        5000);
35129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getPendingAppTransition() {
35179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mNextAppTransition;
35189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
351906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
35203b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    public void overridePendingAppTransition(String packageName,
35213b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            int enterAnim, int exitAnim) {
35228b571a817cc953ce96750f440645f104c7f55157Dianne Hackborn        if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
35233b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            mNextAppTransitionPackage = packageName;
35243b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            mNextAppTransitionEnter = enterAnim;
35253b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            mNextAppTransitionExit = exitAnim;
35263b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        }
35273b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    }
3528ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
35299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void executeAppTransition() {
35309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
35319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "executeAppTransition()")) {
3532cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
35339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
353406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
35359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
35363b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if (DEBUG_APP_TRANSITIONS) {
35373b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                RuntimeException e = new RuntimeException("here");
35383b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                e.fillInStackTrace();
35398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Execute app transition: mNextAppTransition="
35403b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        + mNextAppTransition, e);
35413b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            }
3542bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn            if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppTransitionReady = true;
35449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final long origId = Binder.clearCallingIdentity();
35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                performLayoutAndPlaceSurfacesLocked();
35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.restoreCallingIdentity(origId);
35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAppStartingWindow(IBinder token, String pkg,
35522f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn            int theme, CompatibilityInfo compatInfo,
35532f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn            CharSequence nonLocalizedLabel, int labelRes, int icon,
35547eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn            int windowFlags, IBinder transferFrom, boolean createIfNeeded) {
35559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
35569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppStartingIcon()")) {
3557cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
35618a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_STARTING_WINDOW) Slog.v(
35629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    TAG, "setAppStartingIcon: token=" + token + " pkg=" + pkg
35639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " transferFrom=" + transferFrom);
356406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
35659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token);
35669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null) {
35678a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to set icon of non-existing app token: " + token);
35689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
35699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If the display is frozen, we won't do anything until the
35729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // actual window is displayed so there is no reason to put in
35739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // the starting window.
3574de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn            if (mDisplayFrozen || !mPolicy.isScreenOn()) {
35759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
35769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
357706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
35789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken.startingData != null) {
35799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
358106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
35829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (transferFrom != null) {
35839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AppWindowToken ttoken = findAppWindowToken(transferFrom);
35849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ttoken != null) {
35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowState startingWindow = ttoken.startingWindow;
35869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (startingWindow != null) {
35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mStartingIconInTransition) {
35889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // In this case, the starting icon has already
35899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // been displayed, so start letting windows get
35909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // shown immediately without any more transitions.
35919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mSkipAppTransitionAnimation = true;
35929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
35938a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_STARTING_WINDOW) Slog.v(TAG,
35949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Moving existing starting from " + ttoken
35959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " to " + wtoken);
35969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        final long origId = Binder.clearCallingIdentity();
359706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
35989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Transfer the starting window over to the new
35999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // token.
36009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wtoken.startingData = ttoken.startingData;
36019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wtoken.startingView = ttoken.startingView;
36029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wtoken.startingWindow = startingWindow;
36039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.startingData = null;
36049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.startingView = null;
36059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.startingWindow = null;
36069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.startingMoved = true;
36079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        startingWindow.mToken = wtoken;
3608ef49c57bdcdb6c808870570c205434b002431c37Dianne Hackborn                        startingWindow.mRootToken = wtoken;
36099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        startingWindow.mAppToken = wtoken;
3610f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                        if (DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG,
36119bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                                "Removing starting window: " + startingWindow);
36129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mWindows.remove(startingWindow);
3613dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                        mWindowsChanged = true;
3614f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                        if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Removing starting " + startingWindow
3615f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                + " from " + ttoken);
36169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.windows.remove(startingWindow);
36179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.allAppWindows.remove(startingWindow);
36189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        addWindowToListInOrderLocked(startingWindow, true);
361906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
36209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Propagate other interesting state between the
36219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // tokens.  If the old token is displayed, we should
36229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // immediately force the new one to be displayed.  If
36239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // it is animating, we need to move that animation to
36249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // the new one.
36259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (ttoken.allDrawn) {
36269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.allDrawn = true;
36279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (ttoken.firstWindowDrawn) {
36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.firstWindowDrawn = true;
36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
36319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!ttoken.hidden) {
36329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.hidden = false;
36339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.hiddenRequested = false;
36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.willBeHidden = false;
36359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
36369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (wtoken.clientHidden != ttoken.clientHidden) {
36379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.clientHidden = ttoken.clientHidden;
36389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.sendAppVisibilityToClients();
36399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
36409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (ttoken.animation != null) {
36419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.animation = ttoken.animation;
36429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.animating = ttoken.animating;
36439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.animLayerAdjustment = ttoken.animLayerAdjustment;
36449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ttoken.animation = null;
36459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ttoken.animLayerAdjustment = 0;
36469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.updateLayers();
36479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ttoken.updateLayers();
36489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
364906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
36503a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
36513a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                                true /*updateInputWindows*/);
36529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLayoutNeeded = true;
36539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        performLayoutAndPlaceSurfacesLocked();
36549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Binder.restoreCallingIdentity(origId);
36559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return;
36569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (ttoken.startingData != null) {
36579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // The previous app was getting ready to show a
36589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // starting window, but hasn't yet done so.  Steal it!
36598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_STARTING_WINDOW) Slog.v(TAG,
36609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Moving pending starting from " + ttoken
36619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " to " + wtoken);
36629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wtoken.startingData = ttoken.startingData;
36639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.startingData = null;
36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.startingMoved = true;
36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Message m = mH.obtainMessage(H.ADD_STARTING, wtoken);
36669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Note: we really want to do sendMessageAtFrontOfQueue() because we
36679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // want to process the message ASAP, before any other queued
36689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // messages.
36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mH.sendMessageAtFrontOfQueue(m);
36709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return;
36719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // There is no existing starting window, and the caller doesn't
36769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // want us to create one, so that's it!
36779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!createIfNeeded) {
36789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
36799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
368006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3681284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            // If this is a translucent or wallpaper window, then don't
3682284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            // show a starting window -- the current effect (a full-screen
3683284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            // opaque starting window that fades away to the real contents
3684284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            // when it is ready) does not work for this.
3685284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            if (theme != 0) {
3686284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                AttributeCache.Entry ent = AttributeCache.instance().get(pkg, theme,
3687284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        com.android.internal.R.styleable.Window);
3688284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                if (ent.array.getBoolean(
3689284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        com.android.internal.R.styleable.Window_windowIsTranslucent, false)) {
3690284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    return;
3691284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                }
3692284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                if (ent.array.getBoolean(
36936136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                        com.android.internal.R.styleable.Window_windowIsFloating, false)) {
36946136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                    return;
36956136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                }
36966136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                if (ent.array.getBoolean(
3697284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        com.android.internal.R.styleable.Window_windowShowWallpaper, false)) {
3698284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    return;
3699284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                }
3700284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            }
3701ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
37029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStartingIconInTransition = true;
37032f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn            wtoken.startingData = new StartingData(pkg, theme, compatInfo, nonLocalizedLabel,
37047eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                    labelRes, icon, windowFlags);
37059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Message m = mH.obtainMessage(H.ADD_STARTING, wtoken);
37069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Note: we really want to do sendMessageAtFrontOfQueue() because we
37079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // want to process the message ASAP, before any other queued
37089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // messages.
37099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendMessageAtFrontOfQueue(m);
37109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAppWillBeHidden(IBinder token) {
37149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppWillBeHidden()")) {
3716cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AppWindowToken wtoken;
37209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken = findAppWindowToken(token);
37239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null) {
37248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to set will be hidden of non-existing app token: " + token);
37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
37269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.willBeHidden = true;
37289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
373006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
37319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean setTokenVisibilityLocked(AppWindowToken wtoken, WindowManager.LayoutParams lp,
3732ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn            boolean visible, int transit, boolean performLayout) {
37339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean delayed = false;
37349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wtoken.clientHidden == visible) {
37369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.clientHidden = !visible;
37379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.sendAppVisibilityToClients();
37389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
373906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
37409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        wtoken.willBeHidden = false;
37419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wtoken.hidden == visible) {
37429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = wtoken.allAppWindows.size();
37439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean changed = false;
37448a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_APP_TRANSITIONS) Slog.v(
37459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Changing app " + wtoken + " hidden=" + wtoken.hidden
37469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " performLayout=" + performLayout);
374706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
37489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean runningAppAnimation = false;
374906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3750bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn            if (transit != WindowManagerPolicy.TRANSIT_UNSET) {
37519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wtoken.animation == sDummyAnimation) {
37529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wtoken.animation = null;
37539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3754ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                applyAnimationLocked(wtoken, lp, transit, visible);
37559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                changed = true;
37569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wtoken.animation != null) {
37579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    delayed = runningAppAnimation = true;
37589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
376006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
37619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
37629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState win = wtoken.allAppWindows.get(i);
37639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win == wtoken.startingWindow) {
37649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
37659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.isAnimating()) {
37689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    delayed = true;
37699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
377006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
37718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                //Slog.i(TAG, "Window " + win + ": vis=" + win.isVisible());
37729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //win.dump("  ");
37739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (visible) {
37749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!win.isVisibleNow()) {
37759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!runningAppAnimation) {
37769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            applyAnimationLocked(win,
37779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    WindowManagerPolicy.TRANSIT_ENTER, true);
37789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
37799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        changed = true;
37809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (win.isVisibleNow()) {
37829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!runningAppAnimation) {
37839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        applyAnimationLocked(win,
37849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                WindowManagerPolicy.TRANSIT_EXIT, false);
37859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    changed = true;
37879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.hidden = wtoken.hiddenRequested = !visible;
37919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!visible) {
37929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                unsetAppFreezingScreenLocked(wtoken, true, true);
37939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
37949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If we are being set visible, and the starting window is
37959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // not yet displayed, then make sure it doesn't get displayed.
37969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState swin = wtoken.startingWindow;
37979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (swin != null && (swin.mDrawPending
37989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || swin.mCommitDrawPending)) {
37999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    swin.mPolicyVisibility = false;
38009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    swin.mPolicyVisibilityAfterAnim = false;
38019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 }
38029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
380306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
38048a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "setTokenVisibilityLocked: " + wtoken
38059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + ": hidden=" + wtoken.hidden + " hiddenRequested="
38069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + wtoken.hiddenRequested);
380706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
38089b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn            if (changed) {
38099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutNeeded = true;
38103a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                mInputMonitor.setUpdateInputWindowsNeededLw();
38119b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn                if (performLayout) {
38123a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
38133a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                            false /*updateInputWindows*/);
38149b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn                    performLayoutAndPlaceSurfacesLocked();
38159b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn                }
38162e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                mInputMonitor.updateInputWindowsLw(false /*force*/);
38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wtoken.animation != null) {
38219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            delayed = true;
38229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
382306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
38249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return delayed;
38259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAppVisibility(IBinder token, boolean visible) {
38289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
38299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppVisibility()")) {
3830cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
38319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AppWindowToken wtoken;
38349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
38369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken = findAppWindowToken(token);
38379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null) {
38388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to set visibility of non-existing app token: " + token);
38399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
38409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_APP_TRANSITIONS || DEBUG_ORIENTATION) {
3843b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                RuntimeException e = null;
3844b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (!HIDE_STACK_CRAWLS) {
3845b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    e = new RuntimeException();
3846b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    e.fillInStackTrace();
3847b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                }
38488a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.v(TAG, "setAppVisibility(" + token + ", " + visible
38499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + "): mNextAppTransition=" + mNextAppTransition
38509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " hidden=" + wtoken.hidden
38519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " hiddenRequested=" + wtoken.hiddenRequested, e);
38529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
385306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
38549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If we are preparing an app transition, then delay changing
38559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // the visibility of this token until we execute that transition.
3856b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn            if (!mDisplayFrozen && mPolicy.isScreenOn()
3857b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                    && mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
38589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Already in requested state, don't do anything more.
38599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wtoken.hiddenRequested != visible) {
38609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
38619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.hiddenRequested = !visible;
386306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
38648a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_APP_TRANSITIONS) Slog.v(
38659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        TAG, "Setting dummy animation on: " + wtoken);
38669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.setDummyAnimation();
38679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOpeningApps.remove(wtoken);
38689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mClosingApps.remove(wtoken);
3869a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                wtoken.waitingToShow = wtoken.waitingToHide = false;
38709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.inPendingTransaction = true;
38719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (visible) {
38729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mOpeningApps.add(wtoken);
38739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wtoken.startingDisplayed = false;
38749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wtoken.startingMoved = false;
3875ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
3876195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    // If the token is currently hidden (should be the
3877195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    // common case), then we need to set up to wait for
3878195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    // its windows to be ready.
3879195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    if (wtoken.hidden) {
3880195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                        wtoken.allDrawn = false;
3881195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                        wtoken.waitingToShow = true;
3882ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
3883195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                        if (wtoken.clientHidden) {
3884195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            // In the case where we are making an app visible
3885195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            // but holding off for a transition, we still need
3886195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            // to tell the client to make its windows visible so
3887195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            // they get drawn.  Otherwise, we will wait on
3888195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            // performing the transition until all windows have
3889195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            // been drawn, they never will be, and we are sad.
3890195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            wtoken.clientHidden = false;
3891195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            wtoken.sendAppVisibilityToClients();
3892195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                        }
38939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
38949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
38959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mClosingApps.add(wtoken);
3896ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
3897195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    // If the token is currently visible (should be the
3898195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    // common case), then set up to wait for it to be hidden.
3899195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    if (!wtoken.hidden) {
3900195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                        wtoken.waitingToHide = true;
3901195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    }
39029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
39039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
39049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
390506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
39069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long origId = Binder.clearCallingIdentity();
3907e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn            setTokenVisibilityLocked(wtoken, null, visible, WindowManagerPolicy.TRANSIT_UNSET,
3908ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                    true);
39099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.updateReportedVisibilityLocked();
39109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(origId);
39119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void unsetAppFreezingScreenLocked(AppWindowToken wtoken,
39159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean unfreezeSurfaceNow, boolean force) {
39169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wtoken.freezingScreen) {
39178a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_ORIENTATION) Slog.v(TAG, "Clear freezing of " + wtoken
39189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " force=" + force);
39199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = wtoken.allAppWindows.size();
39209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean unfrozeWindows = false;
39219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
39229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState w = wtoken.allAppWindows.get(i);
39239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (w.mAppFreezing) {
39249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mAppFreezing = false;
39259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (w.mSurface != null && !w.mOrientationChanging) {
39269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mOrientationChanging = true;
39279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
39289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    unfrozeWindows = true;
39299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
39309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (force || unfrozeWindows) {
39328a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_ORIENTATION) Slog.v(TAG, "No longer freezing: " + wtoken);
39339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.freezingScreen = false;
39349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppsFreezingScreen--;
39359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (unfreezeSurfaceNow) {
39379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (unfrozeWindows) {
39389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLayoutNeeded = true;
39399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    performLayoutAndPlaceSurfacesLocked();
39409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3941e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                stopFreezingDisplayLocked();
39429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
394506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
39469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startAppFreezingScreenLocked(AppWindowToken wtoken,
39479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int configChanges) {
39489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_ORIENTATION) {
3949b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            RuntimeException e = null;
3950b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            if (!HIDE_STACK_CRAWLS) {
3951b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                e = new RuntimeException();
3952b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                e.fillInStackTrace();
3953b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            }
39548a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.i(TAG, "Set freezing of " + wtoken.appToken
39559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ": hidden=" + wtoken.hidden + " freezing="
39569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + wtoken.freezingScreen, e);
39579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!wtoken.hiddenRequested) {
39599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!wtoken.freezingScreen) {
39609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.freezingScreen = true;
39619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppsFreezingScreen++;
39629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mAppsFreezingScreen == 1) {
396394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    startFreezingDisplayLocked(false);
39649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mH.removeMessages(H.APP_FREEZE_TIMEOUT);
39659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mH.sendMessageDelayed(mH.obtainMessage(H.APP_FREEZE_TIMEOUT),
39669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            5000);
39679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
39689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = wtoken.allAppWindows.size();
39709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
39719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState w = wtoken.allAppWindows.get(i);
39729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mAppFreezing = true;
39739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
397606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
39779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startAppFreezingScreen(IBinder token, int configChanges) {
39789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
39799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppFreezingScreen()")) {
3980cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
39819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
3984b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn            if (configChanges == 0 && !mDisplayFrozen && mPolicy.isScreenOn()) {
39858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_ORIENTATION) Slog.v(TAG, "Skipping set freeze of " + token);
39869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
39879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
398806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
39899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token);
39909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null || wtoken.appToken == null) {
39918a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to freeze screen with non-existing app token: " + wtoken);
39929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
39939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long origId = Binder.clearCallingIdentity();
39959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            startAppFreezingScreenLocked(wtoken, configChanges);
39969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(origId);
39979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
399906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
40009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void stopAppFreezingScreen(IBinder token, boolean force) {
40019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
40029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppFreezingScreen()")) {
4003cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
40049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
40079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token);
40089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null || wtoken.appToken == null) {
40099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
40109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long origId = Binder.clearCallingIdentity();
40128a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_ORIENTATION) Slog.v(TAG, "Clear freezing of " + token
40139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ": hidden=" + wtoken.hidden + " freezing=" + wtoken.freezingScreen);
40149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unsetAppFreezingScreenLocked(wtoken, true, force);
40159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(origId);
40169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
401806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
40199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeAppToken(IBinder token) {
40209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
40219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "removeAppToken()")) {
4022cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
40239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AppWindowToken wtoken = null;
40269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AppWindowToken startingToken = null;
40279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean delayed = false;
40289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long origId = Binder.clearCallingIdentity();
40309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
40319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken basewtoken = mTokenMap.remove(token);
40329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (basewtoken != null && (wtoken=basewtoken.appWindowToken) != null) {
40338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Removing app token: " + wtoken);
4034e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                delayed = setTokenVisibilityLocked(wtoken, null, false,
4035ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                        WindowManagerPolicy.TRANSIT_UNSET, true);
40369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.inPendingTransaction = false;
40379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOpeningApps.remove(wtoken);
4038a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                wtoken.waitingToShow = false;
40399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mClosingApps.contains(wtoken)) {
40409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    delayed = true;
4041bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                } else if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
40429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mClosingApps.add(wtoken);
4043a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    wtoken.waitingToHide = true;
40449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    delayed = true;
40459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
40468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_APP_TRANSITIONS) Slog.v(
40479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        TAG, "Removing app " + wtoken + " delayed=" + delayed
40489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " animation=" + wtoken.animation
40499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " animating=" + wtoken.animating);
40509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (delayed) {
40519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // set the token aside because it has an active animation to be finished
4052f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG,
4053f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            "removeAppToken make exiting: " + wtoken);
40549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mExitingAppTokens.add(wtoken);
40559bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                } else {
40569bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    // Make sure there is no animation running on this token,
40579bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    // so any windows associated with it will be removed as
40589bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    // soon as their animations are complete
40599bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    wtoken.animation = null;
40609bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    wtoken.animating = false;
40619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4062f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG,
4063f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                        "removeAppToken: " + wtoken);
40649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppTokens.remove(wtoken);
40659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.removed = true;
40669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wtoken.startingData != null) {
40679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    startingToken = wtoken;
40689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
40699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                unsetAppFreezingScreenLocked(wtoken, true, true);
40709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mFocusedApp == wtoken) {
40718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_FOCUS) Slog.v(TAG, "Removing focused app token:" + wtoken);
40729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mFocusedApp = null;
40733a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/);
407400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    mInputMonitor.setFocusedAppLw(null);
40759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
40769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
40778a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to remove non-existing app token: " + token);
40789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
407906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
40809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!delayed && wtoken != null) {
40819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.updateReportedVisibilityLocked();
40829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
40859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (startingToken != null) {
40878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Schedule remove starting "
40889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + startingToken + ": app token removed");
40899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Message m = mH.obtainMessage(H.REMOVE_STARTING, startingToken);
40909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendMessage(m);
40919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean tmpRemoveAppWindowsLocked(WindowToken token) {
40959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NW = token.windows.size();
40969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<NW; i++) {
40979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowState win = token.windows.get(i);
40988a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Tmp removing app window " + win);
40999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindows.remove(win);
4100dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            mWindowsChanged = true;
41019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int j = win.mChildWindows.size();
41029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (j > 0) {
41039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                j--;
4104e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState cwin = win.mChildWindows.get(j);
41058a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG,
4106bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                        "Tmp removing child window " + cwin);
4107bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                mWindows.remove(cwin);
41089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NW > 0;
41119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dumpAppTokensLocked() {
41149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=mAppTokens.size()-1; i>=0; i--) {
41158a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.v(TAG, "  #" + i + ": " + mAppTokens.get(i).token);
41169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
411806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
41199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dumpWindowsLocked() {
41209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=mWindows.size()-1; i>=0; i--) {
41218a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.v(TAG, "  #" + i + ": " + mWindows.get(i));
41229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
412406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
41259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int findWindowOffsetLocked(int tokenPos) {
41269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NW = mWindows.size();
41279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (tokenPos >= mAppTokens.size()) {
41299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int i = NW;
41309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (i > 0) {
41319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
4132e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState win = mWindows.get(i);
41339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.getAppToken() != null) {
41349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return i+1;
41359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
41369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (tokenPos > 0) {
41409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Find the first app token below the new position that has
41419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // a window displayed.
41429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final AppWindowToken wtoken = mAppTokens.get(tokenPos-1);
41438a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_REORDER) Slog.v(TAG, "Looking for lower windows @ "
41449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + tokenPos + " -- " + wtoken.token);
4145a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            if (wtoken.sendingToBottom) {
41468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_REORDER) Slog.v(TAG,
4147a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        "Skipping token -- currently sending to bottom");
4148a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                tokenPos--;
4149a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                continue;
4150a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
41519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int i = wtoken.windows.size();
41529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (i > 0) {
41539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
41549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState win = wtoken.windows.get(i);
41559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int j = win.mChildWindows.size();
41569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (j > 0) {
41579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    j--;
4158e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    WindowState cwin = win.mChildWindows.get(j);
4159a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    if (cwin.mSubLayer >= 0) {
41609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int pos=NW-1; pos>=0; pos--) {
41619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (mWindows.get(pos) == cwin) {
41628a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_REORDER) Slog.v(TAG,
41639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "Found child win @" + (pos+1));
41649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                return pos+1;
41659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
41669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
41679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
41689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
41699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int pos=NW-1; pos>=0; pos--) {
41709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mWindows.get(pos) == win) {
41718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_REORDER) Slog.v(TAG, "Found win @" + (pos+1));
41729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return pos+1;
41739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
41749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
41759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            tokenPos--;
41779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
41809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final int reAddWindowLocked(int index, WindowState win) {
41839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NCW = win.mChildWindows.size();
41849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean added = false;
41859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int j=0; j<NCW; j++) {
4186e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState cwin = win.mChildWindows.get(j);
41879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!added && cwin.mSubLayer >= 0) {
41888a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding child window at "
4189bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                        + index + ": " + cwin);
4190f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                win.mRebuilding = false;
41919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindows.add(index, win);
41929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                index++;
41939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                added = true;
41949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41958a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding window at "
4196bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                    + index + ": " + cwin);
4197f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            cwin.mRebuilding = false;
41989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindows.add(index, cwin);
41999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index++;
42009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!added) {
42028a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding window at "
4203bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                    + index + ": " + win);
4204f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            win.mRebuilding = false;
42059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindows.add(index, win);
42069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index++;
42079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4208dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        mWindowsChanged = true;
42099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return index;
42109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
421106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
42129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final int reAddAppWindowsLocked(int index, WindowToken token) {
42139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NW = token.windows.size();
42149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<NW; i++) {
42159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index = reAddWindowLocked(index, token.windows.get(i));
42169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return index;
42189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void moveAppToken(int index, IBinder token) {
42219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
42229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "moveAppToken()")) {
4223cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
42249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
42278a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_REORDER) Slog.v(TAG, "Initial app tokens:");
42289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_REORDER) dumpAppTokensLocked();
42299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final AppWindowToken wtoken = findAppWindowToken(token);
4230f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            if (DEBUG_TOKEN_MOVEMENT || DEBUG_REORDER) Slog.v(TAG,
4231f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    "Start moving token " + wtoken + " initially at "
4232f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    + mAppTokens.indexOf(wtoken));
42339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null || !mAppTokens.remove(wtoken)) {
42348a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempting to reorder token that doesn't exist: "
42359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + token + " (" + wtoken + ")");
42369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
42379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
42389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAppTokens.add(index, wtoken);
42398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_REORDER) Slog.v(TAG, "Moved " + token + " to " + index + ":");
4240f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            else if (DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, "Moved " + token + " to " + index);
42419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_REORDER) dumpAppTokensLocked();
424206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
42439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long origId = Binder.clearCallingIdentity();
42448a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_REORDER) Slog.v(TAG, "Removing windows in " + token + ":");
42459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_REORDER) dumpWindowsLocked();
42469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tmpRemoveAppWindowsLocked(wtoken)) {
42478a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_REORDER) Slog.v(TAG, "Adding windows back in:");
42489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_REORDER) dumpWindowsLocked();
42499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reAddAppWindowsLocked(findWindowOffsetLocked(index), wtoken);
42508a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_REORDER) Slog.v(TAG, "Final window list:");
42519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_REORDER) dumpWindowsLocked();
42523a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
42533a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        false /*updateInputWindows*/);
42549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutNeeded = true;
42552e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                mInputMonitor.setUpdateInputWindowsNeededLw();
42569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                performLayoutAndPlaceSurfacesLocked();
42572e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                mInputMonitor.updateInputWindowsLw(false /*force*/);
42589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
42599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(origId);
42609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void removeAppTokensLocked(List<IBinder> tokens) {
42649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // XXX This should be done more efficiently!
42659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // (take advantage of the fact that both lists should be
42669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // ordered in the same way.)
42679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int N = tokens.size();
42689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
42699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IBinder token = tokens.get(i);
42709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final AppWindowToken wtoken = findAppWindowToken(token);
4271f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            if (DEBUG_REORDER || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG,
4272f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    "Temporarily removing " + wtoken + " from " + mAppTokens.indexOf(wtoken));
42739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mAppTokens.remove(wtoken)) {
42748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempting to reorder token that doesn't exist: "
42759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + token + " (" + wtoken + ")");
42769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
42779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                N--;
42789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
42799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4282a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    private void moveAppWindowsLocked(AppWindowToken wtoken, int tokenPos,
4283a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            boolean updateFocusAndLayout) {
4284a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        // First remove all of the windows from the list.
4285a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        tmpRemoveAppWindowsLocked(wtoken);
4286a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn
4287a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        // Where to start adding?
4288a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        int pos = findWindowOffsetLocked(tokenPos);
4289a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn
4290a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        // And now add them back at the correct place.
4291a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        pos = reAddAppWindowsLocked(pos, wtoken);
4292a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn
4293a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        if (updateFocusAndLayout) {
42942e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown            mInputMonitor.setUpdateInputWindowsNeededLw();
42953a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown            if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
42963a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    false /*updateInputWindows*/)) {
4297a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                assignLayersLocked();
4298a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
4299a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            mLayoutNeeded = true;
4300a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            performLayoutAndPlaceSurfacesLocked();
43012e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown            mInputMonitor.updateInputWindowsLw(false /*force*/);
4302a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        }
4303a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    }
4304a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn
43059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void moveAppWindowsLocked(List<IBinder> tokens, int tokenPos) {
43069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // First remove all of the windows from the list.
43079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = tokens.size();
43089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i;
43099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=0; i<N; i++) {
43109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken token = mTokenMap.get(tokens.get(i));
43119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token != null) {
43129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                tmpRemoveAppWindowsLocked(token);
43139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
43149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Where to start adding?
43179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = findWindowOffsetLocked(tokenPos);
43189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // And now add them back at the correct place.
43209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=0; i<N; i++) {
43219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken token = mTokenMap.get(tokens.get(i));
43229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token != null) {
43239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pos = reAddAppWindowsLocked(pos, token);
43249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
43259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43272e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown        mInputMonitor.setUpdateInputWindowsNeededLw();
43283a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
43293a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                false /*updateInputWindows*/)) {
4330a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            assignLayersLocked();
4331a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        }
43329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLayoutNeeded = true;
43339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        performLayoutAndPlaceSurfacesLocked();
43342e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown        mInputMonitor.updateInputWindowsLw(false /*force*/);
43359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //dump();
43379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void moveAppTokensToTop(List<IBinder> tokens) {
43409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
43419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "moveAppTokensToTop()")) {
4342cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
43439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long origId = Binder.clearCallingIdentity();
43469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
43479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            removeAppTokensLocked(tokens);
43489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = tokens.size();
43499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
43509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AppWindowToken wt = findAppWindowToken(tokens.get(i));
43519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wt != null) {
4352f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    if (DEBUG_TOKEN_MOVEMENT || DEBUG_REORDER) Slog.v(TAG,
4353f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            "Adding next to top: " + wt);
43549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAppTokens.add(wt);
4355bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                    if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
4356a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mToTopApps.remove(wt);
4357a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mToBottomApps.remove(wt);
4358a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mToTopApps.add(wt);
4359a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        wt.sendingToBottom = false;
4360a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        wt.sendingToTop = true;
4361a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    }
43629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
43639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4364ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
4365bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn            if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET) {
4366a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                moveAppWindowsLocked(tokens, mAppTokens.size());
4367a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
43689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
43709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void moveAppTokensToBottom(List<IBinder> tokens) {
43739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
43749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "moveAppTokensToBottom()")) {
4375cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
43769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long origId = Binder.clearCallingIdentity();
43799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
43809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            removeAppTokensLocked(tokens);
43819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = tokens.size();
43829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int pos = 0;
43839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
43849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AppWindowToken wt = findAppWindowToken(tokens.get(i));
43859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wt != null) {
4386f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    if (DEBUG_TOKEN_MOVEMENT) Slog.v(TAG,
4387f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            "Adding next to bottom: " + wt + " at " + pos);
43889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAppTokens.add(pos, wt);
4389bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                    if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
4390a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mToTopApps.remove(wt);
4391a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mToBottomApps.remove(wt);
4392a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mToBottomApps.add(i, wt);
4393a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        wt.sendingToTop = false;
4394a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        wt.sendingToBottom = true;
4395a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    }
43969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pos++;
43979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
43989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4399ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
4400bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn            if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET) {
4401a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                moveAppWindowsLocked(tokens, 0);
4402a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
44039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
44059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
44089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Misc IWindowSession methods
44099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
441006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4411284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    private boolean shouldAllowDisableKeyguard()
4412d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller    {
4413284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        // We fail safe and prevent disabling keyguard in the unlikely event this gets
4414284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        // called before DevicePolicyManagerService has started.
4415284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        if (mAllowDisableKeyguard == ALLOW_DISABLE_UNKNOWN) {
4416284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService(
4417284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                    Context.DEVICE_POLICY_SERVICE);
4418284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            if (dpm != null) {
4419284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                mAllowDisableKeyguard = dpm.getPasswordQuality(null)
4420284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                        == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED ?
4421284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                                ALLOW_DISABLE_YES : ALLOW_DISABLE_NO;
4422284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            }
4423284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        }
4424284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        return mAllowDisableKeyguard == ALLOW_DISABLE_YES;
4425d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller    }
4426d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller
44279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void disableKeyguard(IBinder token, String tag) {
4428733fdf34b6a8a8e3983ff7663828a928d3c19944Mike Lockwood        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD)
44299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            != PackageManager.PERMISSION_GRANTED) {
44309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException("Requires DISABLE_KEYGUARD permission");
44319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4432d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller
4433284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        synchronized (mKeyguardTokenWatcher) {
4434284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            mKeyguardTokenWatcher.acquire(token, tag);
4435dd8846886aa21980ecdca7ba42deac4f7ecd8ff0Mike Lockwood        }
44369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void reenableKeyguard(IBinder token) {
4439733fdf34b6a8a8e3983ff7663828a928d3c19944Mike Lockwood        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD)
44409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            != PackageManager.PERMISSION_GRANTED) {
44419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException("Requires DISABLE_KEYGUARD permission");
44429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4443d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller
4444284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        synchronized (mKeyguardTokenWatcher) {
4445284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            mKeyguardTokenWatcher.release(token);
4446284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller
4447284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            if (!mKeyguardTokenWatcher.isAcquired()) {
4448284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // If we are the last one to reenable the keyguard wait until
4449284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // we have actually finished reenabling until returning.
4450284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // It is possible that reenableKeyguard() can be called before
4451284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // the previous disableKeyguard() is handled, in which case
4452284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // neither mKeyguardTokenWatcher.acquired() or released() would
4453284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // be called. In that case mKeyguardDisabled will be false here
4454284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // and we have nothing to wait for.
4455284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                while (mKeyguardDisabled) {
4456284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                    try {
4457284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                        mKeyguardTokenWatcher.wait();
4458284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                    } catch (InterruptedException e) {
4459284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                        Thread.currentThread().interrupt();
44609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
44619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
44629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
44639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
44679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.app.KeyguardManager#exitKeyguardSecurely
44689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
44699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void exitKeyguardSecurely(final IOnKeyguardExitResult callback) {
4470733fdf34b6a8a8e3983ff7663828a928d3c19944Mike Lockwood        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD)
44719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            != PackageManager.PERMISSION_GRANTED) {
44729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException("Requires DISABLE_KEYGUARD permission");
44739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPolicy.exitKeyguardSecurely(new WindowManagerPolicy.OnKeyguardExitResult() {
44759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void onKeyguardExitResult(boolean success) {
44769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
44779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    callback.onKeyguardExitResult(success);
44789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
44799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Client has died, we don't care.
44809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
44819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
44829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        });
44839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean inKeyguardRestrictedInputMode() {
44869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPolicy.inKeyguardRestrictedKeyInputMode();
44879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
448806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4489520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood    public boolean isKeyguardLocked() {
4490520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood        return mPolicy.isKeyguardLocked();
4491520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood    }
4492520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood
4493520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood    public boolean isKeyguardSecure() {
4494520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood        return mPolicy.isKeyguardSecure();
4495520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood    }
4496520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood
4497ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn    public void closeSystemDialogs(String reason) {
4498ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        synchronized(mWindowMap) {
4499ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn            for (int i=mWindows.size()-1; i>=0; i--) {
4500e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState w = mWindows.get(i);
4501ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                if (w.mSurface != null) {
4502ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                    try {
4503ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                        w.mClient.closeSystemDialogs(reason);
4504ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                    } catch (RemoteException e) {
4505ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                    }
4506ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                }
4507ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn            }
4508ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        }
4509ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn    }
4510ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
45119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static float fixScale(float scale) {
45129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (scale < 0) scale = 0;
45139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else if (scale > 20) scale = 20;
45149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return Math.abs(scale);
45159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
451606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAnimationScale(int which, float scale) {
45189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.SET_ANIMATION_SCALE,
45199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAnimationScale()")) {
4520cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires SET_ANIMATION_SCALE permission");
45219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (scale < 0) scale = 0;
45249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else if (scale > 20) scale = 20;
45259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        scale = Math.abs(scale);
45269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
45279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 0: mWindowAnimationScale = fixScale(scale); break;
45289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 1: mTransitionAnimationScale = fixScale(scale); break;
45299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
453006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Persist setting
45329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.obtainMessage(H.PERSIST_ANIMATION_SCALE).sendToTarget();
45339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
453406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAnimationScales(float[] scales) {
45369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.SET_ANIMATION_SCALE,
45379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAnimationScale()")) {
4538cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires SET_ANIMATION_SCALE permission");
45399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (scales != null) {
45429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (scales.length >= 1) {
45439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindowAnimationScale = fixScale(scales[0]);
45449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
45459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (scales.length >= 2) {
45469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTransitionAnimationScale = fixScale(scales[1]);
45479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
45489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
454906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Persist setting
45519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.obtainMessage(H.PERSIST_ANIMATION_SCALE).sendToTarget();
45529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
455306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float getAnimationScale(int which) {
45559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
45569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 0: return mWindowAnimationScale;
45579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 1: return mTransitionAnimationScale;
45589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
45609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
456106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float[] getAnimationScales() {
45639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new float[] { mWindowAnimationScale, mTransitionAnimationScale };
45649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
456506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getSwitchState(int sw) {
45679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
45689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "getSwitchState()")) {
4569cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
45709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45716d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getSwitchState(-1, InputDevice.SOURCE_ANY, sw);
45729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
457306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getSwitchStateForDevice(int devid, int sw) {
45759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
45769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "getSwitchStateForDevice()")) {
4577cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
45789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45796d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getSwitchState(devid, InputDevice.SOURCE_ANY, sw);
45809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
458106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getScancodeState(int sw) {
45839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
45849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "getScancodeState()")) {
4585cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
45869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45876d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getScanCodeState(-1, InputDevice.SOURCE_ANY, sw);
45889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
458906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getScancodeStateForDevice(int devid, int sw) {
45919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
45929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "getScancodeStateForDevice()")) {
4593cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
45949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45956d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getScanCodeState(devid, InputDevice.SOURCE_ANY, sw);
45969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
459706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45981d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    public int getTrackballScancodeState(int sw) {
45991d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
46001d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn                "getTrackballScancodeState()")) {
46011d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
46021d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        }
46036d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getScanCodeState(-1, InputDevice.SOURCE_TRACKBALL, sw);
46041d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    }
46051d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn
46061d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    public int getDPadScancodeState(int sw) {
46071d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
46081d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn                "getDPadScancodeState()")) {
46091d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
46101d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        }
46116d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getScanCodeState(-1, InputDevice.SOURCE_DPAD, sw);
46121d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    }
46131d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn
46149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getKeycodeState(int sw) {
46159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
46169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "getKeycodeState()")) {
4617cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
46189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
46196d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_ANY, sw);
46209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
462106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getKeycodeStateForDevice(int devid, int sw) {
46239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
46249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "getKeycodeStateForDevice()")) {
4625cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
46269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
46276d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getKeyCodeState(devid, InputDevice.SOURCE_ANY, sw);
46289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
462906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46301d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    public int getTrackballKeycodeState(int sw) {
46311d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
46321d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn                "getTrackballKeycodeState()")) {
46331d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
46341d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        }
46356d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_TRACKBALL, sw);
46361d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    }
46371d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn
46381d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    public int getDPadKeycodeState(int sw) {
46391d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
46401d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn                "getDPadKeycodeState()")) {
46411d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
46421d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        }
46436d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_DPAD, sw);
46441d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    }
4645a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown
46469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hasKeys(int[] keycodes, boolean[] keyExists) {
46476d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.hasKeys(-1, InputDevice.SOURCE_ANY, keycodes, keyExists);
46489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
464906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4650a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown    public InputChannel monitorInput(String inputChannelName) {
4651a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
4652a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown                "monitorInput()")) {
4653a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown            throw new SecurityException("Requires READ_INPUT_STATE permission");
4654a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown        }
4655a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown        return mInputManager.monitorInput(inputChannelName);
4656a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown    }
4657a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown
46588d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public InputDevice getInputDevice(int deviceId) {
46598d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return mInputManager.getInputDevice(deviceId);
46608d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
46618d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
46628d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public int[] getInputDeviceIds() {
46638d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return mInputManager.getInputDeviceIds();
46648d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
46658d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
46669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enableScreenAfterBoot() {
46679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
46689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mSystemBooted) {
46699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
46709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
46719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSystemBooted = true;
46729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
467306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        performEnableScreen();
46759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
467606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enableScreenIfNeededLocked() {
46789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDisplayEnabled) {
46799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
46809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
46819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mSystemBooted) {
46829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
46839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
46849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.sendMessage(mH.obtainMessage(H.ENABLE_SCREEN));
46859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
468606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void performEnableScreen() {
46889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
46899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDisplayEnabled) {
46909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
46919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
46929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mSystemBooted) {
46939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
46949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
469506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Don't enable the screen until all existing windows
46979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // have been drawn.
46989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = mWindows.size();
46999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
4700e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState w = mWindows.get(i);
4701f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn                if (w.isVisibleLw() && !w.mObscured && !w.isDrawnLw()) {
47029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
47039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
47049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
470506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
47069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDisplayEnabled = true;
47079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (false) {
47088a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.i(TAG, "ENABLING SCREEN!");
47099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                StringWriter sw = new StringWriter();
47109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PrintWriter pw = new PrintWriter(sw);
47119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                this.dump(null, pw, null);
47128a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.i(TAG, sw.toString());
47139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
47149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
47159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IBinder surfaceFlinger = ServiceManager.getService("SurfaceFlinger");
47169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (surfaceFlinger != null) {
47178a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    //Slog.i(TAG, "******* TELLING SURFACE FLINGER WE ARE BOOTED!");
47189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Parcel data = Parcel.obtain();
47199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.writeInterfaceToken("android.ui.ISurfaceComposer");
47209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    surfaceFlinger.transact(IBinder.FIRST_CALL_TRANSACTION,
47219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            data, null, 0);
47229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.recycle();
47239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
47249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException ex) {
47258a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.e(TAG, "Boot completed: SurfaceFlinger is dead!");
47269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
47279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
472806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
47299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPolicy.enableScreenAfterBoot();
473006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
47319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make sure the last requested orientation has been applied.
4732321ae681cad03d00ad1efc6f06f74268e00172a9Dianne Hackborn        setRotationUnchecked(WindowManagerPolicy.USE_LAST_ROTATION, false,
4733321ae681cad03d00ad1efc6f06f74268e00172a9Dianne Hackborn                mLastRotationFlags | Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE);
47349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
473506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
47369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setInTouchMode(boolean mode) {
47379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
47389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInTouchMode = mode;
47399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47426804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    // TODO: more accounting of which pid(s) turned it on, keep count,
47436804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    // only allow disables from pids which have count on, etc.
47446804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    public void showStrictModeViolation(boolean on) {
47456804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        int pid = Binder.getCallingPid();
47466804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        synchronized(mWindowMap) {
47476804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            // Ignoring requests to enable the red border from clients
47486804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            // which aren't on screen.  (e.g. Broadcast Receivers in
47496804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            // the background..)
47506804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            if (on) {
47516804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                boolean isVisible = false;
47526804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                for (WindowState ws : mWindows) {
47536804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                    if (ws.mSession.mPid == pid && ws.isVisibleLw()) {
47546804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                        isVisible = true;
47556804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                        break;
47566804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                    }
47576804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                }
47586804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                if (!isVisible) {
47596804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                    return;
47606804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                }
47616804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            }
47626804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick
476394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            if (SHOW_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION showStrictModeViolation");
47646804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            Surface.openTransaction();
476594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            try {
476694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                if (mStrictModeFlash == null) {
476794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    mStrictModeFlash = new StrictModeFlash(mDisplay, mFxSession);
476894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                }
476994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                mStrictModeFlash.setVisibility(on);
477094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            } finally {
477194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                Surface.closeTransaction();
477294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                if (SHOW_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION showStrictModeViolation");
47736804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            }
47746804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        }
47756804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    }
47766804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick
4777c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick    public void setStrictModeVisualIndicatorPreference(String value) {
4778c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick        SystemProperties.set(StrictMode.VISUAL_PROPERTY, value);
4779c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick    }
4780c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick
4781e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller    /**
4782e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller     * Takes a snapshot of the screen.  In landscape mode this grabs the whole screen.
4783e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller     * In portrait mode, it grabs the upper region of the screen based on the vertical dimension
4784e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller     * of the target image.
4785e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller     *
4786e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller     * @param width the width of the target bitmap
4787e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller     * @param height the height of the target bitmap
4788e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller     */
4789e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller    public Bitmap screenshotApplications(IBinder appToken, int width, int height) {
47900aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.READ_FRAME_BUFFER,
47910aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                "screenshotApplications()")) {
47920aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            throw new SecurityException("Requires READ_FRAME_BUFFER permission");
47930aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        }
47940aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
47950aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        Bitmap rawss;
47960aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
4797d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn        int maxLayer = 0;
47980aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        final Rect frame = new Rect();
47990aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
48000aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        float scale;
4801e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller        int dw, dh;
48020aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        int rot;
48030aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
48040aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        synchronized(mWindowMap) {
48050aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            long ident = Binder.clearCallingIdentity();
48060aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
480781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn            dw = mAppDisplayWidth;
480881e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn            dh = mAppDisplayHeight;
4809428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn
48100aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            int aboveAppLayer = mPolicy.windowTypeToLayerLw(
48110aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                    WindowManager.LayoutParams.TYPE_APPLICATION) * TYPE_LAYER_MULTIPLIER
48120aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                    + TYPE_LAYER_OFFSET;
48130aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            aboveAppLayer += TYPE_LAYER_MULTIPLIER;
48140aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
4815428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            boolean isImeTarget = mInputMethodTarget != null
4816428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    && mInputMethodTarget.mAppToken != null
4817428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    && mInputMethodTarget.mAppToken.appToken != null
4818428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    && mInputMethodTarget.mAppToken.appToken.asBinder() == appToken;
4819428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn
48200aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            // Figure out the part of the screen that is actually the app.
4821428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            boolean including = false;
4822428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            for (int i=mWindows.size()-1; i>=0; i--) {
48230aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                WindowState ws = mWindows.get(i);
48240aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                if (ws.mSurface == null) {
48250aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                    continue;
48260aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                }
48270aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                if (ws.mLayer >= aboveAppLayer) {
4828d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn                    continue;
4829d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn                }
4830428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                // When we will skip windows: when we are not including
4831428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                // ones behind a window we didn't skip, and we are actually
4832428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                // taking a screenshot of a specific app.
4833428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                if (!including && appToken != null) {
4834428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    // Also, we can possibly skip this window if it is not
4835428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    // an IME target or the application for the screenshot
4836428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    // is not the current IME target.
4837428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    if (!ws.mIsImWindow || !isImeTarget) {
4838428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        // And finally, this window is of no interest if it
4839428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        // is not associated with the screenshot app.
4840428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        if (ws.mAppToken == null || ws.mAppToken.token != appToken) {
4841428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                            continue;
4842428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        }
4843428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    }
4844428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                }
4845428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn
4846428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                // We keep on including windows until we go past a full-screen
4847428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                // window.
4848428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                including = !ws.mIsImWindow && !ws.isFullscreen(dw, dh);
4849428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn
4850d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn                if (maxLayer < ws.mAnimLayer) {
4851d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn                    maxLayer = ws.mAnimLayer;
4852d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn                }
48532aded18b0ef9f189771f70f05091493a44ec46aeJim Miller
48542aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                // Don't include wallpaper in bounds calculation
48552aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                if (!ws.mIsWallpaper) {
4856ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                    final Rect wf = ws.mFrame;
48572aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                    final Rect cr = ws.mContentInsets;
48582aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                    int left = wf.left + cr.left;
48592aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                    int top = wf.top + cr.top;
48602aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                    int right = wf.right - cr.right;
48612aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                    int bottom = wf.bottom - cr.bottom;
48622aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                    frame.union(left, top, right, bottom);
48632aded18b0ef9f189771f70f05091493a44ec46aeJim Miller                }
48640aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            }
48650aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            Binder.restoreCallingIdentity(ident);
48660aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
4867dd962ee1633b1e479bca5eae83744262fb69867fDianne Hackborn            // Constrain frame to the screen size.
4868dd962ee1633b1e479bca5eae83744262fb69867fDianne Hackborn            frame.intersect(0, 0, dw, dh);
4869e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller
4870cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn            if (frame.isEmpty() || maxLayer == 0) {
48710aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                return null;
48720aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            }
48730aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
48740aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            // The screenshot API does not apply the current screen rotation.
48750aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            rot = mDisplay.getRotation();
48760aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            int fw = frame.width();
48770aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            int fh = frame.height();
48780aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
48790aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            // First try reducing to fit in x dimension.
4880e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller            scale = width/(float)fw;
48810aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
48820aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            // The screen shot will contain the entire screen.
4883428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            dw = (int)(dw*scale);
4884428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            dh = (int)(dh*scale);
48850aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            if (rot == Surface.ROTATION_90 || rot == Surface.ROTATION_270) {
48860aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                int tmp = dw;
48870aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                dw = dh;
48880aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                dh = tmp;
48890aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                rot = (rot == Surface.ROTATION_90) ? Surface.ROTATION_270 : Surface.ROTATION_90;
48900aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            }
4891d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn            rawss = Surface.screenshot(dw, dh, 0, maxLayer);
48920aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        }
48930aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
4894cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn        if (rawss == null) {
489588b03bd2e12c10c73e455a7eccf7d1aa324049d7Dianne Hackborn            Log.w(TAG, "Failure taking screenshot for (" + dw + "x" + dh
489688b03bd2e12c10c73e455a7eccf7d1aa324049d7Dianne Hackborn                    + ") to layer " + maxLayer);
4897cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn            return null;
4898cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn        }
4899e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller
4900e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller        Bitmap bm = Bitmap.createBitmap(width, height, rawss.getConfig());
49010aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        Matrix matrix = new Matrix();
49020aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        ScreenRotationAnimation.createRotationMatrix(rot, dw, dh, matrix);
49030aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        matrix.postTranslate(-(int)(frame.left*scale), -(int)(frame.top*scale));
49040aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        Canvas canvas = new Canvas(bm);
49050aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        canvas.drawBitmap(rawss, matrix, null);
49060aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
49070aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        rawss.recycle();
49080aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        return bm;
49090aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn    }
49100aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
4911b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler    public void freezeRotation() {
4912b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION,
49132ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler                "freezeRotation()")) {
4914b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler            throw new SecurityException("Requires SET_ORIENTATION permission");
4915b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        }
4916b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler
49172ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler        if (DEBUG_ORIENTATION) Slog.v(TAG, "freezeRotation: mRotation=" + mRotation);
49182ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler
4919b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        mPolicy.setUserRotationMode(WindowManagerPolicy.USER_ROTATION_LOCKED, mRotation);
4920b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        setRotationUnchecked(WindowManagerPolicy.USE_LAST_ROTATION, false, 0);
4921b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler    }
4922b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler
4923b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler    public void thawRotation() {
4924b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION,
49252ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler                "thawRotation()")) {
4926b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler            throw new SecurityException("Requires SET_ORIENTATION permission");
4927b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        }
4928b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler
49292ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler        if (DEBUG_ORIENTATION) Slog.v(TAG, "thawRotation: mRotation=" + mRotation);
49302ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler
49312ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler        mPolicy.setUserRotationMode(WindowManagerPolicy.USER_ROTATION_FREE, 777); // rot not used
4932b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        setRotationUnchecked(WindowManagerPolicy.USE_LAST_ROTATION, false, 0);
4933b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler    }
4934b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler
493506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy    public void setRotation(int rotation,
49361e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn            boolean alwaysSendConfiguration, int animFlags) {
49379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION,
49381e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn                "setRotation()")) {
4939cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires SET_ORIENTATION permission");
49409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
49419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49421e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn        setRotationUnchecked(rotation, alwaysSendConfiguration, animFlags);
49439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
494406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
49451e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn    public void setRotationUnchecked(int rotation,
49461e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn            boolean alwaysSendConfiguration, int animFlags) {
49478a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if(DEBUG_ORIENTATION) Slog.v(TAG,
4948910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner                   "setRotationUnchecked(rotation=" + rotation +
4949910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner                   " alwaysSendConfiguration=" + alwaysSendConfiguration +
4950910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner                   " animFlags=" + animFlags);
495106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
49529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long origId = Binder.clearCallingIdentity();
49539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean changed;
49549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
495594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            changed = setRotationUncheckedLocked(rotation, animFlags, false);
49569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
495706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4958e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        if (changed || alwaysSendConfiguration) {
49599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendNewConfiguration();
49609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
496106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
49629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
49639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
496406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4965e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    /**
4966e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * Apply a new rotation to the screen, respecting the requests of
4967e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * applications.  Use WindowManagerPolicy.USE_LAST_ROTATION to simply
4968e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * re-evaluate the desired rotation.
4969e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     *
4970e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * Returns null if the rotation has been changed.  In this case YOU
4971e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * MUST CALL setNewConfiguration() TO UNFREEZE THE SCREEN.
4972e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     */
497394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn    public boolean setRotationUncheckedLocked(int rotation, int animFlags, boolean inTransaction) {
497489ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        if (mDragState != null || mScreenRotationAnimation != null) {
4975ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate            // Potential rotation during a drag.  Don't do the rotation now, but make
4976ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate            // a note to perform the rotation later.
497789ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            if (DEBUG_ORIENTATION) Slog.v(TAG, "Deferring rotation.");
497889ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            if (rotation != WindowManagerPolicy.USE_LAST_ROTATION) {
497989ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                mDeferredRotation = rotation;
498089ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                mDeferredRotationAnimFlags = animFlags;
498189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            }
4982ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate            return false;
4983ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate        }
4984ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate
49859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean changed;
49869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (rotation == WindowManagerPolicy.USE_LAST_ROTATION) {
498789ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            if (mDeferredRotation != WindowManagerPolicy.USE_LAST_ROTATION) {
498889ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                rotation = mDeferredRotation;
498989ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                mRequestedRotation = rotation;
499089ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                mLastRotationFlags = mDeferredRotationAnimFlags;
499189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            }
49929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            rotation = mRequestedRotation;
49939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
49949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRequestedRotation = rotation;
4995321ae681cad03d00ad1efc6f06f74268e00172a9Dianne Hackborn            mLastRotationFlags = animFlags;
49969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
499789ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        mDeferredRotation = WindowManagerPolicy.USE_LAST_ROTATION;
49988a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_ORIENTATION) Slog.v(TAG, "Overwriting rotation value from " + rotation);
4999c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        rotation = mPolicy.rotationForOrientationLw(mForcedAppOrientation,
50009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRotation, mDisplayEnabled);
50018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_ORIENTATION) Slog.v(TAG, "new rotation is set to " + rotation);
500268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn
500368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        int desiredRotation = rotation;
500468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        int lockedRotation = mPolicy.getLockedRotationLw();
500568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        if (lockedRotation >= 0 && rotation != lockedRotation) {
500668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            // We are locked in a rotation but something is requesting
500768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            // a different rotation...  we will either keep the locked
500868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            // rotation if it results in the same orientation, or have to
500968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            // switch into an emulated orientation mode.
501068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn
501168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            // First, we know that our rotation is actually going to be
501268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            // the locked rotation.
501368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            rotation = lockedRotation;
501468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn
501568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            // Now the difference between the desired and lockedRotation
501668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            // may mean that the orientation is different...  if that is
501768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            // not the case, we can just make the desired rotation be the
501868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            // same as the new locked rotation.
501968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            switch (lockedRotation) {
502068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                case Surface.ROTATION_0:
502168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                    if (rotation == Surface.ROTATION_180) {
502268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                        desiredRotation = lockedRotation;
502368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                    }
502468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                    break;
502568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                case Surface.ROTATION_90:
502668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                    if (rotation == Surface.ROTATION_270) {
502768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                        desiredRotation = lockedRotation;
502868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                    }
502968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                    break;
503068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                case Surface.ROTATION_180:
503168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                    if (rotation == Surface.ROTATION_0) {
503268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                        desiredRotation = lockedRotation;
503368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                    }
503468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                    break;
503568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                case Surface.ROTATION_270:
503668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                    if (rotation == Surface.ROTATION_90) {
503768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                        desiredRotation = lockedRotation;
503868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                    }
503968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                    break;
504068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            }
504168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        }
504268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn
50439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        changed = mDisplayEnabled && mRotation != rotation;
504468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        if (mAltOrientation != (rotation != desiredRotation)) {
504568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            changed = true;
504668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            mAltOrientation = rotation != desiredRotation;
504768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        }
504806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
50499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (changed) {
50508a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_ORIENTATION) Slog.v(TAG,
50519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Rotation changed to " + rotation
50529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " from " + mRotation
50539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " (forceApp=" + mForcedAppOrientation
50549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ", req=" + mRequestedRotation + ")");
50559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRotation = rotation;
50569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowsFreezingScreen = true;
50579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT);
50589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendMessageDelayed(mH.obtainMessage(H.WINDOW_FREEZE_TIMEOUT),
50599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    2000);
5060e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            mWaitingForConfig = true;
5061e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            mLayoutNeeded = true;
506294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            startFreezingDisplayLocked(inTransaction);
50635fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            //Slog.i(TAG, "Setting rotation to " + rotation + ", animFlags=" + animFlags);
506400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            mInputManager.setDisplayOrientation(0, rotation);
50659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDisplayEnabled) {
5066910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner                // NOTE: We disable the rotation in the emulator because
5067910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner                //       it doesn't support hardware OpenGL emulation yet.
5068de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                if (CUSTOM_SCREEN_ROTATION && mScreenRotationAnimation != null
5069de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                        && mScreenRotationAnimation.hasScreenshot()) {
5070a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn                    Surface.freezeDisplay(0);
507194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    if (!inTransaction) {
507294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        if (SHOW_TRANSACTIONS) Slog.i(TAG,
507394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                                ">>> OPEN TRANSACTION setRotationUnchecked");
507494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        Surface.openTransaction();
507594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    }
507694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    try {
507794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        if (mScreenRotationAnimation != null) {
507894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                            mScreenRotationAnimation.setRotation(rotation);
507994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        }
508094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    } finally {
508194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        if (!inTransaction) {
508294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                            Surface.closeTransaction();
508394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                            if (SHOW_TRANSACTIONS) Slog.i(TAG,
508494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                                    "<<< CLOSE TRANSACTION setRotationUnchecked");
508594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        }
5086a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn                    }
5087a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn                    Surface.setOrientation(0, rotation, animFlags);
5088a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn                    Surface.unfreezeDisplay(0);
5089a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn                } else {
5090a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn                    Surface.setOrientation(0, rotation, animFlags);
5091a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn                }
50927916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                rebuildBlackFrame(inTransaction);
50939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
509468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn
50959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=mWindows.size()-1; i>=0; i--) {
5096e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState w = mWindows.get(i);
50979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (w.mSurface != null) {
50989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mOrientationChanging = true;
50999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
51009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
51019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=mRotationWatchers.size()-1; i>=0; i--) {
51029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
51039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRotationWatchers.get(i).onRotationChanged(rotation);
51049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
51059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
51069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
51079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } //end if changed
510806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
51099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return changed;
51109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
511106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
51129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getRotation() {
51139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRotation;
51149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
51159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int watchRotation(IRotationWatcher watcher) {
51179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final IBinder watcherBinder = watcher.asBinder();
51189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IBinder.DeathRecipient dr = new IBinder.DeathRecipient() {
51199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void binderDied() {
51209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (mWindowMap) {
51219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i=0; i<mRotationWatchers.size(); i++) {
51229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (watcherBinder == mRotationWatchers.get(i).asBinder()) {
5123fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu                            IRotationWatcher removed = mRotationWatchers.remove(i);
5124fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu                            if (removed != null) {
5125fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu                                removed.asBinder().unlinkToDeath(this, 0);
5126fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu                            }
51279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            i--;
51289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
51299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
51309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
51319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
51329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
513306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
51349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
51359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
51369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                watcher.asBinder().linkToDeath(dr, 0);
51379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRotationWatchers.add(watcher);
51389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
51399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Client died, no cleanup needed.
51409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
514106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
51429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mRotation;
51439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
51459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
51479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Starts the view server on the specified port.
51489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
51499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param port The port to listener to.
51509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
51519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the server was successfully started, false otherwise.
51529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5153a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn     * @see com.android.server.wm.ViewServer
5154a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn     * @see com.android.server.wm.ViewServer#VIEW_SERVER_DEFAULT_PORT
51559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
51569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean startViewServer(int port) {
515706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy        if (isSystemSecure()) {
51589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
51599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(Manifest.permission.DUMP, "startViewServer")) {
51629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
51639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (port < 1024) {
51669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
51679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mViewServer != null) {
51709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mViewServer.isRunning()) {
51719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
51729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mViewServer.start();
51739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IOException e) {
51748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "View server did not start");
51759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
51769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
51779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
51789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
51819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mViewServer = new ViewServer(this, port);
51829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mViewServer.start();
51839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
51848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "View server did not start");
51859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
51879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
51889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
518906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy    private boolean isSystemSecure() {
519006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy        return "1".equals(SystemProperties.get(SYSTEM_SECURE, "1")) &&
519106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                "0".equals(SystemProperties.get(SYSTEM_DEBUGGABLE, "0"));
519206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy    }
519306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
51949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
51959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Stops the view server if it exists.
51969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
51979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the server stopped, false if it wasn't started or
51989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         couldn't be stopped.
51999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5200a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn     * @see com.android.server.wm.ViewServer
52019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
52029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean stopViewServer() {
520306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy        if (isSystemSecure()) {
52049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
52059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(Manifest.permission.DUMP, "stopViewServer")) {
52089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
52099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mViewServer != null) {
52129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mViewServer.stop();
52139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
52159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
52169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
52189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether the view server is running.
52199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
52209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the server is running, false otherwise.
52219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5222a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn     * @see com.android.server.wm.ViewServer
52239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
52249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isViewServerRunning() {
522506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy        if (isSystemSecure()) {
52269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
52279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(Manifest.permission.DUMP, "isViewServerRunning")) {
52309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
52319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mViewServer != null && mViewServer.isRunning();
52349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
52359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
52379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Lists all availble windows in the system. The listing is written in the
52389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * specified Socket's output stream with the following syntax:
52399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * windowHashCodeInHexadecimal windowName
52409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Each line of the ouput represents a different window.
52419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
52429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param client The remote client to send the listing to.
52439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return False if an error occured, true otherwise.
52449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
52459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean viewServerListWindows(Socket client) {
524606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy        if (isSystemSecure()) {
52479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
52489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean result = true;
52519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5252e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        WindowState[] windows;
52539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
52549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //noinspection unchecked
5255e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            windows = mWindows.toArray(new WindowState[mWindows.size()]);
52569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        BufferedWriter out = null;
52599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Any uncaught exception will crash the system process
52619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
52629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            OutputStream clientStream = client.getOutputStream();
52639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out = new BufferedWriter(new OutputStreamWriter(clientStream), 8 * 1024);
52649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int count = windows.length;
52669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < count; i++) {
5267e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                final WindowState w = windows[i];
52689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.write(Integer.toHexString(System.identityHashCode(w)));
52699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.write(' ');
52709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.append(w.mAttrs.getTitle());
52719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.write('\n');
52729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.write("DONE.\n");
52759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.flush();
52769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
52779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            result = false;
52789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
52799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (out != null) {
52809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
52819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.close();
52829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IOException e) {
52839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    result = false;
52849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
52859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
52899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
52909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5292f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev     * Returns the focused window in the following format:
5293f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev     * windowHashCodeInHexadecimal windowName
5294f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev     *
5295f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev     * @param client The remote client to send the listing to.
5296f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev     * @return False if an error occurred, true otherwise.
5297f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev     */
5298f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev    boolean viewServerGetFocusedWindow(Socket client) {
5299f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        if (isSystemSecure()) {
5300f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            return false;
5301f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        }
5302f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev
5303f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        boolean result = true;
5304f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev
5305f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        WindowState focusedWindow = getFocusedWindow();
5306f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev
5307f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        BufferedWriter out = null;
5308f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev
5309f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        // Any uncaught exception will crash the system process
5310f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        try {
5311f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            OutputStream clientStream = client.getOutputStream();
5312f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            out = new BufferedWriter(new OutputStreamWriter(clientStream), 8 * 1024);
5313f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev
5314f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            if(focusedWindow != null) {
5315f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev                out.write(Integer.toHexString(System.identityHashCode(focusedWindow)));
5316f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev                out.write(' ');
5317f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev                out.append(focusedWindow.mAttrs.getTitle());
5318f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            }
5319f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            out.write('\n');
5320f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            out.flush();
5321f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        } catch (Exception e) {
5322f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            result = false;
53239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
53249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (out != null) {
53259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
53269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.close();
53279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IOException e) {
53289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    result = false;
53299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
53309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
53319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
53329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
53349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
53359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
53379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sends a command to a target window. The result of the command, if any, will be
53389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * written in the output stream of the specified socket.
53399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
53409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The parameters must follow this syntax:
53419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * windowHashcode extra
53429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
53439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Where XX is the length in characeters of the windowTitle.
53449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
53459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The first parameter is the target window. The window with the specified hashcode
53469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be the target. If no target can be found, nothing happens. The extra parameters
53479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be delivered to the target window and as parameters to the command itself.
53489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
53499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param client The remote client to sent the result, if any, to.
53509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param command The command to execute.
53519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param parameters The command parameters.
53529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
53539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the command was successfully delivered, false otherwise. This does
53549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         not indicate whether the command itself was successful.
53559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
53569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean viewServerWindowCommand(Socket client, String command, String parameters) {
535706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy        if (isSystemSecure()) {
53589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
53599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
53609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean success = true;
53629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data = null;
53639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel reply = null;
53649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
536543b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev        BufferedWriter out = null;
536643b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev
53679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Any uncaught exception will crash the system process
53689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
53699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Find the hashcode of the window
53709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int index = parameters.indexOf(' ');
53719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (index == -1) {
53729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                index = parameters.length();
53739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
53749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final String code = parameters.substring(0, index);
5375236092a36216c79507ec19eb207831810caced19Romain Guy            int hashCode = (int) Long.parseLong(code, 16);
53769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Extract the command's parameter after the window description
53789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (index < parameters.length()) {
53799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                parameters = parameters.substring(index + 1);
53809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
53819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                parameters = "";
53829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
53839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            final WindowState window = findWindow(hashCode);
53859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (window == null) {
53869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
53879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
53889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data = Parcel.obtain();
53909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.writeInterfaceToken("android.view.IWindow");
53919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.writeString(command);
53929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.writeString(parameters);
53939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.writeInt(1);
53949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ParcelFileDescriptor.fromSocket(client).writeToParcel(data, 0);
53959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply = Parcel.obtain();
53979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final IBinder binder = window.mClient.asBinder();
53999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // TODO: GET THE TRANSACTION CODE IN A SAFER MANNER
54009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            binder.transact(IBinder.FIRST_CALL_TRANSACTION, data, reply, 0);
54019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply.readException();
54039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
540443b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev            if (!client.isOutputShutdown()) {
540543b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
540643b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                out.write("DONE\n");
540743b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                out.flush();
540843b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev            }
540943b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev
54109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
54118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Could not send command " + command + " with parameters " + parameters, e);
54129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            success = false;
54139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
54149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (data != null) {
54159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                data.recycle();
54169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
54179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (reply != null) {
54189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reply.recycle();
54199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
542043b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev            if (out != null) {
542143b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                try {
542243b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                    out.close();
542343b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                } catch (IOException e) {
542443b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev
542543b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                }
542643b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev            }
54279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
54289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return success;
54309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
54319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5432dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    public void addWindowChangeListener(WindowChangeListener listener) {
5433dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        synchronized(mWindowMap) {
5434dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            mWindowChangeListeners.add(listener);
5435dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        }
5436dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    }
5437dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev
5438dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    public void removeWindowChangeListener(WindowChangeListener listener) {
5439dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        synchronized(mWindowMap) {
5440dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            mWindowChangeListeners.remove(listener);
5441dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        }
5442dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    }
5443dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev
5444dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    private void notifyWindowsChanged() {
5445dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        WindowChangeListener[] windowChangeListeners;
5446dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        synchronized(mWindowMap) {
5447dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            if(mWindowChangeListeners.isEmpty()) {
5448dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                return;
5449dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            }
5450dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            windowChangeListeners = new WindowChangeListener[mWindowChangeListeners.size()];
5451dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            windowChangeListeners = mWindowChangeListeners.toArray(windowChangeListeners);
5452dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        }
5453dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        int N = windowChangeListeners.length;
5454dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        for(int i = 0; i < N; i++) {
5455dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            windowChangeListeners[i].windowsChanged();
5456dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        }
5457dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    }
5458dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev
54596e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev    private void notifyFocusChanged() {
54606e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        WindowChangeListener[] windowChangeListeners;
54616e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        synchronized(mWindowMap) {
54626e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev            if(mWindowChangeListeners.isEmpty()) {
54636e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev                return;
54646e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev            }
54656e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev            windowChangeListeners = new WindowChangeListener[mWindowChangeListeners.size()];
54666e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev            windowChangeListeners = mWindowChangeListeners.toArray(windowChangeListeners);
54676e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        }
54686e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        int N = windowChangeListeners.length;
54696e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        for(int i = 0; i < N; i++) {
54706e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev            windowChangeListeners[i].focusChanged();
54716e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        }
54726e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev    }
54736e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev
54749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowState findWindow(int hashCode) {
54759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (hashCode == -1) {
54769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getFocusedWindow();
54779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
54789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
5480e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            final ArrayList<WindowState> windows = mWindows;
54819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int count = windows.size();
54829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < count; i++) {
5484e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState w = windows.get(i);
54859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (System.identityHashCode(w) == hashCode) {
54869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return w;
54879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
54889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
54899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
54909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
54929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
54939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
54959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Instruct the Activity Manager to fetch the current configuration and broadcast
54969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that to config-changed listeners if appropriate.
54979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
54989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void sendNewConfiguration() {
54999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
55009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mActivityManager.updateConfiguration(null);
55019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
55029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
550406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
55059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Configuration computeNewConfiguration() {
55069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
550794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            Configuration config = computeNewConfigurationLocked();
550894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            if (config == null && mWaitingForConfig) {
550994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                // Nothing changed but we are waiting for something... stop that!
551094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                mWaitingForConfig = false;
551194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                performLayoutAndPlaceSurfacesLocked();
551294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            }
551394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            return config;
5514c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        }
5515c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn    }
551606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
5517c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn    Configuration computeNewConfigurationLocked() {
5518c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        Configuration config = new Configuration();
5519c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        if (!computeNewConfigurationLocked(config)) {
5520c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn            return null;
5521c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        }
5522c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        return config;
5523c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn    }
552406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
552569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    private int reduceConfigWidthSize(int curSize, int rotation, float density, int dw) {
552669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        int size = (int)(mPolicy.getConfigDisplayWidth(rotation, dw) / density);
552769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        if (size < curSize) {
552869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn            curSize = size;
552969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        }
553069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        return curSize;
553169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    }
553269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn
55335fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    private int computeSmallestWidth(boolean rotated, int dw, int dh, float density) {
55345fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        // We need to determine the smallest width that will occur under normal
55355fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        // operation.  To this, start with the base screen size and compute the
55365fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        // width under the different possible rotations.  We need to un-rotate
55375fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        // the current screen dimensions before doing this.
55385fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        int unrotDw, unrotDh;
55395fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        if (rotated) {
55405fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            unrotDw = dh;
55415fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            unrotDh = dw;
55425fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        } else {
55435fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            unrotDw = dw;
55445fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            unrotDh = dh;
55455fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        }
55465fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        int sw = reduceConfigWidthSize(unrotDw, Surface.ROTATION_0, density, unrotDw);
55475fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        sw = reduceConfigWidthSize(sw, Surface.ROTATION_90, density, unrotDh);
55485fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        sw = reduceConfigWidthSize(sw, Surface.ROTATION_180, density, unrotDw);
55495fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        sw = reduceConfigWidthSize(sw, Surface.ROTATION_270, density, unrotDh);
55505fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        return sw;
55515fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    }
55525fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
555348a7651823030ed3c0f4c084b423430044425feaDianne Hackborn    private int reduceCompatConfigWidthSize(int curSize, int rotation, DisplayMetrics dm,
555448a7651823030ed3c0f4c084b423430044425feaDianne Hackborn            int dw, int dh) {
555548a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        dm.unscaledWidthPixels = mPolicy.getNonDecorDisplayWidth(rotation, dw);
555648a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        dm.unscaledHeightPixels = mPolicy.getNonDecorDisplayHeight(rotation, dh);
555748a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        float scale = CompatibilityInfo.computeCompatibleScaling(dm, null);
555848a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        int size = (int)(((dm.unscaledWidthPixels / scale) / dm.density) + .5f);
555948a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        if (curSize == 0 || size < curSize) {
556048a7651823030ed3c0f4c084b423430044425feaDianne Hackborn            curSize = size;
556148a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        }
556248a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        return curSize;
556348a7651823030ed3c0f4c084b423430044425feaDianne Hackborn    }
556448a7651823030ed3c0f4c084b423430044425feaDianne Hackborn
556548a7651823030ed3c0f4c084b423430044425feaDianne Hackborn    private int computeCompatSmallestWidth(boolean rotated, DisplayMetrics dm, int dw, int dh) {
556648a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        mTmpDisplayMetrics.setTo(dm);
556748a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        dm = mTmpDisplayMetrics;
556848a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        int unrotDw, unrotDh;
556948a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        if (rotated) {
557048a7651823030ed3c0f4c084b423430044425feaDianne Hackborn            unrotDw = dh;
557148a7651823030ed3c0f4c084b423430044425feaDianne Hackborn            unrotDh = dw;
557248a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        } else {
557348a7651823030ed3c0f4c084b423430044425feaDianne Hackborn            unrotDw = dw;
557448a7651823030ed3c0f4c084b423430044425feaDianne Hackborn            unrotDh = dh;
557548a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        }
557648a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        int sw = reduceCompatConfigWidthSize(0, Surface.ROTATION_0, dm, unrotDw, unrotDh);
557748a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        sw = reduceCompatConfigWidthSize(sw, Surface.ROTATION_90, dm, unrotDh, unrotDw);
557848a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        sw = reduceCompatConfigWidthSize(sw, Surface.ROTATION_180, dm, unrotDw, unrotDh);
557948a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        sw = reduceCompatConfigWidthSize(sw, Surface.ROTATION_270, dm, unrotDh, unrotDw);
558048a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        return sw;
558148a7651823030ed3c0f4c084b423430044425feaDianne Hackborn    }
558248a7651823030ed3c0f4c084b423430044425feaDianne Hackborn
5583c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn    boolean computeNewConfigurationLocked(Configuration config) {
5584c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        if (mDisplay == null) {
5585c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn            return false;
55869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
558700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown
558800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        mInputManager.getInputConfiguration(config);
5589b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate
5590b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        // Use the effective "visual" dimensions based on current rotation
5591b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        final boolean rotated = (mRotation == Surface.ROTATION_90
5592b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate                || mRotation == Surface.ROTATION_270);
55937916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        final int realdw = rotated ? mBaseDisplayHeight : mBaseDisplayWidth;
55947916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        final int realdh = rotated ? mBaseDisplayWidth : mBaseDisplayHeight;
559568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn
559668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        if (mAltOrientation) {
559768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            mCurDisplayWidth = realdw;
559868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            mCurDisplayHeight = realdh;
559968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            if (realdw > realdh) {
560068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                // Turn landscape into portrait.
560168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                int maxw = (int)(realdh/1.3f);
560268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                if (maxw < realdw) {
560368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                    mCurDisplayWidth = maxw;
560468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                }
560568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            } else {
560668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                // Turn portrait into landscape.
560768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                int maxh = (int)(realdw/1.3f);
560868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                if (maxh < realdh) {
560968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                    mCurDisplayHeight = maxh;
561068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                }
561168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            }
561268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        } else {
561368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            mCurDisplayWidth = realdw;
561468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            mCurDisplayHeight = realdh;
561568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        }
561668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn
561768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        final int dw = mCurDisplayWidth;
561868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        final int dh = mCurDisplayHeight;
5619b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate
5620c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        int orientation = Configuration.ORIENTATION_SQUARE;
5621c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        if (dw < dh) {
5622c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn            orientation = Configuration.ORIENTATION_PORTRAIT;
5623c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        } else if (dw > dh) {
5624c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn            orientation = Configuration.ORIENTATION_LANDSCAPE;
5625c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        }
5626c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        config.orientation = orientation;
5627ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
56285fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        DisplayMetrics dm = mDisplayMetrics;
562968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        mDisplay.getRealMetrics(dm);
563068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn
563168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        // Override display width and height with what we are computing,
563268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        // to be sure they remain consistent.
563381e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        dm.widthPixels = dm.unscaledWidthPixels = mAppDisplayWidth
563481e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn                = mPolicy.getNonDecorDisplayWidth(mRotation, dw);
563581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        dm.heightPixels = dm.unscaledHeightPixels = mAppDisplayHeight
563681e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn                = mPolicy.getNonDecorDisplayHeight(mRotation, dh);
563768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn
56385fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        mCompatibleScreenScale = CompatibilityInfo.computeCompatibleScaling(dm,
56395fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                mCompatDisplayMetrics);
56401ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
564169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        config.screenWidthDp = (int)(mPolicy.getConfigDisplayWidth(mRotation, dw) / dm.density);
564269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        config.screenHeightDp = (int)(mPolicy.getConfigDisplayHeight(mRotation, dh) / dm.density);
56435fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        config.smallestScreenWidthDp = computeSmallestWidth(rotated, dw, dh, dm.density);
56445fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
56455fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        config.compatScreenWidthDp = (int)(config.screenWidthDp / mCompatibleScreenScale);
56465fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        config.compatScreenHeightDp = (int)(config.screenHeightDp / mCompatibleScreenScale);
564748a7651823030ed3c0f4c084b423430044425feaDianne Hackborn        config.compatSmallestScreenWidthDp = computeCompatSmallestWidth(rotated, dm, dw, dh);
564869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn
564969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        // We need to determine the smallest width that will occur under normal
565069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        // operation.  To this, start with the base screen size and compute the
565169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        // width under the different possible rotations.  We need to un-rotate
565269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        // the current screen dimensions before doing this.
565369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        int unrotDw, unrotDh;
565469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        if (rotated) {
565569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn            unrotDw = dh;
565669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn            unrotDh = dw;
565769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        } else {
565869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn            unrotDw = dw;
565969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn            unrotDh = dh;
566069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        }
566169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        config.smallestScreenWidthDp = reduceConfigWidthSize(unrotDw,
566269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn                Surface.ROTATION_0, dm.density, unrotDw);
566369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        config.smallestScreenWidthDp = reduceConfigWidthSize(config.smallestScreenWidthDp,
566469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn                Surface.ROTATION_90, dm.density, unrotDh);
566569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        config.smallestScreenWidthDp = reduceConfigWidthSize(config.smallestScreenWidthDp,
566669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn                Surface.ROTATION_180, dm.density, unrotDw);
566769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn        config.smallestScreenWidthDp = reduceConfigWidthSize(config.smallestScreenWidthDp,
566869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn                Surface.ROTATION_270, dm.density, unrotDh);
5669ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn
567068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        // Compute the screen layout size class.
567168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        int screenLayout;
567268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        int longSize = dw;
567368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        int shortSize = dh;
567468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        if (longSize < shortSize) {
567568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            int tmp = longSize;
567668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            longSize = shortSize;
567768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            shortSize = tmp;
567868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        }
567968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        longSize = (int)(longSize/dm.density);
568068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        shortSize = (int)(shortSize/dm.density);
568168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn
568268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        // These semi-magic numbers define our compatibility modes for
568368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        // applications with different screens.  These are guarantees to
568468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        // app developers about the space they can expect for a particular
568568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        // configuration.  DO NOT CHANGE!
568668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        if (longSize < 470) {
568768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            // This is shorter than an HVGA normal density screen (which
568868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            // is 480 pixels on its long side).
568968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            screenLayout = Configuration.SCREENLAYOUT_SIZE_SMALL
569068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                    | Configuration.SCREENLAYOUT_LONG_NO;
569168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        } else {
569268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            // What size is this screen screen?
569368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            if (longSize >= 960 && shortSize >= 720) {
569468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                // 1.5xVGA or larger screens at medium density are the point
569568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                // at which we consider it to be an extra large screen.
569668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                screenLayout = Configuration.SCREENLAYOUT_SIZE_XLARGE;
569768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            } else if (longSize >= 640 && shortSize >= 480) {
569868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                // VGA or larger screens at medium density are the point
569968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                // at which we consider it to be a large screen.
570068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                screenLayout = Configuration.SCREENLAYOUT_SIZE_LARGE;
5701723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            } else {
570268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                screenLayout = Configuration.SCREENLAYOUT_SIZE_NORMAL;
570368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            }
5704ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
570568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            // If this screen is wider than normal HVGA, or taller
570668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            // than FWVGA, then for old apps we want to run in size
570768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            // compatibility mode.
570868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            if (shortSize > 321 || longSize > 570) {
570968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                screenLayout |= Configuration.SCREENLAYOUT_COMPAT_NEEDED;
571068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            }
571168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn
571268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            // Is this a long screen?
571368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            if (((longSize*3)/5) >= (shortSize-1)) {
571468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                // Anything wider than WVGA (5:3) is considering to be long.
571568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                screenLayout |= Configuration.SCREENLAYOUT_LONG_YES;
571668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn            } else {
571768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                screenLayout |= Configuration.SCREENLAYOUT_LONG_NO;
5718723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            }
5719723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        }
572068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        config.screenLayout = screenLayout;
5721ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
5722597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        // Determine whether a hard keyboard is available and enabled.
57232992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        boolean hardKeyboardAvailable = config.keyboard != Configuration.KEYBOARD_NOKEYS;
57242992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        if (hardKeyboardAvailable != mHardKeyboardAvailable) {
57252992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            mHardKeyboardAvailable = hardKeyboardAvailable;
57262992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            mHardKeyboardEnabled = hardKeyboardAvailable;
57272992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
57282992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            mH.removeMessages(H.REPORT_HARD_KEYBOARD_STATUS_CHANGE);
57292992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            mH.sendEmptyMessage(H.REPORT_HARD_KEYBOARD_STATUS_CHANGE);
57302992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
57312992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        if (!mHardKeyboardEnabled) {
57322992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            config.keyboard = Configuration.KEYBOARD_NOKEYS;
57332992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
5734597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown
5735597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        // Update value of keyboardHidden, hardKeyboardHidden and navigationHidden
5736597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        // based on whether a hard or soft keyboard is present, whether navigation keys
5737597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        // are present and the lid switch state.
5738597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        config.keyboardHidden = Configuration.KEYBOARDHIDDEN_NO;
5739597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_NO;
5740597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        config.navigationHidden = Configuration.NAVIGATIONHIDDEN_NO;
5741597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        mPolicy.adjustConfigurationLw(config);
5742c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        return true;
57439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5744a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
57452992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    public boolean isHardKeyboardAvailable() {
57462992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        synchronized (mWindowMap) {
57472992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            return mHardKeyboardAvailable;
57482992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
57492992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
57502992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
57512992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    public boolean isHardKeyboardEnabled() {
57522992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        synchronized (mWindowMap) {
57532992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            return mHardKeyboardEnabled;
57542992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
57552992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
57562992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
57572992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    public void setHardKeyboardEnabled(boolean enabled) {
57582992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        synchronized (mWindowMap) {
57592992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            if (mHardKeyboardEnabled != enabled) {
57602992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                mHardKeyboardEnabled = enabled;
57612992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
57622992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            }
57632992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
57642992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
57652992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
57662992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    public void setOnHardKeyboardStatusChangeListener(
57672992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            OnHardKeyboardStatusChangeListener listener) {
57682992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        synchronized (mWindowMap) {
57692992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            mHardKeyboardStatusChangeListener = listener;
57702992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
57712992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
57722992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
57732992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    void notifyHardKeyboardStatusChange() {
57742992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        final boolean available, enabled;
57752992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        final OnHardKeyboardStatusChangeListener listener;
57762992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        synchronized (mWindowMap) {
57772992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            listener = mHardKeyboardStatusChangeListener;
57782992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            available = mHardKeyboardAvailable;
57792992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            enabled = mHardKeyboardEnabled;
57802992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
57812992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        if (listener != null) {
57822992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            listener.onHardKeyboardStatusChange(available, enabled);
57832992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
57842992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
57852992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
5786a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    // -------------------------------------------------------------
5787a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    // Drag and drop
5788a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    // -------------------------------------------------------------
5789a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
5790a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    IBinder prepareDragSurface(IWindow window, SurfaceSession session,
579102d2b3ba9ba830a8147db2739613f7bbb2d0fcbfChristopher Tate            int flags, int width, int height, Surface outSurface) {
5792a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        if (DEBUG_DRAG) {
5793a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            Slog.d(TAG, "prepare drag surface: w=" + width + " h=" + height
579402d2b3ba9ba830a8147db2739613f7bbb2d0fcbfChristopher Tate                    + " flags=" + Integer.toHexString(flags) + " win=" + window
5795a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    + " asbinder=" + window.asBinder());
5796a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        }
5797a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
5798a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        final int callerPid = Binder.getCallingPid();
5799a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        final long origId = Binder.clearCallingIdentity();
5800a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        IBinder token = null;
5801a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
5802a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        try {
5803a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            synchronized (mWindowMap) {
5804a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                try {
5805a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    if (mDragState == null) {
5806a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        Surface surface = new Surface(session, callerPid, "drag surface", 0,
5807a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                                width, height, PixelFormat.TRANSLUCENT, Surface.HIDDEN);
5808ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                        if (SHOW_TRANSACTIONS) Slog.i(TAG, "  DRAG "
5809ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                                + surface + ": CREATE");
5810a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        outSurface.copyFrom(surface);
58117b362e431f3e17a755e56bc7dbc99bd661cb46baChris Tate                        final IBinder winBinder = window.asBinder();
5812a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        token = new Binder();
58136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        mDragState = new DragState(this, token, surface, /*flags*/ 0, winBinder);
5814a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        mDragState.mSurface = surface;
5815a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        token = mDragState.mToken = new Binder();
5816a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
5817a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        // 5 second timeout for this window to actually begin the drag
58187b362e431f3e17a755e56bc7dbc99bd661cb46baChris Tate                        mH.removeMessages(H.DRAG_START_TIMEOUT, winBinder);
58197b362e431f3e17a755e56bc7dbc99bd661cb46baChris Tate                        Message msg = mH.obtainMessage(H.DRAG_START_TIMEOUT, winBinder);
5820a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        mH.sendMessageDelayed(msg, 5000);
5821a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    } else {
5822a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        Slog.w(TAG, "Drag already in progress");
5823a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
5824a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                } catch (Surface.OutOfResourcesException e) {
5825a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    Slog.e(TAG, "Can't allocate drag surface w=" + width + " h=" + height, e);
5826a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    if (mDragState != null) {
5827a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        mDragState.reset();
5828a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        mDragState = null;
5829a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
5830a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                }
5831a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            }
5832a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        } finally {
5833a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            Binder.restoreCallingIdentity(origId);
5834a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        }
5835a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
5836a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        return token;
5837a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    }
5838a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
58399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
58409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Input Events and Focus Management
58419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
584246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
58436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final InputMonitor mInputMonitor = new InputMonitor(this);
58447fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
58459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void pauseKeyDispatching(IBinder _token) {
58469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
58479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "pauseKeyDispatching()")) {
5848cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
58499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
585006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
58519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
58529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken token = mTokenMap.get(_token);
58539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token != null) {
585400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                mInputMonitor.pauseDispatchingLw(token);
58559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
58569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
58579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5858ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
58599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void resumeKeyDispatching(IBinder _token) {
58609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
58619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "resumeKeyDispatching()")) {
5862cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
5863e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan        }
5864e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan
58659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
58669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken token = mTokenMap.get(_token);
58679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token != null) {
586800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                mInputMonitor.resumeDispatchingLw(token);
5869e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan            }
5870e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan        }
58719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5872e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan
58739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setEventDispatching(boolean enabled) {
58749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
58759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "resumeKeyDispatching()")) {
5876cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
58779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
587806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
58799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
588000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            mInputMonitor.setEventDispatchingLw(enabled);
58819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
58829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
588306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
58849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
58859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Injects a keystroke event into the UI.
5886bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * Even when sync is false, this method may block while waiting for current
5887bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * input events to be dispatched.
588806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     *
588906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     * @param ev A motion event describing the keystroke action.  (Be sure to use
58909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link SystemClock#uptimeMillis()} as the timebase.)
58919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sync If true, wait for the event to be completed before returning to the caller.
58929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if event was dispatched, false if it was dropped for any reason
58939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
58949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean injectKeyEvent(KeyEvent ev, boolean sync) {
58959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long downTime = ev.getDownTime();
58969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long eventTime = ev.getEventTime();
589706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
58989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int action = ev.getAction();
58999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int code = ev.getKeyCode();
59009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int repeatCount = ev.getRepeatCount();
59019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int metaState = ev.getMetaState();
59029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int deviceId = ev.getDeviceId();
59039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int scancode = ev.getScanCode();
5904c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        int source = ev.getSource();
5905c6ded10dd1ee08c887d0e81d683a7611fbe3ca4dMike Playle        int flags = ev.getFlags();
5906c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
5907c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        if (source == InputDevice.SOURCE_UNKNOWN) {
5908c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            source = InputDevice.SOURCE_KEYBOARD;
5909c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        }
591006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
59119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (eventTime == 0) eventTime = SystemClock.uptimeMillis();
59129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (downTime == 0) downTime = eventTime;
591306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
59149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        KeyEvent newEvent = new KeyEvent(downTime, eventTime, action, code, repeatCount, metaState,
59154a88013a4a06a9ea80e8419f94694936e6b013f0Jean-Baptiste Queru                deviceId, scancode, flags | KeyEvent.FLAG_FROM_SYSTEM, source);
591606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
59172bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final int pid = Binder.getCallingPid();
59182bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final int uid = Binder.getCallingUid();
59192bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final long ident = Binder.clearCallingIdentity();
592046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
5921bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final int result = mInputManager.injectInputEvent(newEvent, pid, uid,
5922bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                sync ? InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISH
5923bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                        : InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT,
5924bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                INJECTION_TIMEOUT_MILLIS);
592546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
59262bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        Binder.restoreCallingIdentity(ident);
59277fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        return reportInjectionResult(result);
59289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
59299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
59319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Inject a pointer (touch) event into the UI.
5932bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * Even when sync is false, this method may block while waiting for current
5933bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * input events to be dispatched.
593406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     *
593506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     * @param ev A motion event describing the pointer (touch) action.  (As noted in
593606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     * {@link MotionEvent#obtain(long, long, int, float, float, int)}, be sure to use
59379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link SystemClock#uptimeMillis()} as the timebase.)
59389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sync If true, wait for the event to be completed before returning to the caller.
59399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if event was dispatched, false if it was dropped for any reason
59409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
59419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean injectPointerEvent(MotionEvent ev, boolean sync) {
59422bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final int pid = Binder.getCallingPid();
59432bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final int uid = Binder.getCallingUid();
59442bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final long ident = Binder.clearCallingIdentity();
594546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
5946c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        MotionEvent newEvent = MotionEvent.obtain(ev);
5947c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        if ((newEvent.getSource() & InputDevice.SOURCE_CLASS_POINTER) == 0) {
5948c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            newEvent.setSource(InputDevice.SOURCE_TOUCHSCREEN);
5949c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        }
5950c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
5951bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final int result = mInputManager.injectInputEvent(newEvent, pid, uid,
5952bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                sync ? InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISH
5953bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                        : InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT,
5954bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                INJECTION_TIMEOUT_MILLIS);
595546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
59562bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        Binder.restoreCallingIdentity(ident);
59577fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        return reportInjectionResult(result);
59589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
595906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
59609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
59619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Inject a trackball (navigation device) event into the UI.
5962bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * Even when sync is false, this method may block while waiting for current
5963bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * input events to be dispatched.
596406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     *
596506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     * @param ev A motion event describing the trackball action.  (As noted in
596606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     * {@link MotionEvent#obtain(long, long, int, float, float, int)}, be sure to use
59679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link SystemClock#uptimeMillis()} as the timebase.)
59689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sync If true, wait for the event to be completed before returning to the caller.
59699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if event was dispatched, false if it was dropped for any reason
59709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
59719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean injectTrackballEvent(MotionEvent ev, boolean sync) {
59722bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final int pid = Binder.getCallingPid();
59732bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final int uid = Binder.getCallingUid();
59742bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final long ident = Binder.clearCallingIdentity();
597546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
5976c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        MotionEvent newEvent = MotionEvent.obtain(ev);
5977c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        if ((newEvent.getSource() & InputDevice.SOURCE_CLASS_TRACKBALL) == 0) {
5978c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            newEvent.setSource(InputDevice.SOURCE_TRACKBALL);
5979c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        }
5980c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
5981bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final int result = mInputManager.injectInputEvent(newEvent, pid, uid,
5982bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                sync ? InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISH
5983bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                        : InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT,
5984bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                INJECTION_TIMEOUT_MILLIS);
5985bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown
5986bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        Binder.restoreCallingIdentity(ident);
5987bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        return reportInjectionResult(result);
5988bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown    }
5989bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown
5990bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown    /**
5991bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * Inject an input event into the UI without waiting for dispatch to commence.
5992bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * This variant is useful for fire-and-forget input event injection.  It does not
5993bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * block any longer than it takes to enqueue the input event.
5994bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     *
5995bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * @param ev An input event.  (Be sure to set the input source correctly.)
5996bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * @return Returns true if event was dispatched, false if it was dropped for any reason
5997bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     */
5998bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown    public boolean injectInputEventNoWait(InputEvent ev) {
5999bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final int pid = Binder.getCallingPid();
6000bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final int uid = Binder.getCallingUid();
6001bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final long ident = Binder.clearCallingIdentity();
6002bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown
6003bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final int result = mInputManager.injectInputEvent(ev, pid, uid,
6004bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                InputManager.INPUT_EVENT_INJECTION_SYNC_NONE,
6005bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                INJECTION_TIMEOUT_MILLIS);
600646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
60072bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        Binder.restoreCallingIdentity(ident);
60087fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        return reportInjectionResult(result);
60097fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    }
60107fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
60117fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    private boolean reportInjectionResult(int result) {
601200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        switch (result) {
601300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            case InputManager.INPUT_EVENT_INJECTION_PERMISSION_DENIED:
601400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                Slog.w(TAG, "Input event injection permission denied.");
601500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                throw new SecurityException(
601600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                        "Injecting to another application requires INJECT_EVENTS permission");
601700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            case InputManager.INPUT_EVENT_INJECTION_SUCCEEDED:
601809e85dc0270ac9ce660c17ee8290ff2d136b395bChristopher Tate                //Slog.v(TAG, "Input event injection succeeded.");
601900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                return true;
602000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            case InputManager.INPUT_EVENT_INJECTION_TIMED_OUT:
602100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                Slog.w(TAG, "Input event injection timed out.");
602200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                return false;
602300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            case InputManager.INPUT_EVENT_INJECTION_FAILED:
602400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            default:
602500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                Slog.w(TAG, "Input event injection failed.");
602600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                return false;
6027cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn        }
60289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
602906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
60301a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown    /**
60311a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown     * Temporarily set the pointer speed.  Does not save the new setting.
60321a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown     * Used by the settings application.
60331a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown     */
60341a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown    public void setPointerSpeed(int speed) {
60351a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown        if (!checkCallingPermission(android.Manifest.permission.SET_POINTER_SPEED,
60361a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown                "setPointerSpeed()")) {
60371a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown            throw new SecurityException("Requires SET_POINTER_SPEED permission");
60381a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown        }
60391a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown
60401a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown        mInputManager.setPointerSpeed(speed);
60411a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown    }
60421a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown
60439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowState getFocusedWindow() {
60449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
60459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getFocusedWindowLocked();
60469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
60479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
60489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
60499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowState getFocusedWindowLocked() {
60509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCurrentFocus;
60519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
605206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
60539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean detectSafeMode() {
6054b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown        if (!mInputMonitor.waitForInputDevicesReady(
6055b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown                INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS)) {
6056b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown            Slog.w(TAG, "Devices still not ready after waiting "
6057b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown                    + INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS
6058b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown                    + " milliseconds before attempting to detect safe mode.");
6059b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown        }
6060b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown
60619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSafeMode = mPolicy.detectSafeMode();
60629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSafeMode;
60639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
606406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
60659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void systemReady() {
60665132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn        synchronized(mWindowMap) {
60675132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            if (mDisplay != null) {
60685132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn                throw new IllegalStateException("Display already initialized");
60695132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            }
60705132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
60715132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            mDisplay = wm.getDefaultDisplay();
60727916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            mInitialDisplayWidth = mDisplay.getRealWidth();
60737916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            mInitialDisplayHeight = mDisplay.getRealHeight();
60747916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            int rot = mDisplay.getRotation();
60757916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (rot == Surface.ROTATION_90 || rot == Surface.ROTATION_270) {
60767916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                // If the screen is currently rotated, we need to swap the
60777916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                // initial width and height to get the true natural values.
60787916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                int tmp = mInitialDisplayWidth;
60797916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                mInitialDisplayWidth = mInitialDisplayHeight;
60807916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                mInitialDisplayHeight = tmp;
60817916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
608281e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn            mBaseDisplayWidth = mCurDisplayWidth = mAppDisplayWidth = mInitialDisplayWidth;
608381e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn            mBaseDisplayHeight = mCurDisplayHeight = mAppDisplayHeight = mInitialDisplayHeight;
6084ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            mInputManager.setDisplaySize(0, mDisplay.getRawWidth(), mDisplay.getRawHeight());
608529735689cea7bf52998c1911542dcfdd1c1d9628Dianne Hackborn            mPolicy.setInitialDisplaySize(mInitialDisplayWidth, mInitialDisplayHeight);
60865132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn        }
60875132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn
60885132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn        try {
60895132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            mActivityManager.updateConfiguration(null);
60905132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn        } catch (RemoteException e) {
60915132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn        }
6092571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato
6093154db5f6358284d917d515f05d4474606b4896b2Dianne Hackborn        mPolicy.systemReady();
6094571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato
6095571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        synchronized (mWindowMap) {
6096571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato            readForcedDisplaySizeLocked();
6097571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        }
60985132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn    }
60995132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn
61006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // This is an animation that does nothing: it just immediately finishes
61016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // itself every time it is called.  It is used as a stub animation in cases
61026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // where we want to synchronize multiple things that may be animating.
61036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    static final class DummyAnimation extends Animation {
61046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public boolean getTransformation(long currentTime, Transformation outTransformation) {
61056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return false;
61066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
61076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
61086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    static final Animation sDummyAnimation = new DummyAnimation();
61096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
61109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
61116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Async Handler
61129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
61139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
61146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final class H extends Handler {
61156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int REPORT_FOCUS_CHANGE = 2;
61166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int REPORT_LOSING_FOCUS = 3;
61176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int ANIMATE = 4;
61186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int ADD_STARTING = 5;
61196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int REMOVE_STARTING = 6;
61206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int FINISHED_STARTING = 7;
61216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int REPORT_APPLICATION_TOKEN_WINDOWS = 8;
61226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int WINDOW_FREEZE_TIMEOUT = 11;
61236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int HOLD_SCREEN_CHANGED = 12;
61246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int APP_TRANSITION_TIMEOUT = 13;
61256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int PERSIST_ANIMATION_SCALE = 14;
61266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int FORCE_GC = 15;
61276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int ENABLE_SCREEN = 16;
61286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int APP_FREEZE_TIMEOUT = 17;
61296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int SEND_NEW_CONFIGURATION = 18;
61306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int REPORT_WINDOWS_CHANGE = 19;
61316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int DRAG_START_TIMEOUT = 20;
61326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int DRAG_END_TIMEOUT = 21;
61336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int REPORT_HARD_KEYBOARD_STATUS_CHANGE = 22;
613406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
61359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Session mLastReportedHold;
613606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
61379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public H() {
61389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
613906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
61409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
61419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void handleMessage(Message msg) {
61429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (msg.what) {
61439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case REPORT_FOCUS_CHANGE: {
61449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowState lastFocus;
61459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowState newFocus;
614606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
61479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized(mWindowMap) {
61489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        lastFocus = mLastFocus;
61499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newFocus = mCurrentFocus;
61509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (lastFocus == newFocus) {
61519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Focus is not changing, so nothing to do.
61529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return;
61539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
61549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLastFocus = newFocus;
61558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        //Slog.i(TAG, "Focus moving from " + lastFocus
61569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        //        + " to " + newFocus);
61579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (newFocus != null && lastFocus != null
61589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                && !newFocus.isDisplayedLw()) {
61598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            //Slog.i(TAG, "Delaying loss of focus...");
61609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLosingFocus.add(lastFocus);
61619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            lastFocus = null;
61629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
61639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
61649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
61659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (lastFocus != newFocus) {
61669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        //System.out.println("Changing focus from " + lastFocus
61679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        //                   + " to " + newFocus);
61689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (newFocus != null) {
61699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            try {
61708a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                //Slog.i(TAG, "Gaining focus: " + newFocus);
61719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                newFocus.mClient.windowFocusChanged(true, mInTouchMode);
61729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } catch (RemoteException e) {
61739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // Ignore if process has died.
61749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
61755e7833a571967d1dbc8618ac96ad6a379bcdf66aKonstantin Lopyrev                            notifyFocusChanged();
61769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
61779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
61789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (lastFocus != null) {
61799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            try {
61808a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                //Slog.i(TAG, "Losing focus: " + lastFocus);
61819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                lastFocus.mClient.windowFocusChanged(false, mInTouchMode);
61829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } catch (RemoteException e) {
61839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // Ignore if process has died.
61849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
61859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
6186664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato
6187664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                        mPolicy.focusChanged(lastFocus, newFocus);
61889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
61899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
61909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
61919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case REPORT_LOSING_FOCUS: {
61929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ArrayList<WindowState> losers;
619306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
61949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized(mWindowMap) {
61959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        losers = mLosingFocus;
61969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLosingFocus = new ArrayList<WindowState>();
61979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
61989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
61999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int N = losers.size();
62009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i=0; i<N; i++) {
62019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        try {
62028a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            //Slog.i(TAG, "Losing delayed focus: " + losers.get(i));
62039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            losers.get(i).mClient.windowFocusChanged(false, mInTouchMode);
62049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } catch (RemoteException e) {
62059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                             // Ignore if process has died.
62069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
62079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
62089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
62099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case ANIMATE: {
62119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized(mWindowMap) {
62129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAnimationPending = false;
62139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        performLayoutAndPlaceSurfacesLocked();
62149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
62159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
62169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case ADD_STARTING: {
62189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final AppWindowToken wtoken = (AppWindowToken)msg.obj;
62199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final StartingData sd = wtoken.startingData;
62209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (sd == null) {
62229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Animation has been canceled... do nothing.
62239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return;
62249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
622506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
62268a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Add starting "
62279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + wtoken + ": pkg=" + sd.pkg);
622806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
62299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    View view = null;
62309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
62319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        view = mPolicy.addStartingWindow(
62322f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                            wtoken.token, sd.pkg, sd.theme, sd.compatInfo,
62332f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn                            sd.nonLocalizedLabel, sd.labelRes, sd.icon, sd.windowFlags);
62349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (Exception e) {
62358a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "Exception when adding starting window", e);
62369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
62379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (view != null) {
62399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        boolean abort = false;
62409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        synchronized(mWindowMap) {
62429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (wtoken.removed || wtoken.startingData == null) {
62439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // If the window was successfully added, then
62449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // we need to remove it.
62459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (wtoken.startingWindow != null) {
62468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                    if (DEBUG_STARTING_WINDOW) Slog.v(TAG,
62479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            "Aborted starting " + wtoken
62489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + ": removed=" + wtoken.removed
62499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " startingData=" + wtoken.startingData);
62509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    wtoken.startingWindow = null;
62519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    wtoken.startingData = null;
62529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    abort = true;
62539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
62549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } else {
62559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                wtoken.startingView = view;
62569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
62578a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_STARTING_WINDOW && !abort) Slog.v(TAG,
62589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Added starting " + wtoken
62599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + ": startingWindow="
62609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + wtoken.startingWindow + " startingView="
62619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + wtoken.startingView);
62629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
62639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (abort) {
62659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            try {
62669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                mPolicy.removeStartingWindow(wtoken.token, view);
62679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } catch (Exception e) {
62688a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.w(TAG, "Exception when removing starting window", e);
62699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
62709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
62719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
62729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
62739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case REMOVE_STARTING: {
62759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final AppWindowToken wtoken = (AppWindowToken)msg.obj;
62769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    IBinder token = null;
62779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    View view = null;
62789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (mWindowMap) {
62798a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Remove starting "
62809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + wtoken + ": startingWindow="
62819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + wtoken.startingWindow + " startingView="
62829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + wtoken.startingView);
62839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (wtoken.startingWindow != null) {
62849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            view = wtoken.startingView;
62859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            token = wtoken.token;
62869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.startingData = null;
62879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.startingView = null;
62889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.startingWindow = null;
62899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
62909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
62919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (view != null) {
62929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        try {
62939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mPolicy.removeStartingWindow(token, view);
62949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } catch (Exception e) {
62958a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            Slog.w(TAG, "Exception when removing starting window", e);
62969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
62979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
62989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
62999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case FINISHED_STARTING: {
63019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    IBinder token = null;
63029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    View view = null;
63039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    while (true) {
63049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        synchronized (mWindowMap) {
63059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            final int N = mFinishedStarting.size();
63069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (N <= 0) {
63079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                break;
63089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
63099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AppWindowToken wtoken = mFinishedStarting.remove(N-1);
63109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_STARTING_WINDOW) Slog.v(TAG,
63129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Finished starting " + wtoken
63139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + ": startingWindow=" + wtoken.startingWindow
63149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + " startingView=" + wtoken.startingView);
63159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (wtoken.startingWindow == null) {
63179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                continue;
63189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
63199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            view = wtoken.startingView;
63219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            token = wtoken.token;
63229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.startingData = null;
63239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.startingView = null;
63249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.startingWindow = null;
63259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
63269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        try {
63289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mPolicy.removeStartingWindow(token, view);
63299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } catch (Exception e) {
63308a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            Slog.w(TAG, "Exception when removing starting window", e);
63319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
63329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
63339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
63349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case REPORT_APPLICATION_TOKEN_WINDOWS: {
63369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final AppWindowToken wtoken = (AppWindowToken)msg.obj;
63379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean nowVisible = msg.arg1 != 0;
63399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean nowGone = msg.arg2 != 0;
63409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
63428a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_VISIBILITY) Slog.v(
63439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                TAG, "Reporting visible in " + wtoken
63449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " visible=" + nowVisible
63459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " gone=" + nowGone);
63469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (nowVisible) {
63479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.appToken.windowsVisible();
63489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
63499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.appToken.windowsGone();
63509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
63519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (RemoteException ex) {
63529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
63539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
635406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
63559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WINDOW_FREEZE_TIMEOUT: {
63569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (mWindowMap) {
63578a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "Window freeze timeout expired.");
63589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int i = mWindows.size();
63599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        while (i > 0) {
63609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            i--;
6361e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                            WindowState w = mWindows.get(i);
63629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (w.mOrientationChanging) {
63639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mOrientationChanging = false;
63648a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.w(TAG, "Force clearing orientation change: " + w);
63659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
63669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
63679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        performLayoutAndPlaceSurfacesLocked();
63689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
63699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
63709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
637106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
63729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case HOLD_SCREEN_CHANGED: {
63739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Session oldHold;
63749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Session newHold;
63759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (mWindowMap) {
63769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        oldHold = mLastReportedHold;
63779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newHold = (Session)msg.obj;
63789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLastReportedHold = newHold;
63799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
638006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
63819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (oldHold != newHold) {
63829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        try {
63839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (oldHold != null) {
63849adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                                mBatteryStats.noteStopWakelock(oldHold.mUid, -1,
63859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "window",
63869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        BatteryStats.WAKE_TYPE_WINDOW);
63879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
63889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (newHold != null) {
63899adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                                mBatteryStats.noteStartWakelock(newHold.mUid, -1,
63909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "window",
63919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        BatteryStats.WAKE_TYPE_WINDOW);
63929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
63939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } catch (RemoteException e) {
63949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
63959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
63969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
63979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
639806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
63999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case APP_TRANSITION_TIMEOUT: {
64009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (mWindowMap) {
6401bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                        if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
64028a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
64039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "*** APP TRANSITION TIMEOUT");
64049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mAppTransitionReady = true;
64059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mAppTransitionTimeout = true;
64069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            performLayoutAndPlaceSurfacesLocked();
64079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
64089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
64099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
64109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
641106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
64129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case PERSIST_ANIMATION_SCALE: {
64139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.System.putFloat(mContext.getContentResolver(),
64149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Settings.System.WINDOW_ANIMATION_SCALE, mWindowAnimationScale);
64159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.System.putFloat(mContext.getContentResolver(),
64169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Settings.System.TRANSITION_ANIMATION_SCALE, mTransitionAnimationScale);
64179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
64189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
641906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
64209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case FORCE_GC: {
64219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized(mWindowMap) {
64229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mAnimationPending) {
64239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // If we are animating, don't do the gc now but
64249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // delay a bit so we don't interrupt the animation.
64259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mH.sendMessageDelayed(mH.obtainMessage(H.FORCE_GC),
64269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    2000);
64279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return;
64289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
64299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // If we are currently rotating the display, it will
64309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // schedule a new message when done.
64319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mDisplayFrozen) {
64329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return;
64339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
64349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFreezeGcPending = 0;
64359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
64369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Runtime.getRuntime().gc();
64379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
64389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
643906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
64409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case ENABLE_SCREEN: {
64419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    performEnableScreen();
64429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
64439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
644406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
64459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case APP_FREEZE_TIMEOUT: {
64469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (mWindowMap) {
64478a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "App freeze timeout expired.");
64489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int i = mAppTokens.size();
64499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        while (i > 0) {
64509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            i--;
64519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AppWindowToken tok = mAppTokens.get(i);
64529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (tok.freezingScreen) {
64538a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.w(TAG, "Force clearing freeze: " + tok);
64549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                unsetAppFreezingScreenLocked(tok, true, true);
64559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
64569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
64579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
64589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
64599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
646006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6461e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                case SEND_NEW_CONFIGURATION: {
6462e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    removeMessages(SEND_NEW_CONFIGURATION);
6463e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    sendNewConfiguration();
6464c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                    break;
6465c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                }
646606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
64676e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev                case REPORT_WINDOWS_CHANGE: {
6468dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                    if (mWindowsChanged) {
6469dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                        synchronized (mWindowMap) {
6470dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                            mWindowsChanged = false;
6471dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                        }
6472dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                        notifyWindowsChanged();
6473dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                    }
6474dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                    break;
6475dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                }
6476dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev
6477a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                case DRAG_START_TIMEOUT: {
6478a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    IBinder win = (IBinder)msg.obj;
6479a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    if (DEBUG_DRAG) {
6480a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        Slog.w(TAG, "Timeout starting drag by win " + win);
6481a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
6482a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    synchronized (mWindowMap) {
6483a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        // !!! TODO: ANR the app that has failed to start the drag in time
6484a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (mDragState != null) {
6485d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                            mDragState.unregister();
64862e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                            mInputMonitor.updateInputWindowsLw(true /*force*/);
6487a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                            mDragState.reset();
6488a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                            mDragState = null;
6489a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        }
6490a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
6491d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    break;
6492a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                }
6493a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
6494d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                case DRAG_END_TIMEOUT: {
6495d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    IBinder win = (IBinder)msg.obj;
6496d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    if (DEBUG_DRAG) {
6497d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        Slog.w(TAG, "Timeout ending drag to win " + win);
6498d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    }
6499d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    synchronized (mWindowMap) {
6500d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        // !!! TODO: ANR the drag-receiving app
6501d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        mDragState.mDragResult = false;
6502d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        mDragState.endDragLw();
6503d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    }
6504d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    break;
6505d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                }
65062992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
65072992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                case REPORT_HARD_KEYBOARD_STATUS_CHANGE: {
65082992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                    notifyHardKeyboardStatusChange();
65092992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                    break;
65102992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                }
65119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
65129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
65139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
65149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
65159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
65169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // IWindowManager API
65179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
65189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
65199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public IWindowSession openSession(IInputMethodClient client,
65209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IInputContext inputContext) {
65219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (client == null) throw new IllegalArgumentException("null client");
65229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (inputContext == null) throw new IllegalArgumentException("null inputContext");
65236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        Session session = new Session(this, client, inputContext);
652446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        return session;
65259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
65269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
65279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean inputMethodClientHasFocus(IInputMethodClient client) {
65289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
65299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // The focus for the client is the window immediately below
65309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // where we would place the input method window.
65319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int idx = findDesiredInputMethodWindowIndexLocked(false);
65329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowState imFocus;
65339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (idx > 0) {
6534e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                imFocus = mWindows.get(idx-1);
6535e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                //Log.i(TAG, "Desired input method target: " + imFocus);
6536e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                //Log.i(TAG, "Current focus: " + this.mCurrentFocus);
6537e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                //Log.i(TAG, "Last focus: " + this.mLastFocus);
65389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (imFocus != null) {
6539e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // This may be a starting window, in which case we still want
6540e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // to count it as okay.
6541e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    if (imFocus.mAttrs.type == LayoutParams.TYPE_APPLICATION_STARTING
6542e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            && imFocus.mAppToken != null) {
6543e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        // The client has definitely started, so it really should
6544e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        // have a window in this app token.  Let's look for it.
6545e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        for (int i=0; i<imFocus.mAppToken.windows.size(); i++) {
6546e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            WindowState w = imFocus.mAppToken.windows.get(i);
6547e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            if (w != imFocus) {
6548e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                                //Log.i(TAG, "Switching to real app window: " + w);
6549e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                                imFocus = w;
6550e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                                break;
6551e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            }
6552e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        }
6553e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    }
6554e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    //Log.i(TAG, "IM target client: " + imFocus.mSession.mClient);
6555e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    //if (imFocus.mSession.mClient != null) {
6556e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    //    Log.i(TAG, "IM target client binder: " + imFocus.mSession.mClient.asBinder());
6557e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    //    Log.i(TAG, "Requesting client binder: " + client.asBinder());
6558e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    //}
65599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (imFocus.mSession.mClient != null &&
65609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            imFocus.mSession.mClient.asBinder() == client.asBinder()) {
65619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return true;
65629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6563e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn
6564e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // Okay, how about this...  what is the current focus?
6565e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // It seems in some cases we may not have moved the IM
6566e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // target window, such as when it was in a pop-up window,
6567e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // so let's also look at the current focus.  (An example:
6568e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // go to Gmail, start searching so the keyboard goes up,
6569e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // press home.  Sometimes the IME won't go down.)
6570e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // Would be nice to fix this more correctly, but it's
6571e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // way at the end of a release, and this should be good enough.
6572e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    if (mCurrentFocus != null && mCurrentFocus.mSession.mClient != null &&
6573e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            mCurrentFocus.mSession.mClient.asBinder() == client.asBinder()) {
6574e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        return true;
6575e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    }
65769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
65779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
65789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
65799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
65809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
658106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6582ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    public void getDisplaySize(Point size) {
6583ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        synchronized(mWindowMap) {
658481e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn            size.x = mAppDisplayWidth;
658581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn            size.y = mAppDisplayHeight;
6586ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        }
6587ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    }
6588ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn
6589ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    public int getMaximumSizeDimension() {
6590ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        synchronized(mWindowMap) {
6591ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn            // Do this based on the raw screen size, until we are smarter.
65927916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            return mBaseDisplayWidth > mBaseDisplayHeight
65937916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    ? mBaseDisplayWidth : mBaseDisplayHeight;
65947916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
65957916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    }
65967916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
65977916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    public void setForcedDisplaySize(int longDimen, int shortDimen) {
65987916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        synchronized(mWindowMap) {
65997916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            int width, height;
66007916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (mInitialDisplayWidth < mInitialDisplayHeight) {
66017916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                width = shortDimen < mInitialDisplayWidth
66027916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        ? shortDimen : mInitialDisplayWidth;
66037916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                height = longDimen < mInitialDisplayHeight
66047916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        ? longDimen : mInitialDisplayHeight;
66057916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            } else {
66067916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                width = longDimen < mInitialDisplayWidth
66077916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        ? longDimen : mInitialDisplayWidth;
66087916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                height = shortDimen < mInitialDisplayHeight
66097916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        ? shortDimen : mInitialDisplayHeight;
66107916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
66117916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            setForcedDisplaySizeLocked(width, height);
6612571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato            Settings.Secure.putString(mContext.getContentResolver(),
6613571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato                    Settings.Secure.DISPLAY_SIZE_FORCED, width + "," + height);
66147916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
66157916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    }
66167916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
66177916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    private void rebuildBlackFrame(boolean inTransaction) {
66187916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        if (!inTransaction) {
66197916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (SHOW_TRANSACTIONS) Slog.i(TAG,
66207916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    ">>> OPEN TRANSACTION rebuildBlackFrame");
66217916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            Surface.openTransaction();
66227916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
66237916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        try {
66247916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (mBlackFrame != null) {
66257916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                mBlackFrame.kill();
66267916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                mBlackFrame = null;
66277916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
66287916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (mBaseDisplayWidth < mInitialDisplayWidth
66297916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    || mBaseDisplayHeight < mInitialDisplayHeight) {
66308f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                int initW, initH, baseW, baseH;
66318f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                final boolean rotated = (mRotation == Surface.ROTATION_90
66328f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                        || mRotation == Surface.ROTATION_270);
66338f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                if (rotated) {
66348f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                    initW = mInitialDisplayHeight;
66358f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                    initH = mInitialDisplayWidth;
66368f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                    baseW = mBaseDisplayHeight;
66378f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                    baseH = mBaseDisplayWidth;
66388f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                } else {
66398f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                    initW = mInitialDisplayWidth;
66408f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                    initH = mInitialDisplayHeight;
66418f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                    baseW = mBaseDisplayWidth;
66428f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                    baseH = mBaseDisplayHeight;
66438f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                }
66448f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                Rect outer = new Rect(0, 0, initW, initH);
66458f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn                Rect inner = new Rect(0, 0, baseW, baseH);
66467916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                try {
66477916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    mBlackFrame = new BlackFrame(mFxSession, outer, inner, MASK_LAYER);
66487916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                } catch (Surface.OutOfResourcesException e) {
66497916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                }
66507916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
66517916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        } finally {
66527916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (!inTransaction) {
66537916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                Surface.closeTransaction();
66547916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                if (SHOW_TRANSACTIONS) Slog.i(TAG,
66557916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        "<<< CLOSE TRANSACTION rebuildBlackFrame");
66567916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
66577916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
66587916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    }
66597916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
6660571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato    private void readForcedDisplaySizeLocked() {
6661571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        final String str = Settings.Secure.getString(mContext.getContentResolver(),
6662571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato                Settings.Secure.DISPLAY_SIZE_FORCED);
6663571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        if (str == null || str.length() == 0) {
6664571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato            return;
6665571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        }
6666571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        final int pos = str.indexOf(',');
6667571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        if (pos <= 0 || str.lastIndexOf(',') != pos) {
6668571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato            return;
6669571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        }
6670571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        int width, height;
6671571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        try {
6672571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato            width = Integer.parseInt(str.substring(0, pos));
6673571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato            height = Integer.parseInt(str.substring(pos+1));
6674571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        } catch (NumberFormatException ex) {
6675571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato            return;
6676571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        }
6677571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        setForcedDisplaySizeLocked(width, height);
6678571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato    }
6679571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato
66807916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    private void setForcedDisplaySizeLocked(int width, int height) {
6681571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato        Slog.i(TAG, "Using new display size: " + width + "x" + height);
6682571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato
66837916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        mBaseDisplayWidth = width;
66847916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        mBaseDisplayHeight = height;
66857916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        mPolicy.setInitialDisplaySize(mBaseDisplayWidth, mBaseDisplayHeight);
66867916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
66877916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        mLayoutNeeded = true;
66887916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
66897916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        boolean configChanged = updateOrientationFromAppTokensLocked(false);
66907916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        mTempConfiguration.setToDefaults();
66917916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        mTempConfiguration.fontScale = mCurConfiguration.fontScale;
66927916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        if (computeNewConfigurationLocked(mTempConfiguration)) {
66937916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (mCurConfiguration.diff(mTempConfiguration) != 0) {
66947916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                configChanged = true;
66957916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
66967916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
66977916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
66987916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        if (configChanged) {
66997916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            mWaitingForConfig = true;
67007916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            startFreezingDisplayLocked(false);
67017916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
67027916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
67037916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
67047916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        rebuildBlackFrame(false);
67057916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
67067916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        performLayoutAndPlaceSurfacesLocked();
67077916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    }
67087916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
67097916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    public void clearForcedDisplaySize() {
67107916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        synchronized(mWindowMap) {
67117916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            setForcedDisplaySizeLocked(mInitialDisplayWidth, mInitialDisplayHeight);
6712571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato            Settings.Secure.putString(mContext.getContentResolver(),
6713571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato                    Settings.Secure.DISPLAY_SIZE_FORCED, "");
6714ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        }
6715ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn    }
6716ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn
671781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn    public boolean canStatusBarHide() {
671881e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        return mPolicy.canStatusBarHide();
671981e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn    }
672081e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn
67219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
67229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Internals
67239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
67249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6725e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    final WindowState windowForClientLocked(Session session, IWindow client,
6726e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            boolean throwOnError) {
6727e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        return windowForClientLocked(session, client.asBinder(), throwOnError);
67289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
672906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6730e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    final WindowState windowForClientLocked(Session session, IBinder client,
6731e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            boolean throwOnError) {
67329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState win = mWindowMap.get(client);
67338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (localLOGV) Slog.v(
67349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Looking up client " + client + ": " + win);
67359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (win == null) {
6736e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            RuntimeException ex = new IllegalArgumentException(
6737e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    "Requested window " + client + " does not exist");
6738e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            if (throwOnError) {
6739e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                throw ex;
6740e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
67418a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Failed looking up window", ex);
67429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
67439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
67449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (session != null && win.mSession != session) {
6745e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            RuntimeException ex = new IllegalArgumentException(
6746e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    "Requested window " + client + " is in session " +
6747e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    win.mSession + ", not " + session);
6748e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            if (throwOnError) {
6749e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                throw ex;
6750e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
67518a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Failed looking up window", ex);
67529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
67539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
67549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return win;
67569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
67579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6758a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    final void rebuildAppWindowListLocked() {
6759a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        int NW = mWindows.size();
6760a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        int i;
67613b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        int lastWallpaper = -1;
67629bfb707597898f54722460b48588007b682f3e2aDianne Hackborn        int numRemoved = 0;
6763ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
6764f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        if (mRebuildTmp.length < NW) {
6765f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            mRebuildTmp = new WindowState[NW+10];
6766f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        }
6767f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn
6768a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        // First remove all existing app windows.
6769a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        i=0;
6770a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        while (i < NW) {
6771e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState w = mWindows.get(i);
67723b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if (w.mAppToken != null) {
6773e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState win = mWindows.remove(i);
6774f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                win.mRebuilding = true;
6775f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                mRebuildTmp[numRemoved] = win;
6776dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                mWindowsChanged = true;
67778a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG,
6778bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                        "Rebuild removing window: " + win);
6779a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                NW--;
67809bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                numRemoved++;
6781a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                continue;
67823b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            } else if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_WALLPAPER
67833b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    && lastWallpaper == i-1) {
67843b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                lastWallpaper = i;
6785a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
6786a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            i++;
6787a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        }
6788ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
67893b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        // The wallpaper window(s) typically live at the bottom of the stack,
67903b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        // so skip them before adding app tokens.
67913b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        lastWallpaper++;
67923b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        i = lastWallpaper;
6793ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
6794bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        // First add all of the exiting app tokens...  these are no longer
6795bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        // in the main app list, but still have windows shown.  We put them
6796bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        // in the back because now that the animation is over we no longer
6797bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        // will care about them.
6798bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        int NT = mExitingAppTokens.size();
6799a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        for (int j=0; j<NT; j++) {
6800bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn            i = reAddAppWindowsLocked(i, mExitingAppTokens.get(j));
6801bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        }
6802ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
6803bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        // And add in the still active app tokens in Z order.
6804bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        NT = mAppTokens.size();
6805bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        for (int j=0; j<NT; j++) {
6806bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn            i = reAddAppWindowsLocked(i, mAppTokens.get(j));
6807a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        }
6808ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
68093b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        i -= lastWallpaper;
68109bfb707597898f54722460b48588007b682f3e2aDianne Hackborn        if (i != numRemoved) {
68118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Rebuild removed " + numRemoved
68129bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    + " windows but added " + i);
6813f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            for (i=0; i<numRemoved; i++) {
6814f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                WindowState ws = mRebuildTmp[i];
6815f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (ws.mRebuilding) {
6816f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    StringWriter sw = new StringWriter();
6817f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    PrintWriter pw = new PrintWriter(sw);
6818f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    ws.dump(pw, "");
6819f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    pw.flush();
6820f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    Slog.w(TAG, "This window was lost: " + ws);
6821f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    Slog.w(TAG, sw.toString());
6822f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                }
6823f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            }
6824f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            Slog.w(TAG, "Current app token list:");
6825f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            dumpAppTokensLocked();
6826f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            Slog.w(TAG, "Final window list:");
6827f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            dumpWindowsLocked();
68289bfb707597898f54722460b48588007b682f3e2aDianne Hackborn        }
6829a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    }
6830ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
68319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void assignLayersLocked() {
68329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int N = mWindows.size();
68339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int curBaseLayer = 0;
68349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int curLayer = 0;
68359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i;
683606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
68376c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn        if (DEBUG_LAYERS) {
68386c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            RuntimeException here = new RuntimeException("here");
68396c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            here.fillInStackTrace();
68406c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            Log.v(TAG, "Assigning layers", here);
68416c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn        }
68426c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn
68439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=0; i<N; i++) {
6844e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState w = mWindows.get(i);
68457341d7a104b47996445d069a695e155a07184606Dianne Hackborn            if (w.mBaseLayer == curBaseLayer || w.mIsImWindow
68467341d7a104b47996445d069a695e155a07184606Dianne Hackborn                    || (i > 0 && w.mIsWallpaper)) {
68479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                curLayer += WINDOW_LAYER_MULTIPLIER;
68489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mLayer = curLayer;
68499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
68509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                curBaseLayer = curLayer = w.mBaseLayer;
68519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mLayer = curLayer;
68529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
68539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (w.mTargetAppToken != null) {
68549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mAnimLayer = w.mLayer + w.mTargetAppToken.animLayerAdjustment;
68559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (w.mAppToken != null) {
68569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mAnimLayer = w.mLayer + w.mAppToken.animLayerAdjustment;
68579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
68589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mAnimLayer = w.mLayer;
68599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
68609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (w.mIsImWindow) {
68619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mAnimLayer += mInputMethodAnimLayerAdjustment;
6862759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            } else if (w.mIsWallpaper) {
6863759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                w.mAnimLayer += mWallpaperAnimLayerAdjustment;
68649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
68658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_LAYERS) Slog.v(TAG, "Assign layer " + w + ": "
68669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + w.mAnimLayer);
68679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //System.out.println(
68689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //    "Assigned layer " + curLayer + " to " + w.mClient.asBinder());
68699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
68709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
68719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mInLayout = false;
68739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void performLayoutAndPlaceSurfacesLocked() {
68749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mInLayout) {
6875cfe6524071624b6679e5fa4db847328e8d0317c8Dave Bort            if (DEBUG) {
68769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Recursive call!");
68779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
68788a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "performLayoutAndPlaceSurfacesLocked called while in layout");
68799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
68809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
68819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6882e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        if (mWaitingForConfig) {
6883e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // Our configuration has changed (most likely rotation), but we
6884e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // don't yet have the complete configuration to report to
6885e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // applications.  Don't do any window layout until we have it.
6886e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            return;
6887e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        }
6888e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
6889ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        if (mDisplay == null) {
6890ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            // Not yet initialized, nothing to do.
6891ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            return;
6892ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
6893ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
68942e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn        mInLayout = true;
68959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean recoveringMemory = false;
68962e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn
68972e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn        try {
68982e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn            if (mForceRemoves != null) {
68992e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                recoveringMemory = true;
6900f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                // Wait a little bit for things to settle down, and off we go.
69012e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                for (int i=0; i<mForceRemoves.size(); i++) {
69022e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                    WindowState ws = mForceRemoves.get(i);
69032e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                    Slog.i(TAG, "Force removing: " + ws);
69042e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                    removeWindowInnerLocked(ws.mSession, ws);
69052e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                }
69062e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                mForceRemoves = null;
69072e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                Slog.w(TAG, "Due to memory failure, waiting a bit for next layout");
69082e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                Object tmp = new Object();
69092e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                synchronized (tmp) {
69102e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                    try {
69112e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                        tmp.wait(250);
69122e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                    } catch (InterruptedException e) {
69132e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                    }
69149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
69159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
69162e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn        } catch (RuntimeException e) {
69172e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn            Slog.e(TAG, "Unhandled exception while force removing for memory", e);
69189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
69192e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn
69209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
69219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            performLayoutAndPlaceSurfacesLockedInner(recoveringMemory);
692206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6923f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            int N = mPendingRemove.size();
6924f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            if (N > 0) {
6925f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (mPendingRemoveTmp.length < N) {
6926f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    mPendingRemoveTmp = new WindowState[N+10];
69279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6928f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                mPendingRemove.toArray(mPendingRemoveTmp);
69299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPendingRemove.clear();
6930f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                for (int i=0; i<N; i++) {
6931f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    WindowState w = mPendingRemoveTmp[i];
6932f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    removeWindowInnerLocked(w.mSession, w);
6933f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                }
69349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInLayout = false;
69369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                assignLayersLocked();
69379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutNeeded = true;
69389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                performLayoutAndPlaceSurfacesLocked();
69399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
69419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInLayout = false;
69429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mLayoutNeeded) {
69439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    requestAnimationLocked(0);
69449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
69459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6946dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            if (mWindowsChanged && !mWindowChangeListeners.isEmpty()) {
69476e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev                mH.removeMessages(H.REPORT_WINDOWS_CHANGE);
69486e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev                mH.sendMessage(mH.obtainMessage(H.REPORT_WINDOWS_CHANGE));
6949dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            }
69509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
69519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInLayout = false;
69528a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.e(TAG, "Unhandled exception while layout out windows", e);
69539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
69549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
69559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69563a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown    private final int performLayoutLockedInner(boolean initial, boolean updateInputWindows) {
6957b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        if (!mLayoutNeeded) {
6958b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            return 0;
6959b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        }
6960b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
6961b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        mLayoutNeeded = false;
6962b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
6963ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        final int dw = mCurDisplayWidth;
6964ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn        final int dh = mCurDisplayHeight;
69659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = mWindows.size();
69679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i;
69689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69698a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_LAYOUT) Slog.v(TAG, "performLayout: needed="
69709b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn                + mLayoutNeeded + " dw=" + dw + " dh=" + dh);
69719b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn
6972b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        mPolicy.beginLayoutLw(dw, dh);
697306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6974b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        int seq = mLayoutSeq+1;
6975b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        if (seq < 0) seq = 0;
6976b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        mLayoutSeq = seq;
6977b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
6978b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        // First perform layout of any root windows (not attached
6979b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        // to another window).
6980b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        int topAttached = -1;
6981b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        for (i = N-1; i >= 0; i--) {
6982e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState win = mWindows.get(i);
6983b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
6984b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // Don't do layout of a window if it is not visible, or
6985b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // soon won't be visible, to avoid wasting time and funky
6986b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // changes while a window is animating away.
6987b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            final AppWindowToken atoken = win.mAppToken;
6988b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            final boolean gone = win.mViewVisibility == View.GONE
6989b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    || !win.mRelayoutCalled
6990ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn                    || (atoken == null && win.mRootToken.hidden)
6991b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    || (atoken != null && atoken.hiddenRequested)
6992b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    || win.mAttachedHidden
6993b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    || win.mExiting || win.mDestroying;
6994b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
69951c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn            if (DEBUG_LAYOUT && !win.mLayoutAttached) {
69961c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                Slog.v(TAG, "First pass " + win
6997b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + ": gone=" + gone + " mHaveFrame=" + win.mHaveFrame
6998b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + " mLayoutAttached=" + win.mLayoutAttached);
69991c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                if (gone) Slog.v(TAG, "  (mViewVisibility="
7000b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + win.mViewVisibility + " mRelayoutCalled="
7001b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + win.mRelayoutCalled + " hidden="
7002b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + win.mRootToken.hidden + " hiddenRequested="
7003b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + (atoken != null && atoken.hiddenRequested)
7004b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + " mAttachedHidden=" + win.mAttachedHidden);
7005b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            }
7006e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
7007b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // If this view is GONE, then skip it -- keep the current
7008b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // frame, and let the caller know so they can ignore it
7009b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // if they want.  (We do the normal layout for INVISIBLE
7010b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // windows, since that means "perform layout as normal,
7011b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // just don't display").
7012b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            if (!gone || !win.mHaveFrame) {
7013e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                if (!win.mLayoutAttached) {
70148e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                    if (initial) {
70150f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                        //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial");
70168e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        win.mContentChanged = false;
70178e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                    }
7018e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                    win.prelayout();
7019b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    mPolicy.layoutWindowLw(win, win.mAttrs, null);
7020b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    win.mLayoutSeq = seq;
7021b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (DEBUG_LAYOUT) Slog.v(TAG, "-> mFrame="
7022b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + win.mFrame + " mContainingFrame="
7023b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + win.mContainingFrame + " mDisplayFrame="
7024b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + win.mDisplayFrame);
7025b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                } else {
7026b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (topAttached < 0) topAttached = i;
70279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
70289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7029b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        }
703006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7031b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        // Now perform layout of attached windows, which usually
7032b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        // depend on the position of the window they are attached to.
7033b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        // XXX does not deal with windows that are attached to windows
7034b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        // that are themselves attached.
7035b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        for (i = topAttached; i >= 0; i--) {
7036e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState win = mWindows.get(i);
70379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7038b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            if (win.mLayoutAttached) {
7039b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (DEBUG_LAYOUT) Slog.v(TAG, "Second pass " + win
7040b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + " mHaveFrame=" + win.mHaveFrame
7041b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + " mViewVisibility=" + win.mViewVisibility
7042b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + " mRelayoutCalled=" + win.mRelayoutCalled);
70431c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                // If this view is GONE, then skip it -- keep the current
70441c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                // frame, and let the caller know so they can ignore it
70451c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                // if they want.  (We do the normal layout for INVISIBLE
70461c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                // windows, since that means "perform layout as normal,
70471c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                // just don't display").
7048b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if ((win.mViewVisibility != View.GONE && win.mRelayoutCalled)
7049b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        || !win.mHaveFrame) {
70508e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                    if (initial) {
70510f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                        //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial");
70528e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        win.mContentChanged = false;
70538e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                    }
7054e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                    win.prelayout();
7055b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    mPolicy.layoutWindowLw(win, win.mAttrs, win.mAttachedWindow);
7056b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    win.mLayoutSeq = seq;
7057b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (DEBUG_LAYOUT) Slog.v(TAG, "-> mFrame="
7058b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + win.mFrame + " mContainingFrame="
7059b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + win.mContainingFrame + " mDisplayFrame="
7060b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + win.mDisplayFrame);
70619bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                }
7062958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            }
70639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7064349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
7065349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // Window frames may have changed.  Tell the input dispatcher about it.
70663a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        mInputMonitor.setUpdateInputWindowsNeededLw();
70673a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        if (updateInputWindows) {
70682e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown            mInputMonitor.updateInputWindowsLw(false /*force*/);
70693a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        }
7070b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
7071b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        return mPolicy.finishLayoutLw();
70729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
707306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
70746804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    // "Something has changed!  Let's make it correct now."
70759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void performLayoutAndPlaceSurfacesLockedInner(
70769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean recoveringMemory) {
707734bcebca707187393263183aa4dab32728763f2fJoe Onorato        if (mDisplay == null) {
707834bcebca707187393263183aa4dab32728763f2fJoe Onorato            Slog.i(TAG, "skipping performLayoutAndPlaceSurfacesLockedInner with no mDisplay");
707934bcebca707187393263183aa4dab32728763f2fJoe Onorato            return;
708034bcebca707187393263183aa4dab32728763f2fJoe Onorato        }
708134bcebca707187393263183aa4dab32728763f2fJoe Onorato
70829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long currentTime = SystemClock.uptimeMillis();
708368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        final int dw = mCurDisplayWidth;
708468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn        final int dh = mCurDisplayHeight;
708581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        final int innerDw = mAppDisplayWidth;
708681e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn        final int innerDh = mAppDisplayHeight;
7087e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn
70889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i;
70899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7090b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn        if (mFocusMayChange) {
7091b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn            mFocusMayChange = false;
70923a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown            updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
70933a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    false /*updateInputWindows*/);
7094b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn        }
7095b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn
70969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Initialize state of exiting tokens.
70979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=mExitingTokens.size()-1; i>=0; i--) {
70989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mExitingTokens.get(i).hasVisible = false;
70999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
71009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
71019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Initialize state of exiting applications.
71029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=mExitingAppTokens.size()-1; i>=0; i--) {
71039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mExitingAppTokens.get(i).hasVisible = false;
71049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
71059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
71069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean orientationChangeComplete = true;
71079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Session holdScreen = null;
71089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float screenBrightness = -1;
7109fb73f79340375013225618a5d87f46b958f698efMike Lockwood        float buttonBrightness = -1;
71109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean focusDisplayed = false;
71119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean animating = false;
7112fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        boolean createWatermark = false;
711389ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        boolean updateRotation = false;
711450660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn        boolean screenRotationFinished = false;
7115fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
7116fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        if (mFxSession == null) {
7117fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn            mFxSession = new SurfaceSession();
7118fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn            createWatermark = true;
7119fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
7120fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
712194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn        if (SHOW_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION performLayoutAndPlaceSurfaces");
71229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
71239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Surface.openTransaction();
7124fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
7125fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        if (createWatermark) {
7126fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn            createWatermark();
7127fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
7128fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        if (mWatermark != null) {
7129fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn            mWatermark.positionSurface(dw, dh);
7130fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
71316804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        if (mStrictModeFlash != null) {
71326804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            mStrictModeFlash.positionSurface(dw, dh);
71336804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        }
7134fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
71359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
7136de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn            boolean wallpaperForceHidingChanged = false;
7137b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            int repeats = 0;
7138b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            int changes = 0;
7139b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
71409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            do {
7141b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                repeats++;
7142b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (repeats > 6) {
7143b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    Slog.w(TAG, "Animation repeat aborted after too many iterations");
7144b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    mLayoutNeeded = false;
7145b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    break;
7146b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                }
7147b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
7148b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if ((changes&(WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER
7149b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        | WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG
7150b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        | WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT)) != 0) {
7151b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
7152b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        if ((adjustWallpaperWindowsLocked()&ADJUST_WALLPAPER_LAYERS_CHANGED) != 0) {
7153b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            assignLayersLocked();
7154b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            mLayoutNeeded = true;
7155b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        }
7156b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
7157b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG) != 0) {
7158b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        if (DEBUG_LAYOUT) Slog.v(TAG, "Computing new config from layout");
715994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        if (updateOrientationFromAppTokensLocked(true)) {
7160b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            mLayoutNeeded = true;
7161b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
7162b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        }
7163b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
7164b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT) != 0) {
7165b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        mLayoutNeeded = true;
7166b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
7167b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                }
7168b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
7169b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                // FIRST LOOP: Perform a layout, if needed.
7170b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (repeats < 4) {
71713a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    changes = performLayoutLockedInner(repeats == 0, false /*updateInputWindows*/);
7172b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (changes != 0) {
7173b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        continue;
7174b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
7175b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                } else {
7176b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    Slog.w(TAG, "Layout repeat skipped after too many iterations");
7177b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    changes = 0;
7178b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                }
7179b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
71809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int transactionSequence = ++mTransactionSequence;
71819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
71829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Update animations of all applications, including those
71839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // associated with exiting/removed apps
71849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean tokensAnimating = false;
71859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int NAT = mAppTokens.size();
71869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (i=0; i<NAT; i++) {
7187e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                    if (mAppTokens.get(i).stepAnimationLocked(currentTime,
7188e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                            innerDw, innerDh)) {
71899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        tokensAnimating = true;
71909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
71919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
71929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int NEAT = mExitingAppTokens.size();
71939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (i=0; i<NEAT; i++) {
7194e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                    if (mExitingAppTokens.get(i).stepAnimationLocked(currentTime,
7195e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                            innerDw, innerDh)) {
71969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        tokensAnimating = true;
71979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
71989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
71999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7200b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                // SECOND LOOP: Execute animations and update visibility of windows.
7201b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
72028a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "*** ANIM STEP: seq="
7203de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        + transactionSequence + " tokensAnimating="
7204de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        + tokensAnimating);
7205de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn
72069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                animating = tokensAnimating;
72079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7208f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                if (mScreenRotationAnimation != null) {
7209f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                    if (mScreenRotationAnimation.isAnimating()) {
7210f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                        if (mScreenRotationAnimation.stepAnimation(currentTime)) {
7211f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                            animating = true;
7212f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                        } else {
721350660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn                            screenRotationFinished = true;
721489ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                            updateRotation = true;
7215f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                        }
7216f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                    }
7217f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                }
7218f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn
72199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean tokenMayBeDrawn = false;
72206c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                boolean wallpaperMayChange = false;
7221b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                boolean forceHiding = false;
72226c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                WindowState windowDetachedWallpaper = null;
7223de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                WindowState windowAnimationBackground = null;
7224de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                int windowAnimationBackgroundColor = 0;
72259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
72269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPolicy.beginAnimationLw(dw, dh);
72279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7228bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                final int N = mWindows.size();
7229ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
72309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (i=N-1; i>=0; i--) {
7231e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    WindowState w = mWindows.get(i);
72329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
72339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final WindowManager.LayoutParams attrs = w.mAttrs;
72349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
72359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (w.mSurface != null) {
72368e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        // Take care of the window being ready to display.
72376c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                        if (w.commitFinishDrawingLocked(currentTime)) {
72386c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                            if ((w.mAttrs.flags
72396c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                                    & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) {
72408a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_WALLPAPER) Slog.v(TAG,
72410586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                        "First draw done in potential wallpaper target " + w);
72426c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                                wallpaperMayChange = true;
72436c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                            }
72446c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                        }
7245ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
72466c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        final boolean wasAnimating = w.mAnimating;
72478e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn
7248e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                        int animDw = innerDw;
7249e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                        int animDh = innerDh;
72508e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn
72518e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        // If the window has moved due to its containing
72528e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        // content frame changing, then we'd like to animate
72538e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        // it.  The checks here are ordered by what is least
72543fe7f2f2e35692fe563ae00f62995030f1987c4fJoe Onorato                        // likely to be true first.
72551c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                        if (w.shouldAnimateMove()) {
72568e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            // Frame has moved, containing content frame
72578e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            // has also moved, and we're not currently animating...
72588e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            // let's do something.
72598e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            Animation a = AnimationUtils.loadAnimation(mContext,
72608e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                                    com.android.internal.R.anim.window_move_from_decor);
72618e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            w.setAnimation(a);
72628e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            animDw = w.mLastFrame.left - w.mFrame.left;
72638e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            animDh = w.mLastFrame.top - w.mFrame.top;
72648e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        }
72658e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn
72668e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        // Execute animation.
72678e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        final boolean nowAnimating = w.stepAnimationLocked(currentTime,
72688e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                                animDw, animDh);
72696c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn
72706c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        // If this window is animating, make a note that we have
72716c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        // an animating window and take care of a request to run
72726c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        // a detached wallpaper animation.
72736c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        if (nowAnimating) {
7274de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                            if (w.mAnimation != null) {
7275de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                if (w.mAnimation.getDetachWallpaper()) {
7276de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                    windowDetachedWallpaper = w;
7277de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                }
7278de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                if (w.mAnimation.getBackgroundColor() != 0) {
7279de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                    windowAnimationBackground = w;
7280de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                    windowAnimationBackgroundColor =
7281de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                            w.mAnimation.getBackgroundColor();
7282de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                }
72836c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                            }
72849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            animating = true;
72859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
72866c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn
72876c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        // If this window's app token is running a detached wallpaper
72886c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        // animation, make a note so we can ensure the wallpaper is
72896c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        // displayed behind it.
7290de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                        if (w.mAppToken != null && w.mAppToken.animation != null) {
7291de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                            if (w.mAppToken.animation.getDetachWallpaper()) {
7292de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                windowDetachedWallpaper = w;
7293de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                            }
7294de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                            if (w.mAppToken.animation.getBackgroundColor() != 0) {
7295de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                windowAnimationBackground = w;
7296de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                windowAnimationBackgroundColor =
7297de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                        w.mAppToken.animation.getBackgroundColor();
7298de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                            }
72996c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        }
73006c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn
73016136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                        if (wasAnimating && !w.mAnimating && mWallpaperTarget == w) {
73026136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                            wallpaperMayChange = true;
73036136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                        }
7304ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
73053b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        if (mPolicy.doesForceHide(w, attrs)) {
73066c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                            if (!wasAnimating && nowAnimating) {
730720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                if (DEBUG_VISIBILITY) Slog.v(TAG,
73086c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                                        "Animation started that could impact force hide: "
730920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        + w);
73103b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                wallpaperForceHidingChanged = true;
7311b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                                mFocusMayChange = true;
73123b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            } else if (w.isReadyForDisplay() && w.mAnimation == null) {
73133b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                forceHiding = true;
73143b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            }
73153b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        } else if (mPolicy.canBeForceHidden(w, attrs)) {
73163b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            boolean changed;
73173b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            if (forceHiding) {
73183b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                changed = w.hideLw(false, false);
731920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                if (DEBUG_VISIBILITY && changed) Slog.v(TAG,
732020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        "Now policy hidden: " + w);
73213b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            } else {
73223b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                changed = w.showLw(false, false);
732320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                if (DEBUG_VISIBILITY && changed) Slog.v(TAG,
732420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        "Now policy shown: " + w);
732520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                if (changed) {
732620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                    if (wallpaperForceHidingChanged
7327b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                            && w.isVisibleNow() /*w.isReadyForDisplay()*/) {
732820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // Assume we will need to animate.  If
732920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // we don't (because the wallpaper will
733020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // stay with the lock screen), then we will
733120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // clean up later.
733220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        Animation a = mPolicy.createForceHideEnterAnimation();
733320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        if (a != null) {
733420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                            w.setAnimation(a);
733520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        }
733620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                    }
733720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                    if (mCurrentFocus == null ||
733820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                            mCurrentFocus.mLayer < w.mLayer) {
733920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // We are showing on to of the current
734020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // focus, so re-evaluate focus to make
734120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // sure it is correct.
734220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        mFocusMayChange = true;
73433b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                    }
73443b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                }
73453b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            }
73463b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            if (changed && (attrs.flags
73473b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                    & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) {
73483b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                wallpaperMayChange = true;
73493b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            }
73503b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        }
7351ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
73529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mPolicy.animatingWindowLw(w, attrs);
73539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
73549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final AppWindowToken atoken = w.mAppToken;
73569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (atoken != null && (!atoken.allDrawn || atoken.freezingScreen)) {
73579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (atoken.lastTransactionSequence != transactionSequence) {
73589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            atoken.lastTransactionSequence = transactionSequence;
73599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            atoken.numInterestingWindows = atoken.numDrawnWindows = 0;
73609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            atoken.startingDisplayed = false;
73619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
73629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if ((w.isOnScreen() || w.mAttrs.type
73639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                == WindowManager.LayoutParams.TYPE_BASE_APPLICATION)
73649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                && !w.mExiting && !w.mDestroying) {
73659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) {
73668a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.v(TAG, "Eval win " + w + ": isDrawn="
73677433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn                                        + w.isDrawnLw()
73689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + ", isAnimating=" + w.isAnimating());
73697433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn                                if (!w.isDrawnLw()) {
73708a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                    Slog.v(TAG, "Not displayed: s=" + w.mSurface
73719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " pv=" + w.mPolicyVisibility
73729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " dp=" + w.mDrawPending
73739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " cdp=" + w.mCommitDrawPending
73749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " ah=" + w.mAttachedHidden
73759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " th=" + atoken.hiddenRequested
73769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " a=" + w.mAnimating);
73779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
73789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
73799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (w != atoken.startingWindow) {
73809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (!atoken.freezingScreen || !w.mAppFreezing) {
73819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    atoken.numInterestingWindows++;
73827433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn                                    if (w.isDrawnLw()) {
73839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        atoken.numDrawnWindows++;
73848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                        if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) Slog.v(TAG,
73859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                "tokenMayBeDrawn: " + atoken
73869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                + " freezingScreen=" + atoken.freezingScreen
73879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                + " mAppFreezing=" + w.mAppFreezing);
73889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        tokenMayBeDrawn = true;
73899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    }
73909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
73917433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn                            } else if (w.isDrawnLw()) {
73929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                atoken.startingDisplayed = true;
73939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
73949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
73959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (w.mReadyToShow) {
73969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.performShowLocked();
73979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
73989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
73999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7400b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                changes |= mPolicy.finishAnimationLw();
74019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
74029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (tokenMayBeDrawn) {
74039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // See if any windows have been drawn, so they (and others
74049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // associated with them) can now be shown.
7405f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    final int NT = mAppTokens.size();
74069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (i=0; i<NT; i++) {
7407f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                        AppWindowToken wtoken = mAppTokens.get(i);
74089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (wtoken.freezingScreen) {
74099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int numInteresting = wtoken.numInterestingWindows;
74109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
74118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_VISIBILITY) Slog.v(TAG,
74129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "allDrawn: " + wtoken
74139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " interesting=" + numInteresting
74149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " drawn=" + wtoken.numDrawnWindows);
74159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                wtoken.showAllWindowsLocked();
74169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                unsetAppFreezingScreenLocked(wtoken, false, true);
74179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                orientationChangeComplete = true;
74189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
74199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (!wtoken.allDrawn) {
74209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int numInteresting = wtoken.numInterestingWindows;
74219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
74228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_VISIBILITY) Slog.v(TAG,
74239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "allDrawn: " + wtoken
74249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " interesting=" + numInteresting
74259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " drawn=" + wtoken.numDrawnWindows);
74269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                wtoken.allDrawn = true;
7427b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
74289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
74299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // We can now show all of the drawn windows!
74309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (!mOpeningApps.contains(wtoken)) {
74319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    wtoken.showAllWindowsLocked();
74329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
74339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
74349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
74359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
74369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
74379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
74389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If we are ready to perform an app transition, check through
74399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // all of the app tokens to be shown and see if they are ready
74409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // to go.
74419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mAppTransitionReady) {
74429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int NN = mOpeningApps.size();
74439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean goodToGo = true;
74448a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
74459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "Checking " + NN + " opening apps (frozen="
74469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mDisplayFrozen + " timeout="
74479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mAppTransitionTimeout + ")...");
74489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mDisplayFrozen && !mAppTransitionTimeout) {
74499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // If the display isn't frozen, wait to do anything until
74509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // all of the apps are ready.  Otherwise just go because
74519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // we'll unfreeze the display when everyone is ready.
74529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (i=0; i<NN && goodToGo; i++) {
74539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AppWindowToken wtoken = mOpeningApps.get(i);
74548a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
74559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Check opening app" + wtoken + ": allDrawn="
74569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + wtoken.allDrawn + " startingDisplayed="
74579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + wtoken.startingDisplayed);
74589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (!wtoken.allDrawn && !wtoken.startingDisplayed
74599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    && !wtoken.startingMoved) {
74609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                goodToGo = false;
74619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
74629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
74639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
74649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (goodToGo) {
74658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO");
74669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int transit = mNextAppTransition;
74679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mSkipAppTransitionAnimation) {
7468bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                            transit = WindowManagerPolicy.TRANSIT_UNSET;
74699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
7470bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                        mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET;
74719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAppTransitionReady = false;
7472a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mAppTransitionRunning = true;
74739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAppTransitionTimeout = false;
74749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mStartingIconInTransition = false;
74759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mSkipAppTransitionAnimation = false;
74769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
74779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mH.removeMessages(H.APP_TRANSITION_TIMEOUT);
74789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7479a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // If there are applications waiting to come to the
7480a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // top of the stack, now is the time to move their windows.
7481a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // (Note that we don't do apps going to the bottom
7482a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // here -- we want to keep their windows in the old
7483a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // Z-order until the animation completes.)
7484a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        if (mToTopApps.size() > 0) {
7485a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                            NN = mAppTokens.size();
7486a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                            for (i=0; i<NN; i++) {
7487a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                                AppWindowToken wtoken = mAppTokens.get(i);
7488a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                                if (wtoken.sendingToTop) {
7489a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                                    wtoken.sendingToTop = false;
7490a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                                    moveAppWindowsLocked(wtoken, NN, false);
7491a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                                }
7492a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                            }
7493a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                            mToTopApps.clear();
7494a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        }
7495ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
749625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        WindowState oldWallpaper = mWallpaperTarget;
7497ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
74983be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        adjustWallpaperWindowsLocked();
74996c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                        wallpaperMayChange = false;
7500ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7501bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // The top-most window will supply the layout params,
7502bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // and we will determine it below.
7503bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        LayoutParams animLp = null;
7504bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        int bestAnimLayer = -1;
750508121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                        boolean fullscreenAnim = false;
7506ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
75078a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
75083be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                                "New wallpaper target=" + mWallpaperTarget
75093be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                                + ", lower target=" + mLowerWallpaperTarget
75103be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                                + ", upper target=" + mUpperWallpaperTarget);
751125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        int foundWallpapers = 0;
7512bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // Do a first pass through the tokens for two
7513bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // things:
7514bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // (1) Determine if both the closing and opening
7515bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // app token sets are wallpaper targets, in which
7516bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // case special animations are needed
7517bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // (since the wallpaper needs to stay static
7518bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // behind them).
7519bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // (2) Find the layout params of the top-most
7520bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // application window in the tokens, which is
7521bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // what will control the animation theme.
7522bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        final int NC = mClosingApps.size();
7523bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        NN = NC + mOpeningApps.size();
7524bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        for (i=0; i<NN; i++) {
7525bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            AppWindowToken wtoken;
7526bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            int mode;
7527bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            if (i < NC) {
7528bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                wtoken = mClosingApps.get(i);
7529bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                mode = 1;
7530bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            } else {
7531bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                wtoken = mOpeningApps.get(i-NC);
7532bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                mode = 2;
7533f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                            }
7534bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            if (mLowerWallpaperTarget != null) {
7535bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                if (mLowerWallpaperTarget.mAppToken == wtoken
7536bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                        || mUpperWallpaperTarget.mAppToken == wtoken) {
7537bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                    foundWallpapers |= mode;
7538f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                                }
7539bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            }
7540bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            if (wtoken.appFullscreen) {
7541bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                WindowState ws = wtoken.findMainWindow();
7542bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                if (ws != null) {
7543ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                                    animLp = ws.mAttrs;
7544ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                                    bestAnimLayer = ws.mLayer;
754508121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                                    fullscreenAnim = true;
754608121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                                }
754708121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                            } else if (!fullscreenAnim) {
754808121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                                WindowState ws = wtoken.findMainWindow();
754908121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                                if (ws != null) {
755008121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                                    if (ws.mLayer > bestAnimLayer) {
7551bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                        animLp = ws.mAttrs;
7552bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                        bestAnimLayer = ws.mLayer;
7553bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                    }
7554f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                                }
7555f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                            }
755625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        }
7557ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
755825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        if (foundWallpapers == 3) {
75598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
756025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    "Wallpaper animation!");
756125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            switch (transit) {
756225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN:
756325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                case WindowManagerPolicy.TRANSIT_TASK_OPEN:
756425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                case WindowManagerPolicy.TRANSIT_TASK_TO_FRONT:
756525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    transit = WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_OPEN;
756625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    break;
756725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                case WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE:
756825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                case WindowManagerPolicy.TRANSIT_TASK_CLOSE:
756925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                case WindowManagerPolicy.TRANSIT_TASK_TO_BACK:
757025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    transit = WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_CLOSE;
757125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    break;
7572f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                            }
75738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
757425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    "New transit: " + transit);
757525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        } else if (oldWallpaper != null) {
757625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            // We are transitioning from an activity with
757725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            // a wallpaper to one without.
757825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            transit = WindowManagerPolicy.TRANSIT_WALLPAPER_CLOSE;
75798a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
758025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    "New transit away from wallpaper: " + transit);
758125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        } else if (mWallpaperTarget != null) {
758225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            // We are transitioning from an activity without
758325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            // a wallpaper to now showing the wallpaper
758425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            transit = WindowManagerPolicy.TRANSIT_WALLPAPER_OPEN;
75858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
758625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    "New transit into wallpaper: " + transit);
7587f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                        }
7588ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7589de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        // If all closing windows are obscured, then there is
7590de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        // no need to do an animation.  This is the case, for
7591de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        // example, when this transition is being done behind
7592de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        // the lock screen.
7593de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        if (!mPolicy.allowAppAnimationsLw()) {
7594de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            animLp = null;
7595de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        }
7596de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn
75979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        NN = mOpeningApps.size();
75989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (i=0; i<NN; i++) {
75999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AppWindowToken wtoken = mOpeningApps.get(i);
76008a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
76019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Now opening app" + wtoken);
76029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.reportedVisible = false;
76039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.inPendingTransaction = false;
760483360b3167f2c394125b74f655bc577070cb9ccaDianne Hackborn                            wtoken.animation = null;
7605e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                            setTokenVisibilityLocked(wtoken, animLp, true,
7606ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                                    transit, false);
76079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.updateReportedVisibilityLocked();
7608a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                            wtoken.waitingToShow = false;
76099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.showAllWindowsLocked();
76109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
76119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        NN = mClosingApps.size();
76129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (i=0; i<NN; i++) {
76139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AppWindowToken wtoken = mClosingApps.get(i);
76148a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
76159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Now closing app" + wtoken);
76169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.inPendingTransaction = false;
761783360b3167f2c394125b74f655bc577070cb9ccaDianne Hackborn                            wtoken.animation = null;
7618e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                            setTokenVisibilityLocked(wtoken, animLp, false,
7619ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                                    transit, false);
76209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.updateReportedVisibilityLocked();
7621a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                            wtoken.waitingToHide = false;
76229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Force the allDrawn flag, because we want to start
76239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // this guy's animations regardless of whether it's
76249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // gotten drawn.
76259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.allDrawn = true;
76269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
76279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
76288b571a817cc953ce96750f440645f104c7f55157Dianne Hackborn                        mNextAppTransitionPackage = null;
7629ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
76309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mOpeningApps.clear();
76319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mClosingApps.clear();
76329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
76339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // This has changed the visibility of windows, so perform
76349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // a new layout to get them all up-to-date.
763594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT
763694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                                | WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG;
76379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLayoutNeeded = true;
763820583ff9d49257bd4ccc60e7b6337661e34ed887Dianne Hackborn                        if (!moveInputMethodWindowsIfNeededLocked(true)) {
763920583ff9d49257bd4ccc60e7b6337661e34ed887Dianne Hackborn                            assignLayersLocked();
764020583ff9d49257bd4ccc60e7b6337661e34ed887Dianne Hackborn                        }
76413a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES,
76423a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                                false /*updateInputWindows*/);
7643b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                        mFocusMayChange = false;
76449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
76459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7646ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
764716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                int adjResult = 0;
764816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn
7649a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                if (!animating && mAppTransitionRunning) {
7650a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // We have finished the animation of an app transition.  To do
7651a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // this, we have delayed a lot of operations like showing and
7652a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // hiding apps, moving apps in Z-order, etc.  The app token list
7653a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // reflects the correct Z-order, but the window list may now
7654a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // be out of sync with it.  So here we will just rebuild the
7655a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // entire app window list.  Fun!
7656a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    mAppTransitionRunning = false;
7657a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // Clear information about apps that were moving.
7658a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    mToBottomApps.clear();
7659ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7660a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    rebuildAppWindowListLocked();
7661b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT;
766216064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                    adjResult |= ADJUST_WALLPAPER_LAYERS_CHANGED;
7663a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    moveInputMethodWindowsIfNeededLocked(false);
7664a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    wallpaperMayChange = true;
7665c9568e3989f1491abaa7960eca986af12743cb05Suchi Amalapurapu                    // Since the window list has been rebuilt, focus might
7666c9568e3989f1491abaa7960eca986af12743cb05Suchi Amalapurapu                    // have to be recomputed since the actual order of windows
7667c9568e3989f1491abaa7960eca986af12743cb05Suchi Amalapurapu                    // might have changed again.
7668b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                    mFocusMayChange = true;
7669a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                }
7670ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7671b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (wallpaperForceHidingChanged && changes == 0 && !mAppTransitionReady) {
76723b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // At this point, there was a window with a wallpaper that
76733b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // was force hiding other windows behind it, but now it
76743b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // is going away.  This may be simple -- just animate
76753b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // away the wallpaper and its window -- or it may be
76763b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // hard -- the wallpaper now needs to be shown behind
76773b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // something that was hidden.
76783b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    WindowState oldWallpaper = mWallpaperTarget;
7679de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                    if (mLowerWallpaperTarget != null
7680de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            && mLowerWallpaperTarget.mAppToken != null) {
76818a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_WALLPAPER) Slog.v(TAG,
7682de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                                "wallpaperForceHiding changed with lower="
7683de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                                + mLowerWallpaperTarget);
76848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_WALLPAPER) Slog.v(TAG,
7685de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                                "hidden=" + mLowerWallpaperTarget.mAppToken.hidden +
7686de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                                " hiddenRequested=" + mLowerWallpaperTarget.mAppToken.hiddenRequested);
7687de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        if (mLowerWallpaperTarget.mAppToken.hidden) {
7688de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            // The lower target has become hidden before we
7689de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            // actually started the animation...  let's completely
7690de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            // re-evaluate everything.
7691de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            mLowerWallpaperTarget = mUpperWallpaperTarget = null;
7692b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
7693de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        }
7694de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                    }
769516064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                    adjResult |= adjustWallpaperWindowsLocked();
76963b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    wallpaperMayChange = false;
7697de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                    wallpaperForceHidingChanged = false;
76988a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WALLPAPER) Slog.v(TAG, "****** OLD: " + oldWallpaper
7699de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            + " NEW: " + mWallpaperTarget
7700de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            + " LOWER: " + mLowerWallpaperTarget);
77013b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    if (mLowerWallpaperTarget == null) {
77023b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        // Whoops, we don't need a special wallpaper animation.
77033b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        // Clear them out.
77043b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        forceHiding = false;
77053b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        for (i=N-1; i>=0; i--) {
7706e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                            WindowState w = mWindows.get(i);
77073b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            if (w.mSurface != null) {
77083b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                final WindowManager.LayoutParams attrs = w.mAttrs;
7709c03d28b9e96f667d29ec6e480bed171bbd07169dSuchi Amalapurapu                                if (mPolicy.doesForceHide(w, attrs) && w.isVisibleLw()) {
77108a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                    if (DEBUG_FOCUS) Slog.i(TAG, "win=" + w + " force hides other windows");
77113b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                    forceHiding = true;
77123b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                } else if (mPolicy.canBeForceHidden(w, attrs)) {
77133b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                    if (!w.mAnimating) {
77143b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                        // We set the animation above so it
77153b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                        // is not yet running.
77163b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                        w.clearAnimation();
77173b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                    }
77183b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                }
77193b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            }
77203b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        }
77213b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    }
77223b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                }
7723ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
77246c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                if (mWindowDetachedWallpaper != windowDetachedWallpaper) {
77256c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                    if (DEBUG_WALLPAPER) Slog.v(TAG,
77266c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                            "Detached wallpaper changed from " + mWindowDetachedWallpaper
77276c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                            + windowDetachedWallpaper);
77286c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                    mWindowDetachedWallpaper = windowDetachedWallpaper;
77296c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                    wallpaperMayChange = true;
77306c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                }
77316c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn
7732de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                if (windowAnimationBackgroundColor != 0) {
7733de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                    if (mWindowAnimationBackgroundSurface == null) {
7734de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                        mWindowAnimationBackgroundSurface = new DimSurface(mFxSession);
7735de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                    }
7736de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                    mWindowAnimationBackgroundSurface.show(dw, dh,
7737de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                            windowAnimationBackground.mAnimLayer - LAYER_OFFSET_DIM,
7738de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                            windowAnimationBackgroundColor);
7739de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                } else if (mWindowAnimationBackgroundSurface != null) {
7740de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                    mWindowAnimationBackgroundSurface.hide();
7741de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                }
7742de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn
77436c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                if (wallpaperMayChange) {
77448a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WALLPAPER) Slog.v(TAG,
77450586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                            "Wallpaper may change!  Adjusting");
774616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                    adjResult |= adjustWallpaperWindowsLocked();
77473b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                }
7748ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
77493b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                if ((adjResult&ADJUST_WALLPAPER_LAYERS_CHANGED) != 0) {
77508a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WALLPAPER) Slog.v(TAG,
77513b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            "Wallpaper layer changed: assigning layers + relayout");
7752b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT;
77533b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    assignLayersLocked();
77543b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                } else if ((adjResult&ADJUST_WALLPAPER_VISIBILITY_CHANGED) != 0) {
77558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WALLPAPER) Slog.v(TAG,
77563b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            "Wallpaper visibility changed: relayout");
7757b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT;
77583b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                }
7759ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7760b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                if (mFocusMayChange) {
7761b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                    mFocusMayChange = false;
77623a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    if (updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES,
77633a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                            false /*updateInputWindows*/)) {
7764b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
77653b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        adjResult = 0;
7766a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    }
77676c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                }
77683b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn
77693b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                if (mLayoutNeeded) {
7770b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT;
77713b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                }
7772ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7773b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "*** ANIM STEP: changes=0x"
7774b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + Integer.toHexString(changes));
7775b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            } while (changes != 0);
77769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
77779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // THIRD LOOP: Update the surfaces of all windows.
77789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
77799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final boolean someoneLosingFocus = mLosingFocus.size() != 0;
77809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
77819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean obscured = false;
77829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean blurring = false;
77839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean dimming = false;
77849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean covered = false;
77859ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn            boolean syswin = false;
77869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7787bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn            final int N = mWindows.size();
7788ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
77899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (i=N-1; i>=0; i--) {
7790e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState w = mWindows.get(i);
77919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
77929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean displayed = false;
77939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final WindowManager.LayoutParams attrs = w.mAttrs;
77949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int attrFlags = attrs.flags;
77959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
77969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (w.mSurface != null) {
7797ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // XXX NOTE: The logic here could be improved.  We have
7798ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // the decision about whether to resize a window separated
7799ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // from whether to hide the surface.  This can cause us to
7800ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // resize a surface even if we are going to hide it.  You
7801ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // can see this by (1) holding device in landscape mode on
7802ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // home screen; (2) tapping browser icon (device will rotate
7803ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // to landscape; (3) tap home.  The wallpaper will be resized
7804ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // in step 2 but then immediately hidden, causing us to
7805ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // have to resize and then redraw it again in step 3.  It
7806ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // would be nice to figure out how to avoid this, but it is
7807ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // difficult because we do need to resize surfaces in some
7808ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // cases while they are hidden such as when first showing a
7809ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // window.
7810ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn
78119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.computeShownFrameLocked();
78128a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (localLOGV) Slog.v(
78139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            TAG, "Placing surface #" + i + " " + w.mSurface
7814ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                            + ": new=" + w.mShownFrame);
78159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
78169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int width, height;
78179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if ((w.mAttrs.flags & w.mAttrs.FLAG_SCALED) != 0) {
78189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // for a scaled surface, we just want to use
78199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // the requested size.
78209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        width  = w.mRequestedWidth;
78219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        height = w.mRequestedHeight;
78229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
7823ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                        width = w.mCompatFrame.width();
7824ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                        height = w.mCompatFrame.height();
78259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
78269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7827fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                    if (w.mSurface != null) {
7828fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                        if (w.mSurfaceX != w.mShownFrame.left
7829fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                || w.mSurfaceY != w.mShownFrame.top) {
7830fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                            try {
7831fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                if (SHOW_TRANSACTIONS) logSurface(w,
7832fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        "POS " + w.mShownFrame.left
7833fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + ", " + w.mShownFrame.top, null);
7834fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                w.mSurfaceX = w.mShownFrame.left;
7835fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                w.mSurfaceY = w.mShownFrame.top;
7836fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                w.mSurface.setPosition(w.mShownFrame.left, w.mShownFrame.top);
7837fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                            } catch (RuntimeException e) {
7838fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                Slog.w(TAG, "Error positioning surface of " + w
7839fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + " pos=(" + w.mShownFrame.left
7840fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + "," + w.mShownFrame.top + ")", e);
7841fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                if (!recoveringMemory) {
7842648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                    reclaimSomeSurfaceMemoryLocked(w, "position", true);
7843fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                }
7844fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                            }
7845fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                        }
7846fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown
7847fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                        if (width < 1) {
7848fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                            width = 1;
7849fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                        }
7850fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                        if (height < 1) {
7851fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                            height = 1;
7852fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                        }
7853fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown
7854fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                        if (w.mSurfaceW != width || w.mSurfaceH != height) {
78559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            try {
7856b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                if (SHOW_TRANSACTIONS) logSurface(w,
7857fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        "SIZE " + w.mShownFrame.width() + "x"
7858b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                        + w.mShownFrame.height(), null);
7859ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                                w.mSurfaceResized = true;
786016064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                w.mSurfaceW = width;
786116064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                w.mSurfaceH = height;
78629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mSurface.setSize(width, height);
78639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } catch (RuntimeException e) {
78649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // If something goes wrong with the surface (such
78659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // as running out of memory), don't take down the
78669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // entire system.
7867fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                Slog.e(TAG, "Error resizing surface of " + w
7868fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + " size=(" + width + "x" + height + ")", e);
78699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (!recoveringMemory) {
7870648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                    reclaimSomeSurfaceMemoryLocked(w, "size", true);
78719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
78729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
78739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
78749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
7875fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown
7876e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    if (!w.mAppFreezing && w.mLayoutSeq == mLayoutSeq) {
78779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mContentInsetsChanged =
78789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            !w.mLastContentInsets.equals(w.mContentInsets);
78799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mVisibleInsetsChanged =
78809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            !w.mLastVisibleInsets.equals(w.mVisibleInsets);
7881e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                        boolean configChanged =
7882e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                            w.mConfiguration != mCurConfiguration
7883e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                            && (w.mConfiguration == null
7884e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                                    || mCurConfiguration.diff(w.mConfiguration) != 0);
7885694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        if (DEBUG_CONFIGURATION && configChanged) {
7886694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            Slog.v(TAG, "Win " + w + " config changed: "
7887694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                    + mCurConfiguration);
7888694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        }
78898a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (localLOGV) Slog.v(TAG, "Resizing " + w
7890e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                                + ": configChanged=" + configChanged
7891ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                                + " last=" + w.mLastCompatFrame + " frame=" + w.mCompatFrame);
7892ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                        boolean frameChanged = !w.mLastCompatFrame.equals(w.mCompatFrame);
7893fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                        if (frameChanged
78949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                || w.mContentInsetsChanged
7895e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                                || w.mVisibleInsetsChanged
7896ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                                || w.mSurfaceResized
7897e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                                || configChanged) {
7898fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                            if (DEBUG_RESIZE || DEBUG_ORIENTATION) {
7899fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                Slog.v(TAG, "Resize reasons: "
7900fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + "frameChanged=" + frameChanged
7901fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + " contentInsetsChanged=" + w.mContentInsetsChanged
7902fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + " visibleInsetsChanged=" + w.mVisibleInsetsChanged
7903fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + " surfaceResized=" + w.mSurfaceResized
7904fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + " configChanged=" + configChanged);
7905fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                            }
7906fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown
79079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            w.mLastFrame.set(w.mFrame);
7908ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                            w.mLastCompatFrame.set(w.mCompatFrame);
79099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            w.mLastContentInsets.set(w.mContentInsets);
79109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            w.mLastVisibleInsets.set(w.mVisibleInsets);
79110586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                            // If the screen is currently frozen, then keep
79120586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                            // it frozen until this window draws at its new
79130586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                            // orientation.
79140586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                            if (mDisplayFrozen) {
79158a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_ORIENTATION) Slog.v(TAG,
79160586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                        "Resizing while display frozen: " + w);
79170586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                w.mOrientationChanging = true;
7918e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                                if (!mWindowsFreezingScreen) {
79190586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                    mWindowsFreezingScreen = true;
79200586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                    // XXX should probably keep timeout from
79210586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                    // when we first froze the display.
79220586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                    mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT);
79230586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                    mH.sendMessageDelayed(mH.obtainMessage(
79240586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                            H.WINDOW_FREEZE_TIMEOUT), 2000);
79250586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                }
79260586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                            }
79279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // If the orientation is changing, then we need to
79289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // hold off on unfreezing the display until this
79299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // window has been redrawn; to do that, we need
79309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // to go through the process of getting informed
79319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // by the application when it has finished drawing.
79329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (w.mOrientationChanging) {
79338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_ORIENTATION) Slog.v(TAG,
79349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "Orientation start waiting for draw in "
79359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + w + ", surface " + w.mSurface);
79369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mDrawPending = true;
79379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mCommitDrawPending = false;
79389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mReadyToShow = false;
79399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (w.mAppToken != null) {
79409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    w.mAppToken.allDrawn = false;
79419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
79429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
7943ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                            if (DEBUG_RESIZE || DEBUG_ORIENTATION) Slog.v(TAG,
7944ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                                    "Resizing window " + w + " to " + w.mCompatFrame);
79459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mResizingWindows.add(w);
79469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (w.mOrientationChanging) {
79479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (!w.mDrawPending && !w.mCommitDrawPending) {
79488a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_ORIENTATION) Slog.v(TAG,
79499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "Orientation not waiting for draw in "
79509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + w + ", surface " + w.mSurface);
79519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mOrientationChanging = false;
79529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
79539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
79549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
79559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
79563b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    if (w.mAttachedHidden || !w.isReadyForDisplay()) {
79579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!w.mLastHidden) {
79589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            //dump();
79599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            w.mLastHidden = true;
7960b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            if (SHOW_TRANSACTIONS) logSurface(w,
7961b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                    "HIDE (performLayout)", null);
79629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (w.mSurface != null) {
796316064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                w.mSurfaceShown = false;
79649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                try {
79659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    w.mSurface.hide();
79669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                } catch (RuntimeException e) {
79678a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                    Slog.w(TAG, "Exception hiding surface in " + w);
79689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
79699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
79709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
79719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // If we are waiting for this window to handle an
79729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // orientation change, well, it is hidden, so
79739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // doesn't really matter.  Note that this does
79749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // introduce a potential glitch if the window
79759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // becomes unhidden before it has drawn for the
79769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // new orientation.
79779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (w.mOrientationChanging) {
79789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            w.mOrientationChanging = false;
79798a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_ORIENTATION) Slog.v(TAG,
79809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Orientation change skips hidden " + w);
79819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
79829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (w.mLastLayer != w.mAnimLayer
79839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastAlpha != w.mShownAlpha
79849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastDsDx != w.mDsDx
79859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastDtDx != w.mDtDx
79869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastDsDy != w.mDsDy
79879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastDtDy != w.mDtDy
79889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastHScale != w.mHScale
79899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastVScale != w.mVScale
79909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastHidden) {
79919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        displayed = true;
79929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastAlpha = w.mShownAlpha;
79939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastLayer = w.mAnimLayer;
79949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastDsDx = w.mDsDx;
79959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastDtDx = w.mDtDx;
79969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastDsDy = w.mDsDy;
79979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastDtDy = w.mDtDy;
79989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastHScale = w.mHScale;
79999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastVScale = w.mVScale;
8000b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        if (SHOW_TRANSACTIONS) logSurface(w,
8001b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                "alpha=" + w.mShownAlpha + " layer=" + w.mAnimLayer
80020586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                + " matrix=[" + (w.mDsDx*w.mHScale)
80030586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                + "," + (w.mDtDx*w.mVScale)
80040586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                + "][" + (w.mDsDy*w.mHScale)
8005b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                + "," + (w.mDtDy*w.mVScale) + "]", null);
80069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (w.mSurface != null) {
80079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            try {
800816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                w.mSurfaceAlpha = w.mShownAlpha;
80099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mSurface.setAlpha(w.mShownAlpha);
801016064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                w.mSurfaceLayer = w.mAnimLayer;
80119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mSurface.setLayer(w.mAnimLayer);
80129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mSurface.setMatrix(
80139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        w.mDsDx*w.mHScale, w.mDtDx*w.mVScale,
80149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        w.mDsDy*w.mHScale, w.mDtDy*w.mVScale);
80159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } catch (RuntimeException e) {
80168a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.w(TAG, "Error updating surface in " + w, e);
80179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (!recoveringMemory) {
8018648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                    reclaimSomeSurfaceMemoryLocked(w, "update", true);
80199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
80209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
80219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
80229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
80239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (w.mLastHidden && !w.mDrawPending
80249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                && !w.mCommitDrawPending
80259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                && !w.mReadyToShow) {
8026b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            if (SHOW_TRANSACTIONS) logSurface(w,
8027b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                    "SHOW (performLayout)", null);
80288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + w
80299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + " during relayout");
80309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (showSurfaceRobustlyLocked(w)) {
80319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mHasDrawn = true;
80329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mLastHidden = false;
80339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } else {
80349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mOrientationChanging = false;
80359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
80369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
80379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (w.mSurface != null) {
80389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            w.mToken.hasVisible = true;
80399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
80409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
80419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        displayed = true;
80429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
80439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
80449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (displayed) {
80459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!covered) {
8046980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy                            if (attrs.width == LayoutParams.MATCH_PARENT
8047980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy                                    && attrs.height == LayoutParams.MATCH_PARENT) {
80489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                covered = true;
80499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
80509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
80519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (w.mOrientationChanging) {
80529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (w.mDrawPending || w.mCommitDrawPending) {
80539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                orientationChangeComplete = false;
80548a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_ORIENTATION) Slog.v(TAG,
80559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "Orientation continue waiting for draw in " + w);
80569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } else {
80579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mOrientationChanging = false;
80588a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_ORIENTATION) Slog.v(TAG,
80599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "Orientation change complete in " + w);
80609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
80619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
80629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mToken.hasVisible = true;
80639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
80649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (w.mOrientationChanging) {
80658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_ORIENTATION) Slog.v(TAG,
80669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "Orientation change skips hidden " + w);
80679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mOrientationChanging = false;
80689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
80699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
80700f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                if (w.mContentChanged) {
80710f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                    //Slog.i(TAG, "Window " + this + " clearing mContentChanged - done placing");
80720f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                    w.mContentChanged = false;
80730f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                }
80740f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
80759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final boolean canBeSeen = w.isDisplayedLw();
80769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
80779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (someoneLosingFocus && w == mCurrentFocus && canBeSeen) {
80789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    focusDisplayed = true;
80799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
80809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8081e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                final boolean obscuredChanged = w.mObscured != obscured;
8082ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
80839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Update effect.
80847341d7a104b47996445d069a695e155a07184606Dianne Hackborn                if (!(w.mObscured=obscured)) {
80859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (w.mSurface != null) {
80869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if ((attrFlags&FLAG_KEEP_SCREEN_ON) != 0) {
80879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            holdScreen = w.mSession;
80889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
80899ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn                        if (!syswin && w.mAttrs.screenBrightness >= 0
80909ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn                                && screenBrightness < 0) {
80919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            screenBrightness = w.mAttrs.screenBrightness;
80929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
8093fb73f79340375013225618a5d87f46b958f698efMike Lockwood                        if (!syswin && w.mAttrs.buttonBrightness >= 0
8094fb73f79340375013225618a5d87f46b958f698efMike Lockwood                                && buttonBrightness < 0) {
8095fb73f79340375013225618a5d87f46b958f698efMike Lockwood                            buttonBrightness = w.mAttrs.buttonBrightness;
8096fb73f79340375013225618a5d87f46b958f698efMike Lockwood                        }
809746af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood                        if (canBeSeen
809846af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood                                && (attrs.type == WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG
809946af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood                                 || attrs.type == WindowManager.LayoutParams.TYPE_KEYGUARD
810046af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood                                 || attrs.type == WindowManager.LayoutParams.TYPE_SYSTEM_ERROR)) {
81019ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn                            syswin = true;
81029ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn                        }
81039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
81041ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
810525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                    boolean opaqueDrawn = canBeSeen && w.isOpaqueDrawn();
8106e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn                    if (opaqueDrawn && w.isFullscreen(innerDw, innerDh)) {
81079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // This window completely covers everything behind it,
81089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // so we want to leave all of them as unblurred (for
81099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // performance reasons).
81109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        obscured = true;
81113b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    } else if (canBeSeen && !obscured &&
81129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            (attrFlags&FLAG_BLUR_BEHIND|FLAG_DIM_BEHIND) != 0) {
81138a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (localLOGV) Slog.v(TAG, "Win " + w
81149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ": blurring=" + blurring
81159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " obscured=" + obscured
81169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " displayed=" + displayed);
81179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if ((attrFlags&FLAG_DIM_BEHIND) != 0) {
81189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (!dimming) {
81198a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                //Slog.i(TAG, "DIM BEHIND: " + w);
81209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                dimming = true;
81210a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                if (mDimAnimator == null) {
81220a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                    mDimAnimator = new DimAnimator(mFxSession);
81239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
812448a7651823030ed3c0f4c084b423430044425feaDianne Hackborn                                mDimAnimator.show(innerDw, innerDh);
81251c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                                mDimAnimator.updateParameters(mContext.getResources(),
81261c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                                        w, currentTime);
81279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
81289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
81299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if ((attrFlags&FLAG_BLUR_BEHIND) != 0) {
81309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (!blurring) {
81318a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                //Slog.i(TAG, "BLUR BEHIND: " + w);
81329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                blurring = true;
81339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (mBlurSurface == null) {
81349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    try {
813506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                                        mBlurSurface = new Surface(mFxSession, 0,
81365d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian                                                "BlurSurface",
81379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                -1, 16, 16,
81389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                PixelFormat.OPAQUE,
81399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                Surface.FX_SURFACE_BLUR);
81409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    } catch (Exception e) {
81418a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                        Slog.e(TAG, "Exception creating Blur surface", e);
81429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    }
8143ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                                    if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BLUR "
8144ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                                            + mBlurSurface + ": CREATE");
81459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
81469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (mBlurSurface != null) {
814716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                    if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BLUR "
814816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                            + mBlurSurface + ": pos=(0,0) (" +
814916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                            dw + "x" + dh + "), layer=" + (w.mAnimLayer-1));
81509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    mBlurSurface.setPosition(0, 0);
81519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    mBlurSurface.setSize(dw, dh);
8152de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                                    mBlurSurface.setLayer(w.mAnimLayer-LAYER_OFFSET_BLUR);
815316064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                    if (!mBlurShown) {
815416064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                        try {
815516064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                            if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BLUR "
815616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                                    + mBlurSurface + ": SHOW");
815716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                            mBlurSurface.show();
815816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                        } catch (RuntimeException e) {
815916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                            Slog.w(TAG, "Failure showing blur surface", e);
816016064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                        }
816116064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                        mBlurShown = true;
81629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    }
81639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
81649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
81659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
81669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
81679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8168ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
8169e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                if (obscuredChanged && mWallpaperTarget == w) {
8170e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    // This is the wallpaper target and its obscured state
8171e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    // changed... make sure the current wallaper's visibility
8172e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    // has been updated accordingly.
8173e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    updateWallpaperVisibilityLocked();
8174e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                }
81759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8176ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
81770a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima            if (mDimAnimator != null && mDimAnimator.mDimShown) {
8178de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                animating |= mDimAnimator.updateSurface(dimming, currentTime,
8179de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        mDisplayFrozen || !mPolicy.isScreenOn());
81809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
818106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
81829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!blurring && mBlurShown) {
81838a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BLUR " + mBlurSurface
81849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": HIDE");
81859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
81869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mBlurSurface.hide();
81879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IllegalArgumentException e) {
81888a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Illegal argument exception hiding blur surface");
81899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
81909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mBlurShown = false;
81919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
81927916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
81937916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (mBlackFrame != null) {
81947916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                if (mScreenRotationAnimation != null) {
81957916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    mBlackFrame.setMatrix(
81967916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                            mScreenRotationAnimation.getEnterTransformation().getMatrix());
81977916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                } else {
81987916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    mBlackFrame.clearMatrix();
81997916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                }
82007916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
82019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
82028a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.e(TAG, "Unhandled exception in Window Manager", e);
82039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
82049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
82059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Surface.closeTransaction();
820606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
820794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn        if (SHOW_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION performLayoutAndPlaceSurfaces");
820894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn
8209b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        if (mWatermark != null) {
8210b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            mWatermark.drawIfNeeded();
8211b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        }
8212b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn
82138a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_ORIENTATION && mDisplayFrozen) Slog.v(TAG,
82149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "With display frozen, orientationChangeComplete="
82159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + orientationChangeComplete);
82169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (orientationChangeComplete) {
82179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mWindowsFreezingScreen) {
82189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindowsFreezingScreen = false;
82199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT);
82209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8221e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            stopFreezingDisplayLocked();
82229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
822306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
82249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        i = mResizingWindows.size();
82259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (i > 0) {
82269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            do {
82279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
82289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState win = mResizingWindows.get(i);
82299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
8230ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    if (DEBUG_RESIZE || DEBUG_ORIENTATION) Slog.v(TAG,
8231ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                            "Reporting new frame to " + win + ": " + win.mCompatFrame);
8232694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    int diff = 0;
8233e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    boolean configChanged =
8234e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                        win.mConfiguration != mCurConfiguration
8235e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                        && (win.mConfiguration == null
8236694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                || (diff=mCurConfiguration.diff(win.mConfiguration)) != 0);
8237694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    if ((DEBUG_RESIZE || DEBUG_ORIENTATION || DEBUG_CONFIGURATION)
8238694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            && configChanged) {
82398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.i(TAG, "Sending new config to window " + win + ": "
8240ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                                + win.mCompatFrame.width() + "x" + win.mCompatFrame.height()
8241694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                + " / " + mCurConfiguration + " / 0x"
8242694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                + Integer.toHexString(diff));
8243e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    }
8244694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    win.mConfiguration = mCurConfiguration;
8245ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                    win.mClient.resized(win.mCompatFrame.width(),
8246ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn                            win.mCompatFrame.height(), win.mLastContentInsets,
8247e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                            win.mLastVisibleInsets, win.mDrawPending,
8248e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                            configChanged ? win.mConfiguration : null);
82499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mContentInsetsChanged = false;
82509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mVisibleInsetsChanged = false;
8251ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    win.mSurfaceResized = false;
82529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
82539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mOrientationChanging = false;
82549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
82559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } while (i > 0);
82569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResizingWindows.clear();
82579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
825806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
82599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Destroy the surface of any windows that are no longer visible.
82607341d7a104b47996445d069a695e155a07184606Dianne Hackborn        boolean wallpaperDestroyed = false;
82619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        i = mDestroySurface.size();
82629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (i > 0) {
82639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            do {
82649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
82659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState win = mDestroySurface.get(i);
82669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mDestroying = false;
82679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mInputMethodWindow == win) {
82689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mInputMethodWindow = null;
82699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
82707341d7a104b47996445d069a695e155a07184606Dianne Hackborn                if (win == mWallpaperTarget) {
82717341d7a104b47996445d069a695e155a07184606Dianne Hackborn                    wallpaperDestroyed = true;
82727341d7a104b47996445d069a695e155a07184606Dianne Hackborn                }
82739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.destroySurfaceLocked();
82749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } while (i > 0);
82759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDestroySurface.clear();
82769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
82779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
82789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Time to remove any exiting tokens?
82799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=mExitingTokens.size()-1; i>=0; i--) {
82809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken token = mExitingTokens.get(i);
82819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!token.hasVisible) {
82829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mExitingTokens.remove(i);
82834c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                if (token.windowType == TYPE_WALLPAPER) {
82844c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mWallpaperTokens.remove(token);
82854c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
82869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
82879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
82889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
82899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Time to remove any exiting applications?
82909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=mExitingAppTokens.size()-1; i>=0; i--) {
82919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken token = mExitingAppTokens.get(i);
82929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!token.hasVisible && !mClosingApps.contains(token)) {
82939bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                // Make sure there is no animation running on this token,
82949bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                // so any windows associated with it will be removed as
82959bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                // soon as their animations are complete
82969bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                token.animation = null;
82979bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                token.animating = false;
8298f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG,
8299f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                        "performLayout: App token exiting now removed" + token);
83009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppTokens.remove(token);
83019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mExitingAppTokens.remove(i);
83029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
83039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
83049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8305a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        boolean needRelayout = false;
8306ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
8307a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        if (!animating && mAppTransitionRunning) {
8308a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // We have finished the animation of an app transition.  To do
8309a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // this, we have delayed a lot of operations like showing and
8310a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // hiding apps, moving apps in Z-order, etc.  The app token list
8311a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // reflects the correct Z-order, but the window list may now
8312a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // be out of sync with it.  So here we will just rebuild the
8313a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // entire app window list.  Fun!
8314a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            mAppTransitionRunning = false;
8315a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            needRelayout = true;
8316a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            rebuildAppWindowListLocked();
831716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn            assignLayersLocked();
8318a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // Clear information about apps that were moving.
8319a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            mToBottomApps.clear();
8320a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        }
8321ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
83229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (focusDisplayed) {
83239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendEmptyMessage(H.REPORT_LOSING_FOCUS);
83249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
83257341d7a104b47996445d069a695e155a07184606Dianne Hackborn        if (wallpaperDestroyed) {
83260586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn            needRelayout = adjustWallpaperWindowsLocked() != 0;
83277341d7a104b47996445d069a695e155a07184606Dianne Hackborn        }
8328a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        if (needRelayout) {
83297341d7a104b47996445d069a695e155a07184606Dianne Hackborn            requestAnimationLocked(0);
83307341d7a104b47996445d069a695e155a07184606Dianne Hackborn        } else if (animating) {
83319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            requestAnimationLocked(currentTime+(1000/60)-SystemClock.uptimeMillis());
83329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8333eb857f12d605659b385d168ef1ea7d4ba5193585Jeff Brown
83343a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        // Finally update all input windows now that the window changes have stabilized.
83352e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown        mInputMonitor.updateInputWindowsLw(true /*force*/);
8336eb857f12d605659b385d168ef1ea7d4ba5193585Jeff Brown
83378e03b7566c42621fda01186b66b019142eb84fbfJeff Brown        setHoldScreenLocked(holdScreen != null);
8338428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn        if (!mDisplayFrozen) {
8339428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            if (screenBrightness < 0 || screenBrightness > 1.0f) {
8340428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                mPowerManager.setScreenBrightnessOverride(-1);
8341428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            } else {
8342428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                mPowerManager.setScreenBrightnessOverride((int)
8343428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        (screenBrightness * Power.BRIGHTNESS_ON));
8344428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            }
8345428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            if (buttonBrightness < 0 || buttonBrightness > 1.0f) {
8346428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                mPowerManager.setButtonBrightnessOverride(-1);
8347428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            } else {
8348428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                mPowerManager.setButtonBrightnessOverride((int)
8349428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        (buttonBrightness * Power.BRIGHTNESS_ON));
8350428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            }
8351fb73f79340375013225618a5d87f46b958f698efMike Lockwood        }
83529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (holdScreen != mHoldingScreenOn) {
83539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHoldingScreenOn = holdScreen;
83549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Message m = mH.obtainMessage(H.HOLD_SCREEN_CHANGED, holdScreen);
83559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendMessage(m);
83569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8357ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
835893e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        if (mTurnOnScreen) {
8359b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn            if (DEBUG_VISIBILITY) Slog.v(TAG, "Turning screen on after layout!");
836093e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn            mPowerManager.userActivity(SystemClock.uptimeMillis(), false,
836193e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                    LocalPowerManager.BUTTON_EVENT, true);
836293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn            mTurnOnScreen = false;
836393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        }
8364f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn
836550660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn        if (screenRotationFinished && mScreenRotationAnimation != null) {
836650660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn            mScreenRotationAnimation.kill();
836750660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn            mScreenRotationAnimation = null;
836850660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn        }
836950660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn
837089ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        if (updateRotation) {
837189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation");
837289ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            boolean changed = setRotationUncheckedLocked(
837389ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                    WindowManagerPolicy.USE_LAST_ROTATION, 0, false);
837489ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            if (changed) {
83753e4f9d0452a2592338c15cf1b6d774761b929a28Dianne Hackborn                mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
837689ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            }
837789ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        }
837889ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn
8379f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn        // Check to see if we are now in a state where the screen should
8380f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn        // be enabled, because the window obscured flags have changed.
8381f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn        enableScreenIfNeededLocked();
83829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
838346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
838446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    /**
838546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     * Must be called with the main window manager lock held.
838646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     */
838746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    void setHoldScreenLocked(boolean holding) {
838846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        boolean state = mHoldingScreenWakeLock.isHeld();
838946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        if (holding != state) {
839046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            if (holding) {
839146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                mHoldingScreenWakeLock.acquire();
839246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            } else {
839346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                mPolicy.screenOnStoppedLw();
839446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                mHoldingScreenWakeLock.release();
839546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            }
839646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
839746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
83989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
83999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void requestAnimationLocked(long delay) {
84009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mAnimationPending) {
84019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAnimationPending = true;
84029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendMessageDelayed(mH.obtainMessage(H.ANIMATE), delay);
84039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
84049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
840506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
84069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
84079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Have the surface flinger show a surface, robustly dealing with
84089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * error conditions.  In particular, if there is not enough memory
84099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to show the surface, then we will try to get rid of other surfaces
84109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in order to succeed.
841106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     *
84129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the surface was successfully shown.
84139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
84149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean showSurfaceRobustlyLocked(WindowState win) {
84159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
84169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.mSurface != null) {
841716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                win.mSurfaceShown = true;
84189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mSurface.show();
841993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                if (win.mTurnOnScreen) {
8420b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                    if (DEBUG_VISIBILITY) Slog.v(TAG,
8421b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                            "Show surface turning screen on: " + win);
842293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                    win.mTurnOnScreen = false;
842393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                    mTurnOnScreen = true;
842493e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                }
84259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
84269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
84279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
842894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            Slog.w(TAG, "Failure showing surface " + win.mSurface + " in " + win, e);
84299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
843006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
8431648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        reclaimSomeSurfaceMemoryLocked(win, "show", true);
843206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
84339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
84349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
843506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
8436648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn    boolean reclaimSomeSurfaceMemoryLocked(WindowState win, String operation, boolean secure) {
84379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Surface surface = win.mSurface;
8438648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        boolean leakedSurface = false;
8439648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        boolean killedApps = false;
844006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
8441ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker        EventLog.writeEvent(EventLogTags.WM_NO_SURFACE_MEMORY, win.toString(),
84429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mSession.mPid, operation);
844306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
84449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mForceRemoves == null) {
84459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mForceRemoves = new ArrayList<WindowState>();
84469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
844706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
84489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long callingIdentity = Binder.clearCallingIdentity();
84499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
84509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // There was some problem...   first, do a sanity check of the
84519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // window list to make sure we haven't left any dangling surfaces
84529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // around.
84539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = mWindows.size();
84548a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.i(TAG, "Out of memory for surface!  Looking for leaks...");
84559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
8456e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState ws = mWindows.get(i);
84579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ws.mSurface != null) {
84589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mSessions.contains(ws.mSession)) {
84598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "LEAKED SURFACE (session doesn't exist): "
84609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ws + " surface=" + ws.mSurface
84619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " token=" + win.mToken
84629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " pid=" + ws.mSession.mPid
84639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " uid=" + ws.mSession.mUid);
846494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        if (SHOW_TRANSACTIONS) logSurface(ws, "LEAK DESTROY", null);
84650586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                        ws.mSurface.destroy();
846616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                        ws.mSurfaceShown = false;
84679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ws.mSurface = null;
84689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mForceRemoves.add(ws);
84699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        i--;
84709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        N--;
84719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        leakedSurface = true;
847294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    } else if (ws.mAppToken != null && ws.mAppToken.clientHidden) {
84738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "LEAKED SURFACE (app token hidden): "
84749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ws + " surface=" + ws.mSurface
84759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " token=" + win.mAppToken);
847694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        if (SHOW_TRANSACTIONS) logSurface(ws, "LEAK DESTROY", null);
84770586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                        ws.mSurface.destroy();
847816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                        ws.mSurfaceShown = false;
84799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ws.mSurface = null;
84809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        leakedSurface = true;
84819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
84829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
84839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
848406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
84859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!leakedSurface) {
84868a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "No leaked surfaces; killing applicatons!");
84879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SparseIntArray pidCandidates = new SparseIntArray();
84889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
8489e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    WindowState ws = mWindows.get(i);
84909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ws.mSurface != null) {
84919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pidCandidates.append(ws.mSession.mPid, ws.mSession.mPid);
84929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
84939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
84949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pidCandidates.size() > 0) {
84959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int[] pids = new int[pidCandidates.size()];
84969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i=0; i<pids.length; i++) {
84979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pids[i] = pidCandidates.keyAt(i);
84989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
84999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
8500648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        if (mActivityManager.killPids(pids, "Free memory", secure)) {
85019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            killedApps = true;
85029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
85039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (RemoteException e) {
85049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
85059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
85069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
850706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
85089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (leakedSurface || killedApps) {
85099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We managed to reclaim some memory, so get rid of the trouble
85109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // surface and ask the app to request another one.
85118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Looks like we have reclaimed some memory, clearing surface for retry.");
85129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (surface != null) {
85135fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                    if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) logSurface(win,
85145fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                            "RECOVER DESTROY", null);
85150586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                    surface.destroy();
851616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                    win.mSurfaceShown = false;
85179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mSurface = null;
85189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
851906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
85209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
85219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mClient.dispatchGetNewSurface();
85229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
85239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
85249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
85259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
85269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(callingIdentity);
85279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8528648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn
8529648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn        return leakedSurface || killedApps;
85309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
853106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
85323a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown    private boolean updateFocusedWindowLocked(int mode, boolean updateInputWindows) {
85339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState newFocus = computeFocusedWindowLocked();
85349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mCurrentFocus != newFocus) {
85359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // This check makes sure that we don't already have the focus
85369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // change message pending.
85379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.removeMessages(H.REPORT_FOCUS_CHANGE);
85389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendEmptyMessage(H.REPORT_FOCUS_CHANGE);
85398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (localLOGV) Slog.v(
85409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Changing focus from " + mCurrentFocus + " to " + newFocus);
85419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final WindowState oldFocus = mCurrentFocus;
85429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentFocus = newFocus;
85439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLosingFocus.remove(newFocus);
854406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
85459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final WindowState imWindow = mInputMethodWindow;
85469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (newFocus != imWindow && oldFocus != imWindow) {
8547c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                if (moveInputMethodWindowsIfNeededLocked(
85489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mode != UPDATE_FOCUS_WILL_ASSIGN_LAYERS &&
8549c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                        mode != UPDATE_FOCUS_WILL_PLACE_SURFACES)) {
8550c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                    mLayoutNeeded = true;
8551c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                }
85529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mode == UPDATE_FOCUS_PLACING_SURFACES) {
85533a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    performLayoutLockedInner(true /*initial*/, updateInputWindows);
8554c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                } else if (mode == UPDATE_FOCUS_WILL_PLACE_SURFACES) {
8555c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                    // Client will do the layout, but we need to assign layers
8556c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                    // for handleNewWindowLocked() below.
8557c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                    assignLayersLocked();
85589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
85599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8560349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
8561349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown            if (mode != UPDATE_FOCUS_WILL_ASSIGN_LAYERS) {
8562349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown                // If we defer assigning layers, then the caller is responsible for
8563349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown                // doing this part.
85643a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                finishUpdateFocusedWindowAfterAssignLayersLocked(updateInputWindows);
8565c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            }
85669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
85679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
85689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
85699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8570349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
85713a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown    private void finishUpdateFocusedWindowAfterAssignLayersLocked(boolean updateInputWindows) {
85723a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        mInputMonitor.setInputFocusLw(mCurrentFocus, updateInputWindows);
8573349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    }
85749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
85759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowState computeFocusedWindowLocked() {
85769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState result = null;
85779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState win;
85789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
85799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i = mWindows.size() - 1;
85809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int nextAppIndex = mAppTokens.size()-1;
85819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowToken nextApp = nextAppIndex >= 0
85829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ? mAppTokens.get(nextAppIndex) : null;
85839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
85849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (i >= 0) {
8585e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            win = mWindows.get(i);
85869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
85878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (localLOGV || DEBUG_FOCUS) Slog.v(
85889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Looking for focus: " + i
85899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " = " + win
85909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", flags=" + win.mAttrs.flags
85919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", canReceive=" + win.canReceiveKeys());
85929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
85939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken thisApp = win.mAppToken;
859406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
85959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If this window's application has been removed, just skip it.
85969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (thisApp != null && thisApp.removed) {
85979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
85989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
85999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
860006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
86019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If there is a focused app, don't allow focus to go to any
86029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // windows below it.  If this is an application window, step
86039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // through the app tokens until we find its app.
86049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (thisApp != null && nextApp != null && thisApp != nextApp
86059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && win.mAttrs.type != TYPE_APPLICATION_STARTING) {
86069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int origAppIndex = nextAppIndex;
86079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (nextAppIndex > 0) {
86089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (nextApp == mFocusedApp) {
86099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Whoops, we are below the focused app...  no focus
86109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // for you!
86118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (localLOGV || DEBUG_FOCUS) Slog.v(
86129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            TAG, "Reached focused app: " + mFocusedApp);
86139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return null;
86149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
86159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    nextAppIndex--;
86169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    nextApp = mAppTokens.get(nextAppIndex);
86179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (nextApp == thisApp) {
86189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
86199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
86209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
86219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (thisApp != nextApp) {
86229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Uh oh, the app token doesn't exist!  This shouldn't
86239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // happen, but if it does we can get totally hosed...
86249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // so restart at the original app.
86259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    nextAppIndex = origAppIndex;
86269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    nextApp = mAppTokens.get(nextAppIndex);
86279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
86289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
86299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
86309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Dispatch to this window if it is wants key events.
86319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.canReceiveKeys()) {
86328a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_FOCUS) Slog.v(
86339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        TAG, "Found focus @ " + i + " = " + win);
86349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = win;
86359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
86369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
86379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
86389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            i--;
86399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
86409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
86419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
86429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
86439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
864494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn    private void startFreezingDisplayLocked(boolean inTransaction) {
86459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDisplayFrozen) {
86469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
86479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
864806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
86499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenFrozenLock.acquire();
865006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
86519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long now = SystemClock.uptimeMillis();
86528a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //Slog.i(TAG, "Freezing, gc pending: " + mFreezeGcPending + ", now " + now);
86539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFreezeGcPending != 0) {
86549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (now > (mFreezeGcPending+1000)) {
86558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                //Slog.i(TAG, "Gc!  " + now + " > " + (mFreezeGcPending+1000));
86569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mH.removeMessages(H.FORCE_GC);
86579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Runtime.getRuntime().gc();
86589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFreezeGcPending = now;
86599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
86609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
86619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFreezeGcPending = now;
86629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
866306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
86649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDisplayFrozen = true;
8665349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
866600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        mInputMonitor.freezeInputDispatchingLw();
8667349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
8668bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn        if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
8669bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn            mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET;
86703b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            mNextAppTransitionPackage = null;
86719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAppTransitionReady = true;
86729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
867306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
86749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (PROFILE_ORIENTATION) {
86759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            File file = new File("/data/system/frozen");
86769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Debug.startMethodTracing(file.toString(), 8 * 1024 * 1024);
86779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8678a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn
8679a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn        if (CUSTOM_SCREEN_ROTATION) {
8680f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn            if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) {
8681f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                mScreenRotationAnimation.kill();
8682f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                mScreenRotationAnimation = null;
8683f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn            }
8684a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn            if (mScreenRotationAnimation == null) {
8685f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                mScreenRotationAnimation = new ScreenRotationAnimation(mContext,
868694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        mDisplay, mFxSession, inTransaction);
8687a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn            }
8688de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            if (!mScreenRotationAnimation.hasScreenshot()) {
8689de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                Surface.freezeDisplay(0);
8690de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            }
8691a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn        } else {
8692a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn            Surface.freezeDisplay(0);
8693a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn        }
86949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
869506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
86969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void stopFreezingDisplayLocked() {
86979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mDisplayFrozen) {
86989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
86999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
870006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
8701e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        if (mWaitingForConfig || mAppsFreezingScreen > 0 || mWindowsFreezingScreen) {
8702e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            return;
8703e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        }
8704e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
87059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDisplayFrozen = false;
87069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.removeMessages(H.APP_FREEZE_TIMEOUT);
87079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (PROFILE_ORIENTATION) {
87089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Debug.stopMethodTracing();
87099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8710a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn
871189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        boolean updateRotation = false;
871289ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn
8713de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn        if (CUSTOM_SCREEN_ROTATION && mScreenRotationAnimation != null
8714de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                && mScreenRotationAnimation.hasScreenshot()) {
8715de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            if (mScreenRotationAnimation.dismiss(mFxSession, MAX_ANIMATION_DURATION,
8716de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                    mTransitionAnimationScale)) {
8717de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                requestAnimationLocked(0);
8718de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            } else {
8719de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                mScreenRotationAnimation = null;
8720de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                updateRotation = true;
8721a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn            }
8722a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn        } else {
8723de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            if (mScreenRotationAnimation != null) {
8724de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                mScreenRotationAnimation.kill();
8725de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                mScreenRotationAnimation = null;
8726de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            }
8727de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            updateRotation = true;
8728a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn            Surface.unfreezeDisplay(0);
8729a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn        }
873006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
873100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        mInputMonitor.thawInputDispatchingLw();
87329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8733420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn        boolean configChanged;
8734420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn
8735b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        // While the display is frozen we don't re-compute the orientation
8736b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        // to avoid inconsistent states.  However, something interesting
8737b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        // could have actually changed during that time so re-evaluate it
8738b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        // now to catch that.
8739420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn        configChanged = updateOrientationFromAppTokensLocked(false);
8740b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate
87419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // A little kludge: a lot could have happened while the
87429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // display was frozen, so now that we are coming back we
87439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // do a gc so that any remote references the system
87449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // processes holds on others can be released if they are
87459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // no longer needed.
87469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.removeMessages(H.FORCE_GC);
87479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.sendMessageDelayed(mH.obtainMessage(H.FORCE_GC),
87489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                2000);
874906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
87509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenFrozenLock.release();
875189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn
875289ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        if (updateRotation) {
875389ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation");
8754420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn            configChanged |= setRotationUncheckedLocked(
875589ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                    WindowManagerPolicy.USE_LAST_ROTATION, 0, false);
8756420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn        }
8757420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn
8758420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn        if (configChanged) {
8759420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn            mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
876089ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        }
87619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
876206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
8763b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn    static int getPropertyInt(String[] tokens, int index, int defUnits, int defDps,
8764b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            DisplayMetrics dm) {
8765b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        if (index < tokens.length) {
8766b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            String str = tokens[index];
8767b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            if (str != null && str.length() > 0) {
8768b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                try {
8769b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                    int val = Integer.parseInt(str);
8770b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                    return val;
8771b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                } catch (Exception e) {
8772b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                }
8773b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            }
8774fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
8775fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        if (defUnits == TypedValue.COMPLEX_UNIT_PX) {
8776fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn            return defDps;
8777fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
8778fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        int val = (int)TypedValue.applyDimension(defUnits, defDps, dm);
8779fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        return val;
8780fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn    }
8781fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
8782fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn    void createWatermark() {
8783fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        if (mWatermark != null) {
8784fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn            return;
8785fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
8786fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
8787b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        File file = new File("/system/etc/setup.conf");
8788b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        FileInputStream in = null;
8789b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        try {
8790b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            in = new FileInputStream(file);
8791b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            DataInputStream ind = new DataInputStream(in);
8792b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            String line = ind.readLine();
8793b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            if (line != null) {
8794b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                String[] toks = line.split("%");
8795b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                if (toks != null && toks.length > 0) {
8796ed7bfbf6c87153c3f2f23d6856db4180d4bac429Dianne Hackborn                    mWatermark = new Watermark(mDisplay, mFxSession, toks);
8797b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                }
8798b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            }
8799b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        } catch (FileNotFoundException e) {
8800b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        } catch (IOException e) {
8801b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        } finally {
8802b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            if (in != null) {
8803b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                try {
8804b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                    in.close();
8805b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                } catch (IOException e) {
8806b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                }
8807b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            }
8808fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
8809fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn    }
8810fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
88119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8812664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    public void statusBarVisibilityChanged(int visibility) {
881305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown        mInputManager.setSystemUiVisibility(visibility);
8814664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        synchronized (mWindowMap) {
8815664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            final int N = mWindows.size();
8816664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            for (int i = 0; i < N; i++) {
8817664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                WindowState ws = mWindows.get(i);
8818664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                try {
8819664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                    if (ws.getAttrs().hasSystemUiListeners) {
8820664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                        ws.mClient.dispatchSystemUiVisibilityChanged(visibility);
8821664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                    }
8822664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                } catch (RemoteException e) {
8823664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                    // so sorry
8824664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                }
8825664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            }
8826664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        }
8827664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    }
8828664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato
8829664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    @Override
88309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
88319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mContext.checkCallingOrSelfPermission("android.permission.DUMP")
88329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                != PackageManager.PERMISSION_GRANTED) {
88339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println("Permission Denial: can't dump WindowManager from from pid="
88349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + Binder.getCallingPid()
88359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ", uid=" + Binder.getCallingUid());
88369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
88379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
883806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
883900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        mInputManager.dump(pw);
8840a2e92266b3f768f74ab7fcb42972a22d6c739b39Dianne Hackborn        pw.println(" ");
8841a2e92266b3f768f74ab7fcb42972a22d6c739b39Dianne Hackborn
88429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
88439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println("Current Window Manager state:");
88449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=mWindows.size()-1; i>=0; i--) {
8845e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState w = mWindows.get(i);
88461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print("  Window #"); pw.print(i); pw.print(' ');
88471d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.print(w); pw.println(":");
88489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.dump(pw, "    ");
88499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
88509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mInputMethodDialogs.size() > 0) {
88519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(" ");
88529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println("  Input method dialogs:");
88539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=mInputMethodDialogs.size()-1; i>=0; i--) {
88549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowState w = mInputMethodDialogs.get(i);
88551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print("  IM Dialog #"); pw.print(i); pw.print(": "); pw.println(w);
88569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
88579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
88589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPendingRemove.size() > 0) {
88599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(" ");
88609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println("  Remove pending for:");
88619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=mPendingRemove.size()-1; i>=0; i--) {
88629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowState w = mPendingRemove.get(i);
88631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print("  Remove #"); pw.print(i); pw.print(' ');
88641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                            pw.print(w); pw.println(":");
88659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.dump(pw, "    ");
88669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
88679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
88689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mForceRemoves != null && mForceRemoves.size() > 0) {
88699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(" ");
88709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println("  Windows force removing:");
88719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=mForceRemoves.size()-1; i>=0; i--) {
88729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowState w = mForceRemoves.get(i);
88731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print("  Removing #"); pw.print(i); pw.print(' ');
88741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                            pw.print(w); pw.println(":");
88759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.dump(pw, "    ");
88769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
88779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
88789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDestroySurface.size() > 0) {
88799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(" ");
88809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println("  Windows waiting to destroy their surface:");
88819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=mDestroySurface.size()-1; i>=0; i--) {
88829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowState w = mDestroySurface.get(i);
88831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print("  Destroy #"); pw.print(i); pw.print(' ');
88841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                            pw.print(w); pw.println(":");
88859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.dump(pw, "    ");
88869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
88879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
88889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mLosingFocus.size() > 0) {
88899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(" ");
88909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println("  Windows losing focus:");
88919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=mLosingFocus.size()-1; i>=0; i--) {
88929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowState w = mLosingFocus.get(i);
88931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print("  Losing #"); pw.print(i); pw.print(' ');
88941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                            pw.print(w); pw.println(":");
88959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.dump(pw, "    ");
88969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
88979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
88980586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn            if (mResizingWindows.size() > 0) {
88990586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                pw.println(" ");
89000586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                pw.println("  Windows waiting to resize:");
89010586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                for (int i=mResizingWindows.size()-1; i>=0; i--) {
89020586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                    WindowState w = mResizingWindows.get(i);
89030586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                    pw.print("  Resizing #"); pw.print(i); pw.print(' ');
89040586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                            pw.print(w); pw.println(":");
89050586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                    w.dump(pw, "    ");
89060586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                }
89070586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn            }
89089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mSessions.size() > 0) {
89099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(" ");
89109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println("  All active sessions:");
89119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Iterator<Session> it = mSessions.iterator();
89129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (it.hasNext()) {
89139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Session s = it.next();
89141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print("  Session "); pw.print(s); pw.println(':');
89159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.dump(pw, "    ");
89169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
89179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
89189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mTokenMap.size() > 0) {
89199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(" ");
89209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println("  All tokens:");
89219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Iterator<WindowToken> it = mTokenMap.values().iterator();
89229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (it.hasNext()) {
89239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowToken token = it.next();
89241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print("  Token "); pw.print(token.token); pw.println(':');
89259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    token.dump(pw, "    ");
89269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
89279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
89284c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            if (mWallpaperTokens.size() > 0) {
89294c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                pw.println(" ");
89304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                pw.println("  Wallpaper tokens:");
89314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                for (int i=mWallpaperTokens.size()-1; i>=0; i--) {
89324c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    WindowToken token = mWallpaperTokens.get(i);
89334c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    pw.print("  Wallpaper #"); pw.print(i);
89344c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                            pw.print(' '); pw.print(token); pw.println(':');
89354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    token.dump(pw, "    ");
89364c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
89374c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
89389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mAppTokens.size() > 0) {
89399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(" ");
89409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println("  Application tokens in Z order:");
89419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=mAppTokens.size()-1; i>=0; i--) {
89421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print("  App #"); pw.print(i); pw.print(": ");
89431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                            pw.println(mAppTokens.get(i));
89449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
89459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
89469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mFinishedStarting.size() > 0) {
89479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(" ");
89489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println("  Finishing start of application tokens:");
89499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=mFinishedStarting.size()-1; i>=0; i--) {
89509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowToken token = mFinishedStarting.get(i);
89511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print("  Finished Starting #"); pw.print(i);
89521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                            pw.print(' '); pw.print(token); pw.println(':');
89539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    token.dump(pw, "    ");
89549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
89559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
89569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mExitingTokens.size() > 0) {
89579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(" ");
89589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println("  Exiting tokens:");
89599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=mExitingTokens.size()-1; i>=0; i--) {
89609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowToken token = mExitingTokens.get(i);
89611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print("  Exiting #"); pw.print(i);
89621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                            pw.print(' '); pw.print(token); pw.println(':');
89639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    token.dump(pw, "    ");
89649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
89659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
89669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mExitingAppTokens.size() > 0) {
89679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(" ");
89689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println("  Exiting application tokens:");
89699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=mExitingAppTokens.size()-1; i>=0; i--) {
89709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowToken token = mExitingAppTokens.get(i);
89711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print("  Exiting App #"); pw.print(i);
89721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                            pw.print(' '); pw.print(token); pw.println(':');
89739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    token.dump(pw, "    ");
89749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
89759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
89769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println(" ");
89771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mCurrentFocus="); pw.println(mCurrentFocus);
89781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mLastFocus="); pw.println(mLastFocus);
89791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mFocusedApp="); pw.println(mFocusedApp);
89801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mInputMethodTarget="); pw.println(mInputMethodTarget);
89811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mInputMethodWindow="); pw.println(mInputMethodWindow);
8982f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            pw.print("  mWallpaperTarget="); pw.println(mWallpaperTarget);
8983284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            if (mLowerWallpaperTarget != null && mUpperWallpaperTarget != null) {
8984284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                pw.print("  mLowerWallpaperTarget="); pw.println(mLowerWallpaperTarget);
8985284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                pw.print("  mUpperWallpaperTarget="); pw.println(mUpperWallpaperTarget);
8986284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            }
89876c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            if (mWindowDetachedWallpaper != null) {
89886c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                pw.print("  mWindowDetachedWallpaper="); pw.println(mWindowDetachedWallpaper);
89896c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            }
8990de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            if (mWindowAnimationBackgroundSurface != null) {
8991de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                pw.println("  mWindowAnimationBackgroundSurface:");
8992de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                mWindowAnimationBackgroundSurface.printTo("    ", pw);
8993de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn            }
8994e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            pw.print("  mCurConfiguration="); pw.println(this.mCurConfiguration);
8995e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            pw.print("  mInTouchMode="); pw.print(mInTouchMode);
8996e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    pw.print(" mLayoutSeq="); pw.println(mLayoutSeq);
89971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mSystemBooted="); pw.print(mSystemBooted);
89981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(" mDisplayEnabled="); pw.println(mDisplayEnabled);
89991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mLayoutNeeded="); pw.print(mLayoutNeeded);
90001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(" mBlurShown="); pw.println(mBlurShown);
90010a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima            if (mDimAnimator != null) {
9002de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                pw.println("  mDimAnimator:");
9003de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn                mDimAnimator.printTo("    ", pw);
90040a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima            } else {
9005a2e92266b3f768f74ab7fcb42972a22d6c739b39Dianne Hackborn                pw.println( "  no DimAnimator ");
90060a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima            }
90071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mInputMethodAnimLayerAdjustment=");
9008759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    pw.print(mInputMethodAnimLayerAdjustment);
9009759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    pw.print("  mWallpaperAnimLayerAdjustment=");
9010759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    pw.println(mWallpaperAnimLayerAdjustment);
9011284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            pw.print("  mLastWallpaperX="); pw.print(mLastWallpaperX);
9012284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    pw.print(" mLastWallpaperY="); pw.println(mLastWallpaperY);
90131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mDisplayFrozen="); pw.print(mDisplayFrozen);
90141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(" mWindowsFreezingScreen="); pw.print(mWindowsFreezingScreen);
9015e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    pw.print(" mAppsFreezingScreen="); pw.print(mAppsFreezingScreen);
9016e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    pw.print(" mWaitingForConfig="); pw.println(mWaitingForConfig);
90171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mRotation="); pw.print(mRotation);
901868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                    pw.print(" mRequestedRotation="); pw.print(mRequestedRotation);
901968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn                    pw.print(" mAltOrientation="); pw.println(mAltOrientation);
9020bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn            pw.print("  mLastWindowForcedOrientation"); pw.print(mLastWindowForcedOrientation);
9021bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn                    pw.print(" mForcedAppOrientation="); pw.println(mForcedAppOrientation);
902289ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            pw.print("  mDeferredRotation="); pw.print(mDeferredRotation);
902329735689cea7bf52998c1911542dcfdd1c1d9628Dianne Hackborn                    pw.print(", mDeferredRotationAnimFlags="); pw.println(mDeferredRotationAnimFlags);
90241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mAnimationPending="); pw.print(mAnimationPending);
90251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(" mWindowAnimationScale="); pw.print(mWindowAnimationScale);
90261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(" mTransitionWindowAnimationScale="); pw.println(mTransitionAnimationScale);
90271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mNextAppTransition=0x");
90281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(Integer.toHexString(mNextAppTransition));
902929735689cea7bf52998c1911542dcfdd1c1d9628Dianne Hackborn                    pw.print(" mAppTransitionReady="); pw.println(mAppTransitionReady);
903029735689cea7bf52998c1911542dcfdd1c1d9628Dianne Hackborn            pw.print("  mAppTransitionRunning="); pw.print(mAppTransitionRunning);
903129735689cea7bf52998c1911542dcfdd1c1d9628Dianne Hackborn                    pw.print(" mAppTransitionTimeout="); pw.println( mAppTransitionTimeout);
90323b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if (mNextAppTransitionPackage != null) {
90333b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                pw.print("  mNextAppTransitionPackage=");
90343b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    pw.print(mNextAppTransitionPackage);
903529735689cea7bf52998c1911542dcfdd1c1d9628Dianne Hackborn                    pw.print(" mNextAppTransitionEnter=0x");
90363b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    pw.print(Integer.toHexString(mNextAppTransitionEnter));
903729735689cea7bf52998c1911542dcfdd1c1d9628Dianne Hackborn                    pw.print(" mNextAppTransitionExit=0x");
90383b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    pw.print(Integer.toHexString(mNextAppTransitionExit));
90393b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            }
90401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mStartingIconInTransition="); pw.print(mStartingIconInTransition);
90411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(", mSkipAppTransitionAnimation="); pw.println(mSkipAppTransitionAnimation);
90421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (mOpeningApps.size() > 0) {
90431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print("  mOpeningApps="); pw.println(mOpeningApps);
90441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
90451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (mClosingApps.size() > 0) {
90461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print("  mClosingApps="); pw.println(mClosingApps);
90471d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
9048a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            if (mToTopApps.size() > 0) {
9049a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                pw.print("  mToTopApps="); pw.println(mToTopApps);
9050a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
9051a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            if (mToBottomApps.size() > 0) {
9052a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                pw.print("  mToBottomApps="); pw.println(mToBottomApps);
9053a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
905487fc30828209afa25be69ac7053241f4eaeb3378Dianne Hackborn            if (mDisplay != null) {
9055ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                pw.print("  Display: init="); pw.print(mInitialDisplayWidth); pw.print("x");
90567916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        pw.print(mInitialDisplayHeight); pw.print(" base=");
90577916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        pw.print(mBaseDisplayWidth); pw.print("x"); pw.print(mBaseDisplayHeight);
90587916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        pw.print(" cur=");
9059ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                        pw.print(mCurDisplayWidth); pw.print("x"); pw.print(mCurDisplayHeight);
906081e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn                        pw.print(" app=");
906181e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn                        pw.print(mAppDisplayWidth); pw.print("x"); pw.print(mAppDisplayHeight);
9062ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                        pw.print(" real="); pw.print(mDisplay.getRealWidth());
9063ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                        pw.print("x"); pw.print(mDisplay.getRealHeight());
9064ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                        pw.print(" raw="); pw.print(mDisplay.getRawWidth());
9065ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn                        pw.print("x"); pw.println(mDisplay.getRawHeight());
906687fc30828209afa25be69ac7053241f4eaeb3378Dianne Hackborn            } else {
906787fc30828209afa25be69ac7053241f4eaeb3378Dianne Hackborn                pw.println("  NO DISPLAY");
906887fc30828209afa25be69ac7053241f4eaeb3378Dianne Hackborn            }
9069f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            pw.println("  Policy:");
9070f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            mPolicy.dump("    ", fd, pw, args);
90719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
90729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
90739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9074349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    // Called by the heartbeat to ensure locks are not held indefnitely (for deadlock detection).
90759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void monitor() {
90769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) { }
9077983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood        synchronized (mKeyguardTokenWatcher) { }
9078ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    }
9079ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
90802992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    public interface OnHardKeyboardStatusChangeListener {
90812992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        public void onHardKeyboardStatusChange(boolean available, boolean enabled);
90822992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
90839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
9084