WindowManagerService.java revision 05dc66ada6b61a6bdf806ffaa62617ac5394695d
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;
220a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshimaimport 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;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Region;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.BatteryStats;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
717580493b014a2c7ea883cd291255798dc72ebbffDianne Hackbornimport android.os.Bundle;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Debug;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.LocalPowerManager;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Looper;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFileDescriptor;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Power;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PowerManager;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
85ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrickimport android.os.StrictMode;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemProperties;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.TokenWatcher;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Settings;
90723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackbornimport android.util.DisplayMetrics;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.EventLog;
92d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Millerimport android.util.Log;
938a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseIntArray;
95fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackbornimport android.util.TypedValue;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Display;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IApplicationToken;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IOnKeyguardExitResult;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IRotationWatcher;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindow;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindowManager;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindowSession;
10346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport android.view.InputChannel;
104c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brownimport android.view.InputDevice;
105bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brownimport android.view.InputEvent;
106a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tateimport android.view.InputHandler;
107a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tateimport android.view.InputQueue;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Surface;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SurfaceSession;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerImpl;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerPolicy;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager.LayoutParams;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Animation;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.AnimationUtils;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Transformation;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.BufferedWriter;
122b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackbornimport java.io.DataInputStream;
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
125b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackbornimport java.io.FileInputStream;
126b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackbornimport java.io.FileNotFoundException;
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStream;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStreamWriter;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.StringWriter;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.Socket;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashSet;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator;
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List;
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** {@hide} */
140ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackbornpublic class WindowManagerService extends IWindowManager.Stub
14100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        implements Watchdog.Monitor {
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final String TAG = "WindowManager";
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG = false;
144f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn    static final boolean DEBUG_ADD_REMOVE = false;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_FOCUS = false;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_ANIM = false;
1479b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn    static final boolean DEBUG_LAYOUT = false;
148ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn    static final boolean DEBUG_RESIZE = false;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_LAYERS = false;
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_INPUT = false;
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_INPUT_METHOD = false;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_VISIBILITY = false;
153bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn    static final boolean DEBUG_WINDOW_MOVEMENT = false;
154f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn    static final boolean DEBUG_TOKEN_MOVEMENT = false;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_ORIENTATION = false;
156694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn    static final boolean DEBUG_CONFIGURATION = false;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_APP_TRANSITIONS = false;
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_STARTING_WINDOW = false;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean DEBUG_REORDER = false;
1607341d7a104b47996445d069a695e155a07184606Dianne Hackborn    static final boolean DEBUG_WALLPAPER = false;
161994ef9296a00523de1df424b4b760b4416ead58bChristopher Tate    static final boolean DEBUG_DRAG = false;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean SHOW_TRANSACTIONS = false;
1639bfb707597898f54722460b48588007b682f3e2aDianne Hackborn    static final boolean HIDE_STACK_CRAWLS = true;
16453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean PROFILE_ORIENTATION = false;
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean BLUR = true;
167cfe6524071624b6679e5fa4db847328e8d0317c8Dave Bort    static final boolean localLOGV = DEBUG;
16806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** How much to multiply the policy's type layer, to reserve room
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for multiple windows of the same type and Z-ordering adjustment
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with TYPE_LAYER_OFFSET. */
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int TYPE_LAYER_MULTIPLIER = 10000;
17306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Offset from TYPE_LAYER_MULTIPLIER for moving a group of windows above
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or below others in the same layer. */
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int TYPE_LAYER_OFFSET = 1000;
17706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** How much to increment the layer for each window, to reserve room
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for effect surfaces between them.
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int WINDOW_LAYER_MULTIPLIER = 5;
18206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** The maximum length we will accept for a loaded animation duration:
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this is 10 seconds.
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int MAX_ANIMATION_DURATION = 10*1000;
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Amount of time (in milliseconds) to animate the dim surface from one
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value to another, when no window animation is driving it.
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int DEFAULT_DIM_DURATION = 200;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1930a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima    /** Amount of time (in milliseconds) to animate the fade-in-out transition for
1940a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima     * compatible windows.
1950a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima     */
1960a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima    static final int DEFAULT_FADE_IN_OUT_DURATION = 400;
1970a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima
198a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn    /**
199a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * If true, the window manager will do its own custom freezing and general
200a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     * management of the screen during rotation.
201a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn     */
202a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn    static final boolean CUSTOM_SCREEN_ROTATION = true;
203a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn
2047fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    // Maximum number of milliseconds to wait for input event injection.
2057fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    // FIXME is this value reasonable?
2067fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    private static final int INJECTION_TIMEOUT_MILLIS = 30 * 1000;
207b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown
208b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown    // Maximum number of milliseconds to wait for input devices to be enumerated before
209b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown    // proceding with safe mode detection.
210b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown    private static final int INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS = 1000;
211349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
212349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    // Default input dispatching timeout in nanoseconds.
2136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    static final long DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS = 5000 * 1000000L;
21406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int UPDATE_FOCUS_NORMAL = 0;
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int UPDATE_FOCUS_WILL_ASSIGN_LAYERS = 1;
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int UPDATE_FOCUS_PLACING_SURFACES = 2;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int UPDATE_FOCUS_WILL_PLACE_SURFACES = 3;
21906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String SYSTEM_SECURE = "ro.secure";
22106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy    private static final String SYSTEM_DEBUGGABLE = "ro.debuggable";
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Condition waited on by {@link #reenableKeyguard} to know the call to
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the window policy has finished.
226983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood     * This is set to true only if mKeyguardTokenWatcher.acquired() has
227983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood     * actually disabled the keyguard.
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
229983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood    private boolean mKeyguardDisabled = false;
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
231284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    private static final int ALLOW_DISABLE_YES = 1;
232284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    private static final int ALLOW_DISABLE_NO = 0;
233284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    private static final int ALLOW_DISABLE_UNKNOWN = -1; // check with DevicePolicyManager
234284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    private int mAllowDisableKeyguard = ALLOW_DISABLE_UNKNOWN; // sync'd by mKeyguardTokenWatcher
235284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller
236983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood    final TokenWatcher mKeyguardTokenWatcher = new TokenWatcher(
237983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood            new Handler(), "WindowManagerService.mKeyguardTokenWatcher") {
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void acquired() {
239284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            if (shouldAllowDisableKeyguard()) {
240284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                mPolicy.enableKeyguard(false);
241284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                mKeyguardDisabled = true;
242284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            } else {
243284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                Log.v(TAG, "Not disabling keyguard since device policy is enforced");
244284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            }
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void released() {
247a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn            mPolicy.enableKeyguard(true);
248983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood            synchronized (mKeyguardTokenWatcher) {
249983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood                mKeyguardDisabled = false;
250983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood                mKeyguardTokenWatcher.notifyAll();
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
255284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
256284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        @Override
257284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        public void onReceive(Context context, Intent intent) {
258284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            mPolicy.enableKeyguard(true);
259284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            synchronized(mKeyguardTokenWatcher) {
260284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // lazily evaluate this next time we're asked to disable keyguard
261284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                mAllowDisableKeyguard = ALLOW_DISABLE_UNKNOWN;
262284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                mKeyguardDisabled = false;
263284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            }
264284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        }
265284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    };
266284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Context mContext;
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final boolean mHaveInputMethods;
27006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final boolean mLimitedAlphaCompositing;
27206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final WindowManagerPolicy mPolicy = PolicyManager.makeNewWindowManager();
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final IActivityManager mActivityManager;
27606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final IBatteryStats mBatteryStats;
27806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
279910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner    private static final boolean mInEmulator = SystemProperties.get("ro.kernel.qemu").equals("1");
280910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * All currently active sessions with clients.
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final HashSet<Session> mSessions = new HashSet<Session>();
28506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Mapping from an IWindow IBinder to the server's Window object.
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is also used as the lock for all of our state.
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final HashMap<IBinder, WindowState> mWindowMap = new HashMap<IBinder, WindowState>();
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Mapping from a token IBinder to a WindowToken object.
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final HashMap<IBinder, WindowToken> mTokenMap =
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            new HashMap<IBinder, WindowToken>();
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Window tokens that are in the process of exiting, but still
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on screen for animations.
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<WindowToken> mExitingTokens = new ArrayList<WindowToken>();
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Z-ordered (bottom-most first) list of all application tokens, for
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * controlling the ordering of windows in different applications.  This
307f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn     * contains AppWindowToken objects.
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<AppWindowToken> mAppTokens = new ArrayList<AppWindowToken>();
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Application tokens that are in the process of exiting, but still
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on screen for animations.
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<AppWindowToken> mExitingAppTokens = new ArrayList<AppWindowToken>();
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * List of window tokens that have finished starting their application,
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and now need to have the policy remove their windows.
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<AppWindowToken> mFinishedStarting = new ArrayList<AppWindowToken>();
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Z-ordered (bottom-most first) list of all Window objects.
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
326e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    final ArrayList<WindowState> mWindows = new ArrayList<WindowState>();
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Windows that are being resized.  Used so we can tell the client about
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the resize after closing the transaction in which we resized the
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * underlying surface.
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<WindowState> mResizingWindows = new ArrayList<WindowState>();
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Windows whose animations have ended and now must be removed.
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<WindowState> mPendingRemove = new ArrayList<WindowState>();
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
341f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn     * Used when processing mPendingRemove to avoid working on the original array.
342f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn     */
343f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn    WindowState[] mPendingRemoveTmp = new WindowState[20];
344f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn
345f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn    /**
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Windows whose surface should be destroyed.
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<WindowState> mDestroySurface = new ArrayList<WindowState>();
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Windows that have lost input focus and are waiting for the new
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focus window to be displayed before they are told about this.
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ArrayList<WindowState> mLosingFocus = new ArrayList<WindowState>();
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is set when we have run out of memory, and will either be an empty
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * list or contain windows that need to be force removed.
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ArrayList<WindowState> mForceRemoves;
36106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
362f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn    /**
363f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn     * Used when rebuilding window list to keep track of windows that have
364f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn     * been removed.
365f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn     */
366f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn    WindowState[] mRebuildTmp = new WindowState[20];
367f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    IInputMethodManager mInputMethodManager;
36906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SurfaceSession mFxSession;
3710a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima    private DimAnimator mDimAnimator = null;
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Surface mBlurSurface;
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mBlurShown;
374fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn    Watermark mWatermark;
3756804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    StrictModeFlash mStrictModeFlash;
376a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn    ScreenRotationAnimation mScreenRotationAnimation;
37706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mTransactionSequence = 0;
37906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final float[] mTmpFloats = new float[9];
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mSafeMode;
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mDisplayEnabled = false;
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mSystemBooted = false;
385b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate    int mInitialDisplayWidth = 0;
386b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate    int mInitialDisplayHeight = 0;
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mRotation = 0;
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mRequestedRotation = 0;
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mForcedAppOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
390321ae681cad03d00ad1efc6f06f74268e00172a9Dianne Hackborn    int mLastRotationFlags;
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ArrayList<IRotationWatcher> mRotationWatchers
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new ArrayList<IRotationWatcher>();
39389ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn    int mDeferredRotation;
39489ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn    int mDeferredRotationAnimFlags;
39506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mLayoutNeeded = true;
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAnimationPending = false;
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mDisplayFrozen = false;
399e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    boolean mWaitingForConfig = false;
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mWindowsFreezingScreen = false;
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mFreezeGcPending = 0;
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mAppsFreezingScreen = 0;
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
404e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    int mLayoutSeq = 0;
405e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
406b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn    // State while inside of layoutAndPlaceSurfacesLocked().
407b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn    boolean mFocusMayChange;
408b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn
409e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    Configuration mCurConfiguration = new Configuration();
410e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // This is held as long as we have the screen frozen, to give us time to
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // perform a rotation animation when turning off shows the lock screen which
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // changes the orientation.
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PowerManager.WakeLock mScreenFrozenLock;
41506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // State management of app transitions.  When we are preparing for a
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // transition, mNextAppTransition will be the kind of transition to
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // perform or TRANSIT_NONE if we are not waiting.  If we are waiting,
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // mOpeningApps and mClosingApps are the lists of tokens that will be
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // made visible or hidden at the next transition.
421bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn    int mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET;
4223b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    String mNextAppTransitionPackage;
4233b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    int mNextAppTransitionEnter;
4243b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    int mNextAppTransitionExit;
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAppTransitionReady = false;
426a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    boolean mAppTransitionRunning = false;
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAppTransitionTimeout = false;
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mStartingIconInTransition = false;
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mSkipAppTransitionAnimation = false;
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<AppWindowToken> mOpeningApps = new ArrayList<AppWindowToken>();
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<AppWindowToken> mClosingApps = new ArrayList<AppWindowToken>();
432a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    final ArrayList<AppWindowToken> mToTopApps = new ArrayList<AppWindowToken>();
433a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    final ArrayList<AppWindowToken> mToBottomApps = new ArrayList<AppWindowToken>();
43406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Display mDisplay;
43606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    H mH = new H();
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    WindowState mCurrentFocus = null;
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    WindowState mLastFocus = null;
44106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // This just indicates the window the input method is on top of, not
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // necessarily the window its input is going to.
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    WindowState mInputMethodTarget = null;
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mInputMethodTargetWaitingAnim;
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mInputMethodAnimLayerAdjustment;
44706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    WindowState mInputMethodWindow = null;
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<WindowState> mInputMethodDialogs = new ArrayList<WindowState>();
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4512992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    boolean mHardKeyboardAvailable;
4522992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    boolean mHardKeyboardEnabled;
4532992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    OnHardKeyboardStatusChangeListener mHardKeyboardStatusChangeListener;
4542992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
4554c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    final ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>();
456ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
457759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn    // If non-null, this is the currently visible window that is associated
458759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn    // with the wallpaper.
459759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn    WindowState mWallpaperTarget = null;
4603be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    // If non-null, we are in the middle of animating from one wallpaper target
4613be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    // to another, and this is the lower one in Z-order.
4623be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    WindowState mLowerWallpaperTarget = null;
4633be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    // If non-null, we are in the middle of animating from one wallpaper target
4643be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    // to another, and this is the higher one in Z-order.
4653be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn    WindowState mUpperWallpaperTarget = null;
4666c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn    // Window currently running an animation that has requested it be detached
4676c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn    // from the wallpaper.  This means we need to ensure the wallpaper is
4686c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn    // visible behind it in case it animates in a way that would allow it to be
4696c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn    // seen.
4706c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn    WindowState mWindowDetachedWallpaper = null;
471759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn    int mWallpaperAnimLayerAdjustment;
47273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn    float mLastWallpaperX = -1;
47373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn    float mLastWallpaperY = -1;
474bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen    float mLastWallpaperXStep = -1;
475bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen    float mLastWallpaperYStep = -1;
47619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    // This is set when we are waiting for a wallpaper to tell us it is done
47719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    // changing its scroll position.
47819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    WindowState mWaitingOnWallpaper;
47919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    // The last time we had a timeout when waiting for a wallpaper.
48019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    long mLastWallpaperTimeoutTime;
48119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    // We give a wallpaper up to 150ms to finish scrolling.
48219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    static final long WALLPAPER_TIMEOUT = 150;
48319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    // Time we wait after a timeout before trying to wait again.
48419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    static final long WALLPAPER_TIMEOUT_RECOVERY = 10000;
485ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AppWindowToken mFocusedApp = null;
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PowerManagerService mPowerManager;
48906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float mWindowAnimationScale = 1.0f;
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float mTransitionAnimationScale = 1.0f;
49206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
49346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    final InputManager mInputManager;
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Who is holding the screen on.
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Session mHoldingScreenOn;
49746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    PowerManager.WakeLock mHoldingScreenWakeLock;
49806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
49993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn    boolean mTurnOnScreen;
500ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
501a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    DragState mDragState = null;
5026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final InputHandler mDragInputHandler = new BaseInputHandler() {
503a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        @Override
5043915bb845b032dc184dba5e60970b803390ca3edJeff Brown        public void handleMotion(MotionEvent event, InputQueue.FinishedCallback finishedCallback) {
5053915bb845b032dc184dba5e60970b803390ca3edJeff Brown            boolean handled = false;
506a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            try {
5073915bb845b032dc184dba5e60970b803390ca3edJeff Brown                if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0
5083915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        && mDragState != null) {
5093915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    boolean endDrag = false;
5103915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    final float newX = event.getRawX();
5113915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    final float newY = event.getRawY();
5123915bb845b032dc184dba5e60970b803390ca3edJeff Brown
513a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    switch (event.getAction()) {
514a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    case MotionEvent.ACTION_DOWN: {
515a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (DEBUG_DRAG) {
516a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                            Slog.w(TAG, "Unexpected ACTION_DOWN in drag layer");
517a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        }
518a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    } break;
519a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
520a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    case MotionEvent.ACTION_MOVE: {
521a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        synchronized (mWindowMap) {
5222c095f367779ef32130c72849936a2e3013c8492Christopher Tate                            // move the surface and tell the involved window(s) where we are
523a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                            mDragState.notifyMoveLw(newX, newY);
524a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        }
525a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    } break;
526a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
527a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    case MotionEvent.ACTION_UP: {
528a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (DEBUG_DRAG) Slog.d(TAG, "Got UP on move channel; dropping at "
529a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                                + newX + "," + newY);
530a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        synchronized (mWindowMap) {
531d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                            endDrag = mDragState.notifyDropLw(newX, newY);
532a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        }
533a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    } break;
534a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
535a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    case MotionEvent.ACTION_CANCEL: {
536a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (DEBUG_DRAG) Slog.d(TAG, "Drag cancelled!");
537a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        endDrag = true;
538a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    } break;
539a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
540a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
541a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    if (endDrag) {
542a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (DEBUG_DRAG) Slog.d(TAG, "Drag ended; tearing down state");
543a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        // tell all the windows that the drag has ended
5445994359f3009a3ebfbd37d82bb9a665e9b947851Chris Tate                        synchronized (mWindowMap) {
545d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                            mDragState.endDragLw();
5465994359f3009a3ebfbd37d82bb9a665e9b947851Chris Tate                        }
547a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
5483915bb845b032dc184dba5e60970b803390ca3edJeff Brown
5493915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    handled = true;
550a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                }
551a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            } catch (Exception e) {
552a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                Slog.e(TAG, "Exception caught by drag handleMotion", e);
553a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            } finally {
5543915bb845b032dc184dba5e60970b803390ca3edJeff Brown                finishedCallback.finished(handled);
555a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            }
556a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        }
557a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    };
558a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
559a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    /**
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Whether the UI is currently running in touch mode (not showing
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * navigational focus because the user is directly pressing the screen).
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mInTouchMode = false;
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ViewServer mViewServer;
566dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    private ArrayList<WindowChangeListener> mWindowChangeListeners =
567dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        new ArrayList<WindowChangeListener>();
568dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    private boolean mWindowsChanged = false;
569dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev
570dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    public interface WindowChangeListener {
571dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        public void windowsChanged();
5726e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        public void focusChanged();
573dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    }
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
575c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn    final Configuration mTempConfiguration = new Configuration();
576c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    int mScreenLayout = Configuration.SCREENLAYOUT_SIZE_UNDEFINED;
5771ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
5781ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima    // The frame use to limit the size of the app running in compatibility mode.
5791ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima    Rect mCompatibleScreenFrame = new Rect();
5801ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima    // The surface used to fill the outer rim of the app running in compatibility mode.
5811ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima    Surface mBackgroundFillerSurface = null;
582ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn    WindowState mBackgroundFillerTarget = null;
5831ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static WindowManagerService main(Context context,
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            PowerManagerService pm, boolean haveInputMethods) {
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WMThread thr = new WMThread(context, pm, haveInputMethods);
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thr.start();
58806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (thr) {
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (thr.mService == null) {
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    thr.wait();
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (InterruptedException e) {
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
59606e57b5d46c87e9dd7bca1386b63b3a8522f51efJozef BABJAK            return thr.mService;
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
59906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class WMThread extends Thread {
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowManagerService mService;
60206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Context mContext;
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final PowerManagerService mPM;
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final boolean mHaveInputMethods;
60606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public WMThread(Context context, PowerManagerService pm,
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean haveInputMethods) {
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super("WindowManager");
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mContext = context;
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPM = pm;
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHaveInputMethods = haveInputMethods;
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
61406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void run() {
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Looper.prepare();
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowManagerService s = new WindowManagerService(mContext, mPM,
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mHaveInputMethods);
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            android.os.Process.setThreadPriority(
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    android.os.Process.THREAD_PRIORITY_DISPLAY);
621160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate            android.os.Process.setCanSelfBackground(false);
62206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mService = s;
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifyAll();
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
62706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
628ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // For debug builds, log event loop stalls to dropbox for analysis.
629ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            if (StrictMode.conditionallyEnableDebugLogging()) {
630ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick                Slog.i(TAG, "Enabled StrictMode logging for WMThread's Looper");
631ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            }
632ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Looper.loop();
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class PolicyThread extends Thread {
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final WindowManagerPolicy mPolicy;
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final WindowManagerService mService;
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Context mContext;
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final PowerManagerService mPM;
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean mRunning = false;
64306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PolicyThread(WindowManagerPolicy policy,
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowManagerService service, Context context,
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PowerManagerService pm) {
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super("WindowManagerPolicy");
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPolicy = policy;
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mService = service;
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mContext = context;
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPM = pm;
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
65306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void run() {
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Looper.prepare();
656ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn            WindowManagerPolicyThread.set(this, Looper.myLooper());
657ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Looper.myLooper().setMessageLogging(new LogPrinter(
6598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            //        Log.VERBOSE, "WindowManagerPolicy", Log.LOG_ID_SYSTEM));
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            android.os.Process.setThreadPriority(
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    android.os.Process.THREAD_PRIORITY_FOREGROUND);
662160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate            android.os.Process.setCanSelfBackground(false);
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPolicy.init(mContext, mService, mPM);
66406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (this) {
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRunning = true;
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifyAll();
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
66906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
670ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            // For debug builds, log event loop stalls to dropbox for analysis.
671ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            if (StrictMode.conditionallyEnableDebugLogging()) {
672ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick                Slog.i(TAG, "Enabled StrictMode for PolicyThread's Looper");
673ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick            }
674ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Looper.loop();
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowManagerService(Context context, PowerManagerService pm,
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean haveInputMethods) {
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHaveInputMethods = haveInputMethods;
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLimitedAlphaCompositing = context.getResources().getBoolean(
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.bool.config_sf_limitedAlpha);
68506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPowerManager = pm;
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPowerManager.setPolicy(mPolicy);
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PowerManager pmc = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenFrozenLock = pmc.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "SCREEN_FROZEN");
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenFrozenLock.setReferenceCounted(false);
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mActivityManager = ActivityManagerNative.getDefault();
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryStats = BatteryStatsService.getService();
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Get persisted window scale setting
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowAnimationScale = Settings.System.getFloat(context.getContentResolver(),
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Settings.System.WINDOW_ANIMATION_SCALE, mWindowAnimationScale);
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTransitionAnimationScale = Settings.System.getFloat(context.getContentResolver(),
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Settings.System.TRANSITION_ANIMATION_SCALE, mTransitionAnimationScale);
70106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
702284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        // Track changes to DevicePolicyManager state so we can enable/disable keyguard.
703284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        IntentFilter filter = new IntentFilter();
704284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
705284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        mContext.registerReceiver(mBroadcastReceiver, filter);
706284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller
70746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mHoldingScreenWakeLock = pmc.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK,
70846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                "KEEP_SCREEN_ON_FLAG");
70946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mHoldingScreenWakeLock.setReferenceCounted(false);
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
711e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        mInputManager = new InputManager(context, this);
71206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PolicyThread thr = new PolicyThread(mPolicy, this, context, pm);
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thr.start();
71506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (thr) {
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (!thr.mRunning) {
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    thr.wait();
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (InterruptedException e) {
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
72406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
72500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        mInputManager.start();
72606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Add ourself to the Watchdog monitors.
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Watchdog.getInstance().addMonitor(this);
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws RemoteException {
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return super.onTransact(code, data, reply, flags);
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // The window manager only throws security exceptions, so let's
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // log all others.
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!(e instanceof SecurityException)) {
7408a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.e(TAG, "Window Manager Crash", e);
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw e;
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
746e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    private void placeWindowAfter(WindowState pos, WindowState window) {
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int i = mWindows.indexOf(pos);
748f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Adding window " + window + " at "
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + (i+1) + " of " + mWindows.size() + " (after " + pos + ")");
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindows.add(i+1, window);
752dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        mWindowsChanged = true;
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
755e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    private void placeWindowBefore(WindowState pos, WindowState window) {
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int i = mWindows.indexOf(pos);
757f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Adding window " + window + " at "
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + i + " of " + mWindows.size() + " (before " + pos + ")");
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindows.add(i, window);
761dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        mWindowsChanged = true;
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //This method finds out the index of a window that has the same app token as
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //win. used for z ordering the windows in mWindows
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int findIdxBasedOnAppTokens(WindowState win) {
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //use a local variable to cache mWindows
768e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        ArrayList<WindowState> localmWindows = mWindows;
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int jmax = localmWindows.size();
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(jmax == 0) {
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return -1;
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for(int j = (jmax-1); j >= 0; j--) {
774e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState wentry = localmWindows.get(j);
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(wentry.mAppToken == win.mAppToken) {
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return j;
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
78106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void addWindowToListInOrderLocked(WindowState win, boolean addToToken) {
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final IWindow client = win.mClient;
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final WindowToken token = win.mToken;
785e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        final ArrayList<WindowState> localmWindows = mWindows;
78606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = localmWindows.size();
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final WindowState attached = win.mAttachedWindow;
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i;
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (attached == null) {
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int tokenWindowsPos = token.windows.size();
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token.appWindowToken != null) {
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int index = tokenWindowsPos-1;
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (index >= 0) {
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If this application has existing windows, we
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // simply place the new window on top of them... but
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // keep the starting window on top.
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (win.mAttrs.type == TYPE_BASE_APPLICATION) {
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Base windows go behind everything else.
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        placeWindowBefore(token.windows.get(0), win);
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        tokenWindowsPos = 0;
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        AppWindowToken atoken = win.mAppToken;
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (atoken != null &&
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                token.windows.get(index) == atoken.startingWindow) {
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            placeWindowBefore(token.windows.get(index), win);
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            tokenWindowsPos--;
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int newIdx =  findIdxBasedOnAppTokens(win);
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if(newIdx != -1) {
81106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                                //there is a window above this one associated with the same
81206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                                //apptoken note that the window could be a floating window
81306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                                //that was created later or a window at the top of the list of
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                //windows associated with this token.
815f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) {
816f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                    Slog.v(TAG, "Adding window " + win + " at "
817f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                            + (newIdx+1) + " of " + N);
818f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                }
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                localmWindows.add(newIdx+1, win);
820dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                                mWindowsChanged = true;
82106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                            }
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
8258a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (localLOGV) Slog.v(
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        TAG, "Figuring out where to add app window "
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + client.asBinder() + " (token=" + token + ")");
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Figure out where the window should go, based on the
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // order of applications.
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int NA = mAppTokens.size();
831e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    WindowState pos = null;
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (i=NA-1; i>=0; i--) {
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        AppWindowToken t = mAppTokens.get(i);
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (t == token) {
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            i--;
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            break;
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
838ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
839a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // We haven't reached the token yet; if this token
840a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // is not going to the bottom and has windows, we can
841a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // use it as an anchor for when we do reach the token.
842a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        if (!t.sendingToBottom && t.windows.size() > 0) {
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            pos = t.windows.get(0);
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // We now know the index into the apps.  If we found
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // an app window above, that gives us the position; else
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // we need to look some more.
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (pos != null) {
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Move behind any windows attached to this one.
851e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                        WindowToken atoken = mTokenMap.get(pos.mClient.asBinder());
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (atoken != null) {
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            final int NC = atoken.windows.size();
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (NC > 0) {
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                WindowState bottom = atoken.windows.get(0);
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (bottom.mSubLayer < 0) {
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    pos = bottom;
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        placeWindowBefore(pos, win);
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
863a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // Continue looking down until we find the first
864a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // token that has windows.
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        while (i >= 0) {
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AppWindowToken t = mAppTokens.get(i);
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            final int NW = t.windows.size();
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (NW > 0) {
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pos = t.windows.get(NW-1);
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                break;
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            i--;
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (pos != null) {
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Move in front of any windows attached to this
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // one.
877e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                            WindowToken atoken = mTokenMap.get(pos.mClient.asBinder());
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (atoken != null) {
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                final int NC = atoken.windows.size();
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (NC > 0) {
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    WindowState top = atoken.windows.get(NC-1);
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    if (top.mSubLayer >= 0) {
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        pos = top;
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    }
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            placeWindowAfter(pos, win);
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Just search for the start of this layer.
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            final int myLayer = win.mBaseLayer;
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            for (i=0; i<N; i++) {
892e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                                WindowState w = localmWindows.get(i);
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (w.mBaseLayer > myLayer) {
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    break;
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
897f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) {
898f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                Slog.v(TAG, "Adding window " + win + " at "
899f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                        + i + " of " + N);
900f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            }
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            localmWindows.add(i, win);
902dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                            mWindowsChanged = true;
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Figure out where window should go, based on layer.
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int myLayer = win.mBaseLayer;
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (i=N-1; i>=0; i--) {
910e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    if (localmWindows.get(i).mBaseLayer <= myLayer) {
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        i++;
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (i < 0) i = 0;
916f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(
9179bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                        TAG, "Adding window " + win + " at "
9189bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                        + i + " of " + N);
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                localmWindows.add(i, win);
920dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                mWindowsChanged = true;
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (addToToken) {
923f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token);
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                token.windows.add(tokenWindowsPos, win);
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Figure out this window's ordering relative to the window
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // it is attached to.
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int NA = token.windows.size();
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int sublayer = win.mSubLayer;
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int largestSublayer = Integer.MIN_VALUE;
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowState windowWithLargestSublayer = null;
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (i=0; i<NA; i++) {
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState w = token.windows.get(i);
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int wSublayer = w.mSubLayer;
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wSublayer >= largestSublayer) {
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    largestSublayer = wSublayer;
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    windowWithLargestSublayer = w;
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sublayer < 0) {
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // For negative sublayers, we go below all windows
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // in the same sublayer.
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wSublayer >= sublayer) {
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (addToToken) {
946f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token);
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            token.windows.add(i, win);
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        placeWindowBefore(
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wSublayer >= 0 ? attached : w, win);
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // For positive sublayers, we go above all windows
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // in the same sublayer.
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wSublayer > sublayer) {
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (addToToken) {
958f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token);
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            token.windows.add(i, win);
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        placeWindowBefore(w, win);
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (i >= NA) {
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (addToToken) {
968f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token);
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    token.windows.add(win);
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sublayer < 0) {
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    placeWindowBefore(attached, win);
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    placeWindowAfter(largestSublayer >= 0
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     ? windowWithLargestSublayer
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     : attached,
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                     win);
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
98106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (win.mAppToken != null && addToToken) {
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mAppToken.allAppWindows.add(win);
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
98606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static boolean canBeImeTarget(WindowState w) {
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int fl = w.mAttrs.flags
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                & (FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM);
990e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn        if (fl == 0 || fl == (FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM)
991e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                || w.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) {
992e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn            if (DEBUG_INPUT_METHOD) {
993e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                Slog.i(TAG, "isVisibleOrAdding " + w + ": " + w.isVisibleOrAdding());
994e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                if (!w.isVisibleOrAdding()) {
995e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    Slog.i(TAG, "  mSurface=" + w.mSurface + " reportDestroy=" + w.mReportDestroySurface
996e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            + " relayoutCalled=" + w.mRelayoutCalled + " viewVis=" + w.mViewVisibility
997e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            + " policyVis=" + w.mPolicyVisibility + " attachHid=" + w.mAttachedHidden
998e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            + " exiting=" + w.mExiting + " destroying=" + w.mDestroying);
999e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    if (w.mAppToken != null) {
1000e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        Slog.i(TAG, "  mAppToken.hiddenRequested=" + w.mAppToken.hiddenRequested);
1001e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    }
1002e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                }
1003e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn            }
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return w.isVisibleOrAdding();
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
100806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int findDesiredInputMethodWindowIndexLocked(boolean willMove) {
1010e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        final ArrayList<WindowState> localmWindows = mWindows;
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = localmWindows.size();
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState w = null;
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i = N;
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (i > 0) {
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            i--;
1016e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            w = localmWindows.get(i);
101706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1018e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn            if (DEBUG_INPUT_METHOD && willMove) Slog.i(TAG, "Checking window @" + i
1019e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    + " " + w + " fl=0x" + Integer.toHexString(w.mAttrs.flags));
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (canBeImeTarget(w)) {
10218a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                //Slog.i(TAG, "Putting input method here!");
102206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Yet more tricksyness!  If this window is a "starting"
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // window, we do actually want to be on top of it, but
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // it is not -really- where input will go.  So if the caller
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // is not actually looking to move the IME, look down below
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // for a real window to target...
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!willMove
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && w.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && i > 0) {
1031e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    WindowState wb = localmWindows.get(i-1);
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wb.mAppToken == w.mAppToken && canBeImeTarget(wb)) {
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        i--;
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w = wb;
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
104006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1041e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn        if (DEBUG_INPUT_METHOD && willMove) Slog.v(TAG, "Proposed new IME target: " + w);
1042e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn
10437eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        // Now, a special case -- if the last target's window is in the
10447eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        // process of exiting, and is above the new target, keep on the
10457eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        // last target to avoid flicker.  Consider for example a Dialog with
10467eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        // the IME shown: when the Dialog is dismissed, we want to keep
10477eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        // the IME above it until it is completely gone so it doesn't drop
10487eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        // behind the dialog or its full-screen scrim.
10497eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        if (mInputMethodTarget != null && w != null
10507eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn                && mInputMethodTarget.isDisplayedLw()
10517eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn                && mInputMethodTarget.mExiting) {
10527eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn            if (mInputMethodTarget.mAnimLayer > w.mAnimLayer) {
10537eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn                w = mInputMethodTarget;
10547eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn                i = localmWindows.indexOf(w);
1055e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Current target higher, switching to: " + w);
10567eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn            }
10577eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn        }
105806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
10598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Desired input method target="
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + w + " willMove=" + willMove);
106106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (willMove && w != null) {
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final WindowState curTarget = mInputMethodTarget;
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (curTarget != null && curTarget.mAppToken != null) {
106506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Now some fun for dealing with window animations that
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // modify the Z order.  We need to look at all windows below
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // the current target that are in this app, finding the highest
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // visible one in layering.
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AppWindowToken token = curTarget.mAppToken;
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState highestTarget = null;
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int highestPos = 0;
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (token.animating || token.animation != null) {
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int pos = 0;
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pos = localmWindows.indexOf(curTarget);
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    while (pos >= 0) {
1077e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                        WindowState win = localmWindows.get(pos);
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (win.mAppToken != token) {
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            break;
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!win.mRemoved) {
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (highestTarget == null || win.mAnimLayer >
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    highestTarget.mAnimLayer) {
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                highestTarget = win;
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                highestPos = pos;
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pos--;
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
109106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (highestTarget != null) {
10938a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_INPUT_METHOD) Slog.v(TAG, "mNextAppTransition="
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mNextAppTransition + " " + highestTarget
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " animating=" + highestTarget.isAnimating()
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " layer=" + highestTarget.mAnimLayer
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " new layer=" + w.mAnimLayer);
109806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
1099bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                    if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // If we are currently setting up for an animation,
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // hold everything until we can find out what will happen.
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mInputMethodTargetWaitingAnim = true;
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mInputMethodTarget = highestTarget;
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return highestPos + 1;
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (highestTarget.isAnimating() &&
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            highestTarget.mAnimLayer > w.mAnimLayer) {
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // If the window we are currently targeting is involved
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // with an animation, and it is on top of the next target
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // we will be over, then hold off on moving until
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // that is done.
1111e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        mInputMethodTargetWaitingAnim = true;
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mInputMethodTarget = highestTarget;
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return highestPos + 1;
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
111806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
11198a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //Slog.i(TAG, "Placing input method @" + (i+1));
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (w != null) {
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (willMove) {
1122b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (DEBUG_INPUT_METHOD) {
1123b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    RuntimeException e = null;
1124b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (!HIDE_STACK_CRAWLS) {
1125b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        e = new RuntimeException();
1126b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        e.fillInStackTrace();
1127b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
1128b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    Slog.w(TAG, "Moving IM target from "
1129b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + mInputMethodTarget + " to " + w, e);
1130b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                }
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInputMethodTarget = w;
1132e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                mInputMethodTargetWaitingAnim = false;
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (w.mAppToken != null) {
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    setInputMethodAnimLayerAdjustment(w.mAppToken.animLayerAdjustment);
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    setInputMethodAnimLayerAdjustment(0);
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return i+1;
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (willMove) {
1142b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            if (DEBUG_INPUT_METHOD) {
1143b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                RuntimeException e = null;
1144b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (!HIDE_STACK_CRAWLS) {
1145b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    e = new RuntimeException();
1146b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    e.fillInStackTrace();
1147b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                }
1148b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                Slog.w(TAG, "Moving IM target from "
1149b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + mInputMethodTarget + " to null", e);
1150b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            }
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInputMethodTarget = null;
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setInputMethodAnimLayerAdjustment(0);
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
115606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void addInputMethodWindowToListLocked(WindowState win) {
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = findDesiredInputMethodWindowIndexLocked(true);
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pos >= 0) {
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mTargetAppToken = mInputMethodTarget.mAppToken;
1161f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            if (DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(
11629bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    TAG, "Adding input method window " + win + " at " + pos);
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindows.add(pos, win);
1164dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            mWindowsChanged = true;
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            moveInputMethodDialogsLocked(pos+1);
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        win.mTargetAppToken = null;
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        addWindowToListInOrderLocked(win, true);
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        moveInputMethodDialogsLocked(pos);
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
117206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setInputMethodAnimLayerAdjustment(int adj) {
11748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_LAYERS) Slog.v(TAG, "Setting im layer adj to " + adj);
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInputMethodAnimLayerAdjustment = adj;
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState imw = mInputMethodWindow;
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (imw != null) {
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            imw.mAnimLayer = imw.mLayer + adj;
11798a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + imw
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " anim layer: " + imw.mAnimLayer);
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int wi = imw.mChildWindows.size();
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (wi > 0) {
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wi--;
1184e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState cw = imw.mChildWindows.get(wi);
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cw.mAnimLayer = cw.mLayer + adj;
11868a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + cw
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " anim layer: " + cw.mAnimLayer);
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int di = mInputMethodDialogs.size();
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (di > 0) {
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            di --;
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            imw = mInputMethodDialogs.get(di);
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            imw.mAnimLayer = imw.mLayer + adj;
11958a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + imw
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " anim layer: " + imw.mAnimLayer);
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
119906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int tmpRemoveWindowLocked(int interestingPos, WindowState win) {
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int wpos = mWindows.indexOf(win);
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wpos >= 0) {
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wpos < interestingPos) interestingPos--;
12048a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Temp removing at " + wpos + ": " + win);
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindows.remove(wpos);
1206dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            mWindowsChanged = true;
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NC = win.mChildWindows.size();
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (NC > 0) {
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                NC--;
1210e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState cw = win.mChildWindows.get(NC);
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int cpos = mWindows.indexOf(cw);
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (cpos >= 0) {
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (cpos < interestingPos) interestingPos--;
12148a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Temp removing child at "
12159bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                            + cpos + ": " + cw);
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mWindows.remove(cpos);
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return interestingPos;
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
122206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void reAddWindowToListInOrderLocked(WindowState win) {
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        addWindowToListInOrderLocked(win, false);
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // This is a hack to get all of the child windows added as well
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // at the right position.  Child windows should be rare and
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this case should be rare, so it shouldn't be that big a deal.
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int wpos = mWindows.indexOf(win);
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wpos >= 0) {
12308a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "ReAdd removing from " + wpos
12319bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    + ": " + win);
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindows.remove(wpos);
1233dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            mWindowsChanged = true;
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reAddWindowLocked(wpos, win);
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
123706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void logWindowList(String prefix) {
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int N = mWindows.size();
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (N > 0) {
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            N--;
12428a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.v(TAG, prefix + "#" + N + ": " + mWindows.get(N));
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
124506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void moveInputMethodDialogsLocked(int pos) {
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ArrayList<WindowState> dialogs = mInputMethodDialogs;
124806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = dialogs.size();
12508a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Removing " + N + " dialogs w/pos=" + pos);
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos = tmpRemoveWindowLocked(pos, dialogs.get(i));
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_INPUT_METHOD) {
12558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.v(TAG, "Window list w/pos=" + pos);
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            logWindowList("  ");
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
125806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pos >= 0) {
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final AppWindowToken targetAppToken = mInputMethodTarget.mAppToken;
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (pos < mWindows.size()) {
1262e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState wp = mWindows.get(pos);
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wp == mInputMethodWindow) {
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pos++;
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12678a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Adding " + N + " dialogs at pos=" + pos);
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState win = dialogs.get(i);
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mTargetAppToken = targetAppToken;
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pos = reAddWindowLocked(pos, win);
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_INPUT_METHOD) {
12748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.v(TAG, "Final window list:");
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                logWindowList("  ");
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowState win = dialogs.get(i);
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mTargetAppToken = null;
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reAddWindowToListInOrderLocked(win);
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_INPUT_METHOD) {
12848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.v(TAG, "No IM target, final list:");
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                logWindowList("  ");
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
128906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean moveInputMethodWindowsIfNeededLocked(boolean needAssignLayers) {
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final WindowState imWin = mInputMethodWindow;
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int DN = mInputMethodDialogs.size();
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (imWin == null && DN == 0) {
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
129606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int imPos = findDesiredInputMethodWindowIndexLocked(true);
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (imPos >= 0) {
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // In this case, the input method windows are to be placed
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // immediately above the window they are targeting.
130106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // First check to see if the input method windows are already
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // located here, and contiguous.
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = mWindows.size();
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowState firstImWin = imPos < N
1306e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    ? mWindows.get(imPos) : null;
130706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Figure out the actual input method window that should be
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // at the bottom of their stack.
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowState baseImWin = imWin != null
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? imWin : mInputMethodDialogs.get(0);
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (baseImWin.mChildWindows.size() > 0) {
1313e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState cw = baseImWin.mChildWindows.get(0);
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (cw.mSubLayer < 0) baseImWin = cw;
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
131606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (firstImWin == baseImWin) {
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // The windows haven't moved...  but are they still contiguous?
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // First find the top IM window.
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int pos = imPos+1;
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (pos < N) {
1322e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    if (!(mWindows.get(pos)).mIsImWindow) {
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pos++;
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pos++;
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Now there should be no more input method windows above.
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (pos < N) {
1330e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    if ((mWindows.get(pos)).mIsImWindow) {
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pos++;
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pos >= N) {
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // All is good!
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
134006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imWin != null) {
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_INPUT_METHOD) {
13438a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "Moving IM from " + imPos);
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    logWindowList("  ");
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imPos = tmpRemoveWindowLocked(imPos, imWin);
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_INPUT_METHOD) {
13487eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn                    Slog.v(TAG, "List after removing with new pos " + imPos + ":");
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    logWindowList("  ");
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imWin.mTargetAppToken = mInputMethodTarget.mAppToken;
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reAddWindowLocked(imPos, imWin);
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_INPUT_METHOD) {
13548a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "List after moving IM to " + imPos + ":");
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    logWindowList("  ");
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DN > 0) moveInputMethodDialogsLocked(imPos+1);
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                moveInputMethodDialogsLocked(imPos);
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
136106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // In this case, the input method windows go in a fixed layer,
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // because they aren't currently associated with a focus window.
136506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imWin != null) {
13678a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Moving IM from " + imPos);
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                tmpRemoveWindowLocked(0, imWin);
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imWin.mTargetAppToken = null;
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reAddWindowToListInOrderLocked(imWin);
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_INPUT_METHOD) {
13728a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "List with no IM target:");
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    logWindowList("  ");
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DN > 0) moveInputMethodDialogsLocked(-1);;
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                moveInputMethodDialogsLocked(-1);;
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
137906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
138106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (needAssignLayers) {
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assignLayersLocked();
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
138506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
138806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void adjustInputMethodDialogsLocked() {
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        moveInputMethodDialogsLocked(findDesiredInputMethodWindowIndexLocked(true));
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
139206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
139325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn    final boolean isWallpaperVisible(WindowState wallpaperTarget) {
13948a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper vis: target obscured="
139525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                + (wallpaperTarget != null ? Boolean.toString(wallpaperTarget.mObscured) : "??")
139625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                + " anim=" + ((wallpaperTarget != null && wallpaperTarget.mAppToken != null)
139725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        ? wallpaperTarget.mAppToken.animation : null)
139825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                + " upper=" + mUpperWallpaperTarget
139925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                + " lower=" + mLowerWallpaperTarget);
140025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn        return (wallpaperTarget != null
140125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        && (!wallpaperTarget.mObscured || (wallpaperTarget.mAppToken != null
140225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                && wallpaperTarget.mAppToken.animation != null)))
140325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                || mUpperWallpaperTarget != null
140425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                || mLowerWallpaperTarget != null;
140525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn    }
1406ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
14070586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    static final int ADJUST_WALLPAPER_LAYERS_CHANGED = 1<<1;
14080586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    static final int ADJUST_WALLPAPER_VISIBILITY_CHANGED = 1<<2;
1409ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
14100586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn    int adjustWallpaperWindowsLocked() {
14110586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn        int changed = 0;
1412ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
14133be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn        final int dw = mDisplay.getWidth();
14143be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn        final int dh = mDisplay.getHeight();
1415ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
14164c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // First find top-most window that has asked to be on top of the
14174c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // wallpaper; all wallpapers go behind it.
1418e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        final ArrayList<WindowState> localmWindows = mWindows;
14194c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        int N = localmWindows.size();
14204c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        WindowState w = null;
1421f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn        WindowState foundW = null;
1422f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn        int foundI = 0;
14233b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        WindowState topCurW = null;
14243b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        int topCurI = 0;
14256c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn        int windowDetachedI = -1;
14264c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        int i = N;
14274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        while (i > 0) {
14284c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            i--;
1429e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            w = localmWindows.get(i);
14303b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if ((w.mAttrs.type == WindowManager.LayoutParams.TYPE_WALLPAPER)) {
14313b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                if (topCurW == null) {
14323b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    topCurW = w;
14333b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    topCurI = i;
14343b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                }
14353b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                continue;
14363b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            }
14373b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            topCurW = null;
14386c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            if (w != mWindowDetachedWallpaper && w.mAppToken != null) {
14393be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                // If this window's app token is hidden and not animating,
14403be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                // it is of no interest to us.
14413be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                if (w.mAppToken.hidden && w.mAppToken.animation == null) {
14428a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WALLPAPER) Slog.v(TAG,
14436c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                            "Skipping not hidden or animating token: " + w);
14443be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    continue;
1445f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                }
1446f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            }
14478a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WALLPAPER) Slog.v(TAG, "Win " + w + ": readyfordisplay="
14483be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    + w.isReadyForDisplay() + " drawpending=" + w.mDrawPending
14493be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    + " commitdrawpending=" + w.mCommitDrawPending);
14507341d7a104b47996445d069a695e155a07184606Dianne Hackborn            if ((w.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0 && w.isReadyForDisplay()
14516c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                    && (mWallpaperTarget == w
14526c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                            || (!w.mDrawPending && !w.mCommitDrawPending))) {
14538a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WALLPAPER) Slog.v(TAG,
14543be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        "Found wallpaper activity: #" + i + "=" + w);
1455f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                foundW = w;
1456f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                foundI = i;
14573b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                if (w == mWallpaperTarget && ((w.mAppToken != null
14583b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        && w.mAppToken.animation != null)
14593b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        || w.mAnimation != null)) {
14603be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    // The current wallpaper target is animating, so we'll
14613be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    // look behind it for another possible target and figure
14623be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    // out what is going on below.
14638a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WALLPAPER) Slog.v(TAG, "Win " + w
14643be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            + ": token animating, looking behind.");
1465f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                    continue;
1466f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                }
14674c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                break;
14686c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            } else if (w == mWindowDetachedWallpaper) {
14696c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                windowDetachedI = i;
14704c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
14714c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
14724c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
14736c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn        if (foundW == null && windowDetachedI >= 0) {
14746c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            if (DEBUG_WALLPAPER) Slog.v(TAG,
14756c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                    "Found animating detached wallpaper activity: #" + i + "=" + w);
14766c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            foundW = w;
14776c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            foundI = windowDetachedI;
14786c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn        }
14796c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn
1480bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn        if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
1481f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // If we are currently waiting for an app transition, and either
1482f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // the current target or the next target are involved with it,
1483f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // then hold off on doing anything with the wallpaper.
1484f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // Note that we are checking here for just whether the target
1485f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // is part of an app token...  which is potentially overly aggressive
1486f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // (the app token may not be involved in the transition), but good
1487f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // enough (we'll just wait until whatever transition is pending
1488f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // executes).
1489f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            if (mWallpaperTarget != null && mWallpaperTarget.mAppToken != null) {
14908a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WALLPAPER) Slog.v(TAG,
14913be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        "Wallpaper not changing: waiting for app anim in current target");
14920586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                return 0;
1493f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            }
1494f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            if (foundW != null && foundW.mAppToken != null) {
14958a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WALLPAPER) Slog.v(TAG,
14963be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        "Wallpaper not changing: waiting for app anim in found target");
14970586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                return 0;
1498f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            }
14997341d7a104b47996445d069a695e155a07184606Dianne Hackborn        }
1500ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1501f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn        if (mWallpaperTarget != foundW) {
1502f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            if (DEBUG_WALLPAPER) {
15038a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.v(TAG, "New wallpaper target: " + foundW
15043be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        + " oldTarget: " + mWallpaperTarget);
15053be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            }
1506ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
15073be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            mLowerWallpaperTarget = null;
15083be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            mUpperWallpaperTarget = null;
1509ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
15103be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            WindowState oldW = mWallpaperTarget;
15113be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            mWallpaperTarget = foundW;
1512ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
15133be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            // Now what is happening...  if the current and new targets are
15143be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            // animating, then we are in our super special mode!
15153b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if (foundW != null && oldW != null) {
15163b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                boolean oldAnim = oldW.mAnimation != null
15173b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        || (oldW.mAppToken != null && oldW.mAppToken.animation != null);
15183b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                boolean foundAnim = foundW.mAnimation != null
15193b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        || (foundW.mAppToken != null && foundW.mAppToken.animation != null);
15203be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                if (DEBUG_WALLPAPER) {
15218a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "New animation: " + foundAnim
15223b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            + " old animation: " + oldAnim);
15233be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                }
15243b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                if (foundAnim && oldAnim) {
15253be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    int oldI = localmWindows.indexOf(oldW);
15263be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    if (DEBUG_WALLPAPER) {
15278a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.v(TAG, "New i: " + foundI + " old i: " + oldI);
15283be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    }
15293be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    if (oldI >= 0) {
15303be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        if (DEBUG_WALLPAPER) {
15318a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            Slog.v(TAG, "Animating wallpapers: old#" + oldI
15323be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                                    + "=" + oldW + "; new#" + foundI
15333be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                                    + "=" + foundW);
15343be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        }
1535ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
15363be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        // Set the new target correctly.
15373b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        if (foundW.mAppToken != null && foundW.mAppToken.hiddenRequested) {
15383be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            if (DEBUG_WALLPAPER) {
15398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.v(TAG, "Old wallpaper still the target.");
15403be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            }
15413be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            mWallpaperTarget = oldW;
15423be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        }
1543ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
15443be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        // Now set the upper and lower wallpaper targets
15453be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        // correctly, and make sure that we are positioning
15463be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        // the wallpaper below the lower.
15473be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        if (foundI > oldI) {
15483be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            // The new target is on top of the old one.
15493be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            if (DEBUG_WALLPAPER) {
15508a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.v(TAG, "Found target above old target.");
15513be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            }
15523be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            mUpperWallpaperTarget = foundW;
15533be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            mLowerWallpaperTarget = oldW;
15543be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            foundW = oldW;
15553be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            foundI = oldI;
15563be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        } else {
15573be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            // The new target is below the old one.
15583be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            if (DEBUG_WALLPAPER) {
15598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.v(TAG, "Found target below old target.");
15603be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            }
15613be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            mUpperWallpaperTarget = oldW;
15623be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                            mLowerWallpaperTarget = foundW;
15633be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        }
15643be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    }
15653be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                }
15663be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            }
1567ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
15686b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn        } else if (mLowerWallpaperTarget != null) {
15693be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn            // Is it time to stop animating?
15706b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn            boolean lowerAnimating = mLowerWallpaperTarget.mAnimation != null
15716b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn                    || (mLowerWallpaperTarget.mAppToken != null
15726b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn                            && mLowerWallpaperTarget.mAppToken.animation != null);
15736b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn            boolean upperAnimating = mUpperWallpaperTarget.mAnimation != null
15746b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn                    || (mUpperWallpaperTarget.mAppToken != null
15756b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn                            && mUpperWallpaperTarget.mAppToken.animation != null);
15766b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn            if (!lowerAnimating || !upperAnimating) {
15773be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                if (DEBUG_WALLPAPER) {
15788a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "No longer animating wallpaper targets!");
15793be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                }
15803be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                mLowerWallpaperTarget = null;
15813be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                mUpperWallpaperTarget = null;
1582f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            }
1583f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn        }
1584ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1585f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn        boolean visible = foundW != null;
1586759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        if (visible) {
15877341d7a104b47996445d069a695e155a07184606Dianne Hackborn            // The window is visible to the compositor...  but is it visible
15887341d7a104b47996445d069a695e155a07184606Dianne Hackborn            // to the user?  That is what the wallpaper cares about.
158925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn            visible = isWallpaperVisible(foundW);
15908a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper visibility: " + visible);
1591ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
15927341d7a104b47996445d069a695e155a07184606Dianne Hackborn            // If the wallpaper target is animating, we may need to copy
1593f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // its layer adjustment.  Only do this if we are not transfering
1594f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            // between two wallpaper targets.
1595f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            mWallpaperAnimLayerAdjustment =
15963be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                    (mLowerWallpaperTarget == null && foundW.mAppToken != null)
1597f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                    ? foundW.mAppToken.animLayerAdjustment : 0;
1598ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
15996136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn            final int maxLayer = mPolicy.getMaxWallpaperLayer()
16006136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                    * TYPE_LAYER_MULTIPLIER
16016136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                    + TYPE_LAYER_OFFSET;
1602ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16034c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            // Now w is the window we are supposed to be behind...  but we
16044c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            // need to be sure to also be behind any of its attached windows,
16056136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn            // AND any starting window associated with it, AND below the
16066136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn            // maximum layer the policy allows for wallpapers.
1607f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn            while (foundI > 0) {
1608e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState wb = localmWindows.get(foundI-1);
16096136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                if (wb.mBaseLayer < maxLayer &&
16106136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                        wb.mAttachedWindow != foundW &&
1611428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        (foundW.mAttachedWindow == null ||
1612428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                                wb.mAttachedWindow != foundW.mAttachedWindow) &&
16134c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                        (wb.mAttrs.type != TYPE_APPLICATION_STARTING ||
1614428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                                foundW.mToken == null || wb.mToken != foundW.mToken)) {
16154c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    // This window is not related to the previous one in any
16164c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    // interesting way, so stop here.
16174c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    break;
16184c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
1619f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                foundW = wb;
1620f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                foundI--;
16214c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
162225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn        } else {
16238a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WALLPAPER) Slog.v(TAG, "No wallpaper target");
16244c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
1625ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16263b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        if (foundW == null && topCurW != null) {
16273b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            // There is no wallpaper target, so it goes at the bottom.
16283b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            // We will assume it is the same place as last time, if known.
16293b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            foundW = topCurW;
16303b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            foundI = topCurI+1;
16313b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        } else {
16323b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            // Okay i is the position immediately above the wallpaper.  Look at
16333b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            // what is below it for later.
1634e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            foundW = foundI > 0 ? localmWindows.get(foundI-1) : null;
16353b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        }
1636ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1637284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        if (visible) {
163873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            if (mWallpaperTarget.mWallpaperX >= 0) {
163973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                mLastWallpaperX = mWallpaperTarget.mWallpaperX;
1640bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                mLastWallpaperXStep = mWallpaperTarget.mWallpaperXStep;
164173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            }
164273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            if (mWallpaperTarget.mWallpaperY >= 0) {
164373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                mLastWallpaperY = mWallpaperTarget.mWallpaperY;
1644bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                mLastWallpaperYStep = mWallpaperTarget.mWallpaperYStep;
164573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            }
1646284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn        }
1647ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // Start stepping backwards from here, ensuring that our wallpaper windows
16494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // are correctly placed.
16504c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        int curTokenIndex = mWallpaperTokens.size();
16514c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        while (curTokenIndex > 0) {
16524c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            curTokenIndex--;
16534c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            WindowToken token = mWallpaperTokens.get(curTokenIndex);
16540586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn            if (token.hidden == visible) {
16550586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                changed |= ADJUST_WALLPAPER_VISIBILITY_CHANGED;
16560586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                token.hidden = !visible;
16570586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                // Need to do a layout to ensure the wallpaper now has the
16580586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                // correct size.
16590586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                mLayoutNeeded = true;
16600586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn            }
1661ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16624c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            int curWallpaperIndex = token.windows.size();
16634c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            while (curWallpaperIndex > 0) {
16644c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                curWallpaperIndex--;
16654c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                WindowState wallpaper = token.windows.get(curWallpaperIndex);
1666ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
166772c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                if (visible) {
166819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    updateWallpaperOffsetLocked(wallpaper, dw, dh, false);
166972c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                }
1670ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1671759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                // First, make sure the client has the current visibility
1672759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                // state.
1673759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                if (wallpaper.mWallpaperVisible != visible) {
1674759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    wallpaper.mWallpaperVisible = visible;
1675759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    try {
16768a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_VISIBILITY || DEBUG_WALLPAPER) Slog.v(TAG,
1677759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                                "Setting visibility of wallpaper " + wallpaper
1678759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                                + ": " + visible);
1679759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                        wallpaper.mClient.dispatchAppVisibility(visible);
1680759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    } catch (RemoteException e) {
1681759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    }
1682759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                }
1683ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1684759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                wallpaper.mAnimLayer = wallpaper.mLayer + mWallpaperAnimLayerAdjustment;
16858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper win "
16867341d7a104b47996445d069a695e155a07184606Dianne Hackborn                        + wallpaper + " anim layer: " + wallpaper.mAnimLayer);
1687ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16884c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // First, if this window is at the current index, then all
16894c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // is well.
1690f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                if (wallpaper == foundW) {
1691f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                    foundI--;
1692f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                    foundW = foundI > 0
1693e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                            ? localmWindows.get(foundI-1) : null;
16944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    continue;
16954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
1696ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
16974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // The window didn't match...  the current wallpaper window,
16984c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // wherever it is, is in the wrong place, so make sure it is
16994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // not in the list.
17004c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                int oldIndex = localmWindows.indexOf(wallpaper);
17014c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                if (oldIndex >= 0) {
17028a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Wallpaper removing at "
17039bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                            + oldIndex + ": " + wallpaper);
17044c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    localmWindows.remove(oldIndex);
1705dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                    mWindowsChanged = true;
1706f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                    if (oldIndex < foundI) {
1707f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                        foundI--;
17084c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    }
17094c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
1710ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
17114c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                // Now stick it in.
1712f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (DEBUG_WALLPAPER || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) {
1713f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    Slog.v(TAG, "Moving wallpaper " + wallpaper
1714f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            + " from " + oldIndex + " to " + foundI);
1715f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                }
1716ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1717f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                localmWindows.add(foundI, wallpaper);
1718dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                mWindowsChanged = true;
17190586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                changed |= ADJUST_WALLPAPER_LAYERS_CHANGED;
17204c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
17214c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
1722ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
17234c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        return changed;
17244c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
17254c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
1726c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn    void setWallpaperAnimLayerAdjustmentLocked(int adj) {
17278a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG,
17287341d7a104b47996445d069a695e155a07184606Dianne Hackborn                "Setting wallpaper layer adj to " + adj);
1729759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        mWallpaperAnimLayerAdjustment = adj;
1730759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        int curTokenIndex = mWallpaperTokens.size();
1731759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        while (curTokenIndex > 0) {
1732759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            curTokenIndex--;
1733759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            WindowToken token = mWallpaperTokens.get(curTokenIndex);
1734759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            int curWallpaperIndex = token.windows.size();
1735759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            while (curWallpaperIndex > 0) {
1736759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                curWallpaperIndex--;
1737759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                WindowState wallpaper = token.windows.get(curWallpaperIndex);
1738759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                wallpaper.mAnimLayer = wallpaper.mLayer + adj;
17398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper win "
17407341d7a104b47996445d069a695e155a07184606Dianne Hackborn                        + wallpaper + " anim layer: " + wallpaper.mAnimLayer);
1741759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            }
1742759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn        }
1743759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn    }
1744759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn
174519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    boolean updateWallpaperOffsetLocked(WindowState wallpaperWin, int dw, int dh,
174619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            boolean sync) {
174772c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn        boolean changed = false;
17487341d7a104b47996445d069a695e155a07184606Dianne Hackborn        boolean rawChanged = false;
174973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        float wpx = mLastWallpaperX >= 0 ? mLastWallpaperX : 0.5f;
1750bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen        float wpxs = mLastWallpaperXStep >= 0 ? mLastWallpaperXStep : -1.0f;
175173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        int availw = wallpaperWin.mFrame.right-wallpaperWin.mFrame.left-dw;
175273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        int offset = availw > 0 ? -(int)(availw*wpx+.5f) : 0;
175373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        changed = wallpaperWin.mXOffset != offset;
175473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        if (changed) {
17558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WALLPAPER) Slog.v(TAG, "Update wallpaper "
175673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                    + wallpaperWin + " x: " + offset);
175773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            wallpaperWin.mXOffset = offset;
175873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        }
1759bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen        if (wallpaperWin.mWallpaperX != wpx || wallpaperWin.mWallpaperXStep != wpxs) {
176073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            wallpaperWin.mWallpaperX = wpx;
1761bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen            wallpaperWin.mWallpaperXStep = wpxs;
176273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            rawChanged = true;
1763c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        }
1764ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
176573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        float wpy = mLastWallpaperY >= 0 ? mLastWallpaperY : 0.5f;
1766bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen        float wpys = mLastWallpaperYStep >= 0 ? mLastWallpaperYStep : -1.0f;
176773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        int availh = wallpaperWin.mFrame.bottom-wallpaperWin.mFrame.top-dh;
176873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        offset = availh > 0 ? -(int)(availh*wpy+.5f) : 0;
176973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        if (wallpaperWin.mYOffset != offset) {
17708a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WALLPAPER) Slog.v(TAG, "Update wallpaper "
177173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                    + wallpaperWin + " y: " + offset);
177273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            changed = true;
177373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            wallpaperWin.mYOffset = offset;
177473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        }
1775bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen        if (wallpaperWin.mWallpaperY != wpy || wallpaperWin.mWallpaperYStep != wpys) {
177673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            wallpaperWin.mWallpaperY = wpy;
1777bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen            wallpaperWin.mWallpaperYStep = wpys;
177873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            rawChanged = true;
177972c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn        }
1780ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
17817341d7a104b47996445d069a695e155a07184606Dianne Hackborn        if (rawChanged) {
178272c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn            try {
17838a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WALLPAPER) Slog.v(TAG, "Report new wp offset "
1784e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                        + wallpaperWin + " x=" + wallpaperWin.mWallpaperX
1785e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                        + " y=" + wallpaperWin.mWallpaperY);
178619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                if (sync) {
17877580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    mWaitingOnWallpaper = wallpaperWin;
178819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                }
178972c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn                wallpaperWin.mClient.dispatchWallpaperOffsets(
1790bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                        wallpaperWin.mWallpaperX, wallpaperWin.mWallpaperY,
1791bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                        wallpaperWin.mWallpaperXStep, wallpaperWin.mWallpaperYStep, sync);
179219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                if (sync) {
17937580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    if (mWaitingOnWallpaper != null) {
17947580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        long start = SystemClock.uptimeMillis();
17957580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        if ((mLastWallpaperTimeoutTime+WALLPAPER_TIMEOUT_RECOVERY)
17967580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                < start) {
17977580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                            try {
17988a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_WALLPAPER) Slog.v(TAG,
17997580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                        "Waiting for offset complete...");
18007580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                mWindowMap.wait(WALLPAPER_TIMEOUT);
18017580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                            } catch (InterruptedException e) {
18027580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                            }
18038a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_WALLPAPER) Slog.v(TAG, "Offset complete!");
18047580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                            if ((start+WALLPAPER_TIMEOUT)
18057580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                    < SystemClock.uptimeMillis()) {
18068a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.i(TAG, "Timeout waiting for wallpaper to offset: "
18077580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                        + wallpaperWin);
18087580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                mLastWallpaperTimeoutTime = start;
180919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                            }
181019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                        }
18117580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        mWaitingOnWallpaper = null;
181219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    }
181319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                }
181472c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn            } catch (RemoteException e) {
181572c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn            }
1816c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        }
1817ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1818c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        return changed;
1819c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn    }
1820ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
182119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    void wallpaperOffsetsComplete(IBinder window) {
18227580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        synchronized (mWindowMap) {
182319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            if (mWaitingOnWallpaper != null &&
182419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    mWaitingOnWallpaper.mClient.asBinder() == window) {
182519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                mWaitingOnWallpaper = null;
18267580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                mWindowMap.notifyAll();
182719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            }
182819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn        }
182919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn    }
1830ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
183173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn    boolean updateWallpaperOffsetLocked(WindowState changingTarget, boolean sync) {
1832c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        final int dw = mDisplay.getWidth();
1833c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        final int dh = mDisplay.getHeight();
1834ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1835c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        boolean changed = false;
1836ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1837c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        WindowState target = mWallpaperTarget;
1838c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        if (target != null) {
183973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            if (target.mWallpaperX >= 0) {
184073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                mLastWallpaperX = target.mWallpaperX;
184173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            } else if (changingTarget.mWallpaperX >= 0) {
184273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                mLastWallpaperX = changingTarget.mWallpaperX;
184373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            }
184473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            if (target.mWallpaperY >= 0) {
184573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                mLastWallpaperY = target.mWallpaperY;
184673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            } else if (changingTarget.mWallpaperY >= 0) {
184773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                mLastWallpaperY = changingTarget.mWallpaperY;
184873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            }
184973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        }
1850ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
185173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        int curTokenIndex = mWallpaperTokens.size();
185273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn        while (curTokenIndex > 0) {
185373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            curTokenIndex--;
185473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            WindowToken token = mWallpaperTokens.get(curTokenIndex);
185573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            int curWallpaperIndex = token.windows.size();
185673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            while (curWallpaperIndex > 0) {
185773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                curWallpaperIndex--;
185873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                WindowState wallpaper = token.windows.get(curWallpaperIndex);
185973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                if (updateWallpaperOffsetLocked(wallpaper, dw, dh, sync)) {
186073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                    wallpaper.computeShownFrameLocked();
186173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                    changed = true;
186273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                    // We only want to be synchronous with one wallpaper.
186373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                    sync = false;
1864c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn                }
1865c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn            }
1866c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        }
1867ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1868c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        return changed;
1869c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn    }
1870ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1871e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn    void updateWallpaperVisibilityLocked() {
187225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn        final boolean visible = isWallpaperVisible(mWallpaperTarget);
1873e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn        final int dw = mDisplay.getWidth();
1874e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn        final int dh = mDisplay.getHeight();
1875ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1876e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn        int curTokenIndex = mWallpaperTokens.size();
1877e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn        while (curTokenIndex > 0) {
1878e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            curTokenIndex--;
1879e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            WindowToken token = mWallpaperTokens.get(curTokenIndex);
18800586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn            if (token.hidden == visible) {
18810586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                token.hidden = !visible;
18820586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                // Need to do a layout to ensure the wallpaper now has the
18830586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                // correct size.
18840586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                mLayoutNeeded = true;
18850586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn            }
1886ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1887e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            int curWallpaperIndex = token.windows.size();
1888e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            while (curWallpaperIndex > 0) {
1889e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                curWallpaperIndex--;
1890e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                WindowState wallpaper = token.windows.get(curWallpaperIndex);
1891e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                if (visible) {
189219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    updateWallpaperOffsetLocked(wallpaper, dw, dh, false);
1893e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                }
1894ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
1895e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                if (wallpaper.mWallpaperVisible != visible) {
1896e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    wallpaper.mWallpaperVisible = visible;
1897e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    try {
18988a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_VISIBILITY || DEBUG_WALLPAPER) Slog.v(TAG,
189925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                "Updating visibility of wallpaper " + wallpaper
1900e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                                + ": " + visible);
1901e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                        wallpaper.mClient.dispatchAppVisibility(visible);
1902e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    } catch (RemoteException e) {
1903e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    }
1904e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                }
1905e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            }
1906e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn        }
1907e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn    }
190890d2db3d21d07c2a4b4cbbc558f5ec59d20098c3Dianne Hackborn
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int addWindow(Session session, IWindow client,
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowManager.LayoutParams attrs, int viewVisibility,
191146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            Rect outContentInsets, InputChannel outInputChannel) {
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int res = mPolicy.checkAddPermission(attrs);
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (res != WindowManagerImpl.ADD_OKAY) {
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return res;
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
191606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean reportNewConfig = false;
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState attachedWindow = null;
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState win = null;
19205132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn        long origId;
192106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDisplay == null) {
19245132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn                throw new IllegalStateException("Display has not been initialialized");
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
192606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mWindowMap.containsKey(client.asBinder())) {
19288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Window " + client + " is already added");
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return WindowManagerImpl.ADD_DUPLICATE_ADD;
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (attrs.type >= FIRST_SUB_WINDOW && attrs.type <= LAST_SUB_WINDOW) {
1933e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                attachedWindow = windowForClientLocked(null, attrs.token, false);
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attachedWindow == null) {
19358a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add window with token that is not a window: "
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          + attrs.token + ".  Aborting.");
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN;
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attachedWindow.mAttrs.type >= FIRST_SUB_WINDOW
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && attachedWindow.mAttrs.type <= LAST_SUB_WINDOW) {
19418a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add window with token that is a sub-window: "
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + attrs.token + ".  Aborting.");
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN;
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean addToken = false;
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken token = mTokenMap.get(attrs.token);
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token == null) {
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attrs.type >= FIRST_APPLICATION_WINDOW
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && attrs.type <= LAST_APPLICATION_WINDOW) {
19528a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add application window with unknown token "
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          + attrs.token + ".  Aborting.");
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_BAD_APP_TOKEN;
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attrs.type == TYPE_INPUT_METHOD) {
19578a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add input method window with unknown token "
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          + attrs.token + ".  Aborting.");
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_BAD_APP_TOKEN;
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19614c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                if (attrs.type == TYPE_WALLPAPER) {
19628a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add wallpaper window with unknown token "
19634c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                          + attrs.token + ".  Aborting.");
19644c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    return WindowManagerImpl.ADD_BAD_APP_TOKEN;
19654c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
19666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                token = new WindowToken(this, attrs.token, -1, false);
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                addToken = true;
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (attrs.type >= FIRST_APPLICATION_WINDOW
19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && attrs.type <= LAST_APPLICATION_WINDOW) {
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AppWindowToken atoken = token.appWindowToken;
19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (atoken == null) {
19728a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add window with non-application token "
19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          + token + ".  Aborting.");
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_NOT_APP_TOKEN;
19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (atoken.removed) {
19768a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add window with exiting application token "
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          + token + ".  Aborting.");
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_APP_EXITING;
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attrs.type == TYPE_APPLICATION_STARTING && atoken.firstWindowDrawn) {
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // No need for this guy!
19828a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (localLOGV) Slog.v(
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            TAG, "**** NO NEED TO START: " + attrs.getTitle());
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return WindowManagerImpl.ADD_STARTING_NOT_NEEDED;
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (attrs.type == TYPE_INPUT_METHOD) {
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (token.windowType != TYPE_INPUT_METHOD) {
19888a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add input method window with bad token "
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + attrs.token + ".  Aborting.");
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      return WindowManagerImpl.ADD_BAD_APP_TOKEN;
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            } else if (attrs.type == TYPE_WALLPAPER) {
19934c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                if (token.windowType != TYPE_WALLPAPER) {
19948a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to add wallpaper window with bad token "
19954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                            + attrs.token + ".  Aborting.");
19964c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                      return WindowManagerImpl.ADD_BAD_APP_TOKEN;
19974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            win = new WindowState(this, session, client, token,
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    attachedWindow, attrs, viewVisibility);
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.mDeathRecipient == null) {
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Client has apparently died, so there is no reason to
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // continue.
20058a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Adding window client " + client.asBinder()
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " that is dead, aborting.");
20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return WindowManagerImpl.ADD_APP_EXITING;
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPolicy.adjustWindowParamsLw(win.mAttrs);
201106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            res = mPolicy.prepareAddWindowLw(win, attrs);
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (res != WindowManagerImpl.ADD_OKAY) {
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return res;
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
201646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
201700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            if (outInputChannel != null) {
201800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                String name = win.makeInputChannelName();
201900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                InputChannel[] inputChannels = InputChannel.openInputChannelPair(name);
202000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                win.mInputChannel = inputChannels[0];
202100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                inputChannels[1].transferToBinderOutParameter(outInputChannel);
202200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown
2023928e054931d357326613c78e62f4d850b7c442ffJeff Brown                mInputManager.registerInputChannel(win.mInputChannel, win.mInputWindowHandle);
202446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            }
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // From now on, no exceptions or errors allowed!
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            res = WindowManagerImpl.ADD_OKAY;
202906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20305132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            origId = Binder.clearCallingIdentity();
203106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (addToken) {
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTokenMap.put(attrs.token, token);
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.attach();
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowMap.put(client.asBinder(), win);
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (attrs.type == TYPE_APPLICATION_STARTING &&
20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    token.appWindowToken != null) {
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                token.appWindowToken.startingWindow = win;
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean imMayMove = true;
204406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (attrs.type == TYPE_INPUT_METHOD) {
20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInputMethodWindow = win;
20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                addInputMethodWindowToListLocked(win);
20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imMayMove = false;
20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (attrs.type == TYPE_INPUT_METHOD_DIALOG) {
20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInputMethodDialogs.add(win);
20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                addWindowToListInOrderLocked(win, true);
20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                adjustInputMethodDialogsLocked();
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imMayMove = false;
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                addWindowToListInOrderLocked(win, true);
205619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                if (attrs.type == TYPE_WALLPAPER) {
205719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    mLastWallpaperTimeoutTime = 0;
205819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    adjustWallpaperWindowsLocked();
205919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                } else if ((attrs.flags&FLAG_SHOW_WALLPAPER) != 0) {
20604c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    adjustWallpaperWindowsLocked();
20614c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
206306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mEnterAnimationPending = true;
206506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPolicy.getContentInsetHintLw(attrs, outContentInsets);
206706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mInTouchMode) {
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                res |= WindowManagerImpl.ADD_FLAG_IN_TOUCH_MODE;
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win == null || win.mAppToken == null || !win.mAppToken.clientHidden) {
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                res |= WindowManagerImpl.ADD_FLAG_APP_VISIBLE;
20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
207406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20752e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown            mInputMonitor.setUpdateInputWindowsNeededLw();
20762e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown
2077c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            boolean focusChanged = false;
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.canReceiveKeys()) {
20793a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                focusChanged = updateFocusedWindowLocked(UPDATE_FOCUS_WILL_ASSIGN_LAYERS,
20803a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        false /*updateInputWindows*/);
2081349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown                if (focusChanged) {
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    imMayMove = false;
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
208506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imMayMove) {
208706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                moveInputMethodWindowsIfNeededLocked(false);
20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
208906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assignLayersLocked();
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Don't do layout here, the window must call
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // relayout to be displayed, so we'll do it there.
209306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //dump();
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2096c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            if (focusChanged) {
20973a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                finishUpdateFocusedWindowAfterAssignLayersLocked(false /*updateInputWindows*/);
2098c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            }
20992e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown            mInputMonitor.updateInputWindowsLw(false /*force*/);
21003a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown
21018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (localLOGV) Slog.v(
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "New client " + client.asBinder()
21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ": window=" + win);
2104e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
210594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            if (win.isVisibleOrAdding() && updateOrientationFromAppTokensLocked(false)) {
2106e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                reportNewConfig = true;
2107e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (reportNewConfig) {
21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendNewConfiguration();
21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21135132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
211506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return res;
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
211806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeWindow(Session session, IWindow client) {
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
2121e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            WindowState win = windowForClientLocked(session, client, false);
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win == null) {
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            removeWindowLocked(session, win);
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
212806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeWindowLocked(Session session, WindowState win) {
21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21318a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (localLOGV || DEBUG_FOCUS) Slog.v(
21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Remove " + win + " client="
21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + Integer.toHexString(System.identityHashCode(
21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mClient.asBinder()))
21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + ", surface=" + win.mSurface);
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long origId = Binder.clearCallingIdentity();
2138c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
2139c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        win.disposeInputChannel();
214006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21418a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_APP_TRANSITIONS) Slog.v(
21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Remove " + win + ": mSurface=" + win.mSurface
21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " mExiting=" + win.mExiting
21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " isAnimating=" + win.isAnimating()
21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " app-animation="
21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + (win.mAppToken != null ? win.mAppToken.animation : null)
21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " inPendingTransaction="
21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + (win.mAppToken != null ? win.mAppToken.inPendingTransaction : false)
21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " mDisplayFrozen=" + mDisplayFrozen);
21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Visibility of the removed window. Will be used later to update orientation later on.
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean wasVisible = false;
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // First, see if we need to run an animation.  If we do, we have
21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // to hold off on removing the window until the animation is done.
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // If the display is frozen, just remove immediately, since the
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // animation wouldn't be seen.
2156de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn        if (win.mSurface != null && !mDisplayFrozen && mPolicy.isScreenOn()) {
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If we are not currently running the exit animation, we
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // need to see about starting one.
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wasVisible=win.isWinVisibleLw()) {
216006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int transit = WindowManagerPolicy.TRANSIT_EXIT;
21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.getAttrs().type == TYPE_APPLICATION_STARTING) {
21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    transit = WindowManagerPolicy.TRANSIT_PREVIEW_DONE;
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Try starting an animation.
21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (applyAnimationLocked(win, transit, false)) {
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mExiting = true;
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.mExiting || win.isAnimating()) {
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // The exit animation is running... wait for it!
21728a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                //Slog.i(TAG, "*** Running exit animation...");
21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mExiting = true;
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mRemoveOnExit = true;
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutNeeded = true;
21763a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
21773a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        false /*updateInputWindows*/);
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                performLayoutAndPlaceSurfacesLocked();
21792e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                mInputMonitor.updateInputWindowsLw(false /*force*/);
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.mAppToken != null) {
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mAppToken.updateReportedVisibilityLocked();
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //dump();
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.restoreCallingIdentity(origId);
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        removeWindowInnerLocked(session, win);
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Removing a visible window will effect the computed orientation
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // So just update orientation if needed.
2192c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        if (wasVisible && computeForcedAppOrientationLocked()
2193e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                != mForcedAppOrientation
219494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                && updateOrientationFromAppTokensLocked(false)) {
2195e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21973a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/);
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
220006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void removeWindowInnerLocked(Session session, WindowState win) {
2202f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        if (win.mRemoved) {
2203f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            // Nothing to do.
2204f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            return;
2205f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        }
2206f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn
2207f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        for (int i=win.mChildWindows.size()-1; i>=0; i--) {
2208f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            WindowState cwin = win.mChildWindows.get(i);
2209f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            Slog.w(TAG, "Force-removing child win " + cwin + " from container "
2210f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    + win);
2211f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            removeWindowInnerLocked(cwin.mSession, cwin);
2212f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        }
2213f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        win.mRemoved = true;
221506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mInputMethodTarget == win) {
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            moveInputMethodWindowsIfNeededLocked(false);
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
221906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
2220bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        if (false) {
2221bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn            RuntimeException e = new RuntimeException("here");
2222bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn            e.fillInStackTrace();
22238a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Removing window " + win, e);
2224bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        }
2225ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPolicy.removeWindowLw(win);
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        win.removeLocked();
22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2229f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        if (DEBUG_ADD_REMOVE) Slog.v(TAG, "removeWindowInnerLocked: " + win);
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowMap.remove(win.mClient.asBinder());
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindows.remove(win);
2232f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        mPendingRemove.remove(win);
2233dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        mWindowsChanged = true;
22348a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Final remove of window: " + win);
22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mInputMethodWindow == win) {
22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInputMethodWindow = null;
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (win.mAttrs.type == TYPE_INPUT_METHOD_DIALOG) {
22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInputMethodDialogs.remove(win);
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
224106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final WindowToken token = win.mToken;
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final AppWindowToken atoken = win.mAppToken;
2244f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Removing " + win + " from " + token);
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        token.windows.remove(win);
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (atoken != null) {
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            atoken.allAppWindows.remove(win);
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22498a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (localLOGV) Slog.v(
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "**** Removing window " + win + ": count="
22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + token.windows.size());
22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (token.windows.size() == 0) {
22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!token.explicit) {
22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTokenMap.remove(token.token);
22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (atoken != null) {
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                atoken.firstWindowDrawn = false;
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (atoken != null) {
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (atoken.startingWindow == win) {
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                atoken.startingWindow = null;
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (atoken.allAppWindows.size() == 0 && atoken.startingData != null) {
22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this is the last window and we had requested a starting
22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // transition window, well there is no point now.
22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                atoken.startingData = null;
22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (atoken.allAppWindows.size() == 1 && atoken.startingView != null) {
22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this is the last window except for a starting transition
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // window, we need to get rid of the starting transition.
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_STARTING_WINDOW) {
22718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "Schedule remove starting " + token
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + ": no more real windows");
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Message m = mH.obtainMessage(H.REMOVE_STARTING, atoken);
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mH.sendMessage(m);
22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
227806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
227919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn        if (win.mAttrs.type == TYPE_WALLPAPER) {
228019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            mLastWallpaperTimeoutTime = 0;
228119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            adjustWallpaperWindowsLocked();
228219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn        } else if ((win.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0) {
2283e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn            adjustWallpaperWindowsLocked();
2284e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn        }
2285ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mInLayout) {
22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assignLayersLocked();
22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLayoutNeeded = true;
22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            performLayoutAndPlaceSurfacesLocked();
22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.mAppToken != null) {
22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mAppToken.updateReportedVisibilityLocked();
22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2294c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
22952e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown        mInputMonitor.updateInputWindowsLw(true /*force*/);
22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    static void logSurface(WindowState w, String msg, RuntimeException where) {
2299b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        String str = "  SURFACE " + Integer.toHexString(w.hashCode())
2300b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                + ": " + msg + " / " + w.mAttrs.getTitle();
2301b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        if (where != null) {
2302b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            Slog.i(TAG, str, where);
2303b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        } else {
2304b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            Slog.i(TAG, str);
2305b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        }
2306b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn    }
2307b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
23086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void setTransparentRegionWindow(Session session, IWindow client, Region region) {
23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long origId = Binder.clearCallingIdentity();
23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mWindowMap) {
2312e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                WindowState w = windowForClientLocked(session, client, false);
23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((w != null) && (w.mSurface != null)) {
231494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    if (SHOW_TRANSACTIONS) Slog.i(TAG,
231594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                            ">>> OPEN TRANSACTION setTransparentRegion");
23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Surface.openTransaction();
23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
2318b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        if (SHOW_TRANSACTIONS) logSurface(w,
2319b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                "transparentRegionHint=" + region, null);
23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mSurface.setTransparentRegionHint(region);
23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } finally {
23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Surface.closeTransaction();
232394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        if (SHOW_TRANSACTIONS) Slog.i(TAG,
232494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                                "<<< CLOSE TRANSACTION setTransparentRegion");
23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(origId);
23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setInsetsWindow(Session session, IWindow client,
233406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy            int touchableInsets, Rect contentInsets,
2335fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            Rect visibleInsets, Region touchableRegion) {
23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long origId = Binder.clearCallingIdentity();
23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mWindowMap) {
2339e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                WindowState w = windowForClientLocked(session, client, false);
23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (w != null) {
23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mGivenInsetsPending = false;
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mGivenContentInsets.set(contentInsets);
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mGivenVisibleInsets.set(visibleInsets);
2344fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    w.mGivenTouchableRegion.set(touchableRegion);
23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mTouchableInsets = touchableInsets;
23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLayoutNeeded = true;
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    performLayoutAndPlaceSurfacesLocked();
23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(origId);
23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
235406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getWindowDisplayFrame(Session session, IWindow client,
23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Rect outDisplayFrame) {
23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
2358e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            WindowState win = windowForClientLocked(session, client, false);
23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win == null) {
23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outDisplayFrame.setEmpty();
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outDisplayFrame.set(win.mDisplayFrame);
23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2367bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen    public void setWindowWallpaperPositionLocked(WindowState window, float x, float y,
2368bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen            float xStep, float yStep) {
2369c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        if (window.mWallpaperX != x || window.mWallpaperY != y)  {
2370c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn            window.mWallpaperX = x;
2371c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn            window.mWallpaperY = y;
2372bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen            window.mWallpaperXStep = xStep;
2373bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen            window.mWallpaperYStep = yStep;
237473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn            if (updateWallpaperOffsetLocked(window, true)) {
237573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn                performLayoutAndPlaceSurfacesLocked();
2376c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn            }
2377c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn        }
2378c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn    }
2379ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
23807580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn    void wallpaperCommandComplete(IBinder window, Bundle result) {
23817580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        synchronized (mWindowMap) {
23827580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            if (mWaitingOnWallpaper != null &&
23837580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    mWaitingOnWallpaper.mClient.asBinder() == window) {
23847580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                mWaitingOnWallpaper = null;
23857580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                mWindowMap.notifyAll();
23867580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            }
23877580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        }
23887580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn    }
2389ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
23907580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn    public Bundle sendWindowWallpaperCommandLocked(WindowState window,
23917580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            String action, int x, int y, int z, Bundle extras, boolean sync) {
23927580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        if (window == mWallpaperTarget || window == mLowerWallpaperTarget
23937580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                || window == mUpperWallpaperTarget) {
23947580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            boolean doWait = sync;
23957580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            int curTokenIndex = mWallpaperTokens.size();
23967580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            while (curTokenIndex > 0) {
23977580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                curTokenIndex--;
23987580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                WindowToken token = mWallpaperTokens.get(curTokenIndex);
23997580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                int curWallpaperIndex = token.windows.size();
24007580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                while (curWallpaperIndex > 0) {
24017580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    curWallpaperIndex--;
24027580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    WindowState wallpaper = token.windows.get(curWallpaperIndex);
24037580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    try {
24047580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        wallpaper.mClient.dispatchWallpaperCommand(action,
24057580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                                x, y, z, extras, sync);
24067580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        // We only want to be synchronous with one wallpaper.
24077580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                        sync = false;
24087580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    } catch (RemoteException e) {
24097580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    }
24107580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                }
24117580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            }
2412ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
24137580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            if (doWait) {
24147580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                // XXX Need to wait for result.
24157580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            }
24167580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        }
2417ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
24187580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        return null;
24197580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn    }
2420ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int relayoutWindow(Session session, IWindow client,
24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowManager.LayoutParams attrs, int requestedWidth,
24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int requestedHeight, int viewVisibility, boolean insetsPending,
24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Rect outFrame, Rect outContentInsets, Rect outVisibleInsets,
2425694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            Configuration outConfig, Surface outSurface) {
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean displayed = false;
24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean inTouchMode;
2428e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        boolean configChanged;
2429ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato
2430ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato        // if they don't have this permission, mask out the status bar bits
2431ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato        if (attrs != null) {
2432ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato            if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR)
2433ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato                    != PackageManager.PERMISSION_GRANTED) {
2434ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato                attrs.systemUiVisibility &= ~StatusBarManager.DISABLE_MASK;
2435ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato                attrs.subtreeSystemUiVisibility &= ~StatusBarManager.DISABLE_MASK;
2436ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato            }
2437ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato        }
24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long origId = Binder.clearCallingIdentity();
243906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
2441e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            WindowState win = windowForClientLocked(session, client, false);
24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win == null) {
24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return 0;
24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mRequestedWidth = requestedWidth;
24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mRequestedHeight = requestedHeight;
24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (attrs != null) {
24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPolicy.adjustWindowParamsLw(attrs);
24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
245106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int attrChanges = 0;
24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flagChanges = 0;
24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (attrs != null) {
24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                flagChanges = win.mAttrs.flags ^= attrs.flags;
24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                attrChanges = win.mAttrs.copyFrom(attrs);
24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_LAYOUT) Slog.v(TAG, "Relayout " + win + ": " + win.mAttrs);
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((attrChanges & WindowManager.LayoutParams.ALPHA_CHANGED) != 0) {
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mAlpha = attrs.alpha;
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final boolean scaledWindow =
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ((win.mAttrs.flags & WindowManager.LayoutParams.FLAG_SCALED) != 0);
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (scaledWindow) {
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // requested{Width|Height} Surface's physical size
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // attrs.{width|height} Size on screen
24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mHScale = (attrs.width  != requestedWidth)  ?
24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        (attrs.width  / (float)requestedWidth) : 1.0f;
24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mVScale = (attrs.height != requestedHeight) ?
24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        (attrs.height / (float)requestedHeight) : 1.0f;
24759b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn            } else {
24769b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn                win.mHScale = win.mVScale = 1;
24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean imMayMove = (flagChanges&(
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM |
24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)) != 0;
248206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean focusMayChange = win.mViewVisibility != viewVisibility
24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || ((flagChanges&WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) != 0)
24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || (!win.mRelayoutCalled);
248606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
24874c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            boolean wallpaperMayMove = win.mViewVisibility != viewVisibility
24884c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    && (win.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0;
2489ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mRelayoutCalled = true;
24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int oldVisibility = win.mViewVisibility;
24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mViewVisibility = viewVisibility;
24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (viewVisibility == View.VISIBLE &&
24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (win.mAppToken == null || !win.mAppToken.clientHidden)) {
24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                displayed = !win.isVisibleLw();
24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.mExiting) {
24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mExiting = false;
24983fe3851753e3623d3c7c468efa6ee17f17f9aa74Brad Fitzpatrick                    if (win.mAnimation != null) {
24993fe3851753e3623d3c7c468efa6ee17f17f9aa74Brad Fitzpatrick                        win.mAnimation.cancel();
25003fe3851753e3623d3c7c468efa6ee17f17f9aa74Brad Fitzpatrick                        win.mAnimation = null;
25013fe3851753e3623d3c7c468efa6ee17f17f9aa74Brad Fitzpatrick                    }
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.mDestroying) {
25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mDestroying = false;
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mDestroySurface.remove(win);
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (oldVisibility == View.GONE) {
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mEnterAnimationPending = true;
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2510694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                if (displayed) {
2511694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    if (win.mSurface != null && !win.mDrawPending
2512694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            && !win.mCommitDrawPending && !mDisplayFrozen
2513694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            && mPolicy.isScreenOn()) {
2514694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        applyEnterAnimationLocked(win);
2515694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    }
2516694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    if ((win.mAttrs.flags
2517694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            & WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON) != 0) {
2518694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        if (DEBUG_VISIBILITY) Slog.v(TAG,
2519694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                "Relayout window turning screen on: " + win);
2520694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        win.mTurnOnScreen = true;
2521694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    }
2522694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    int diff = 0;
2523694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    if (win.mConfiguration != mCurConfiguration
2524694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            && (win.mConfiguration == null
2525694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                    || (diff=mCurConfiguration.diff(win.mConfiguration)) != 0)) {
2526694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        win.mConfiguration = mCurConfiguration;
2527694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        if (DEBUG_CONFIGURATION) {
2528694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            Slog.i(TAG, "Window " + win + " visible with new config: "
2529694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                    + win.mConfiguration + " / 0x"
2530694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                    + Integer.toHexString(diff));
2531694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        }
2532694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        outConfig.setTo(mCurConfiguration);
2533694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    }
253493e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                }
25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((attrChanges&WindowManager.LayoutParams.FORMAT_CHANGED) != 0) {
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // To change the format, we need to re-build the surface.
25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.destroySurfaceLocked();
25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    displayed = true;
25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Surface surface = win.createSurfaceLocked();
25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (surface != null) {
25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outSurface.copyFrom(surface);
25443b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        win.mReportDestroySurface = false;
25453b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        win.mSurfacePendingDestroy = false;
25468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (SHOW_TRANSACTIONS) Slog.i(TAG,
25470586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                "  OUT SURFACE " + outSurface + ": copied");
25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
25490586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                        // For some reason there isn't a surface.  Clear the
25500586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                        // caller's object so they see the same state.
25510586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                        outSurface.release();
25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (Exception e) {
25542e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                    mInputMonitor.updateInputWindowsLw(true /*force*/);
2555e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
25568a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Exception thrown when creating surface for client "
25570586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                             + client + " (" + win.mAttrs.getTitle() + ")",
25580586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                             e);
25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Binder.restoreCallingIdentity(origId);
25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return 0;
25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (displayed) {
25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    focusMayChange = true;
25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.mAttrs.type == TYPE_INPUT_METHOD
25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && mInputMethodWindow == null) {
25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mInputMethodWindow = win;
25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    imMayMove = true;
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2570558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                if (win.mAttrs.type == TYPE_BASE_APPLICATION
2571558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                        && win.mAppToken != null
2572558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                        && win.mAppToken.startingWindow != null) {
2573558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                    // Special handling of starting window over the base
2574558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                    // window of the app: propagate lock screen flags to it,
2575558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                    // to provide the correct semantics while starting.
2576558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                    final int mask =
2577558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
2578ef73162887943e16587b8e737b19e59348338e8cMike Lockwood                        | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
2579ef73162887943e16587b8e737b19e59348338e8cMike Lockwood                        | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON;
2580558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                    WindowManager.LayoutParams sa = win.mAppToken.startingWindow.mAttrs;
2581558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                    sa.flags = (sa.flags&~mask) | (win.mAttrs.flags&mask);
2582558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn                }
25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mEnterAnimationPending = false;
25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.mSurface != null) {
25868a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_VISIBILITY) Slog.i(TAG, "Relayout invis " + win
25873b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            + ": mExiting=" + win.mExiting
25883b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            + " mSurfacePendingDestroy=" + win.mSurfacePendingDestroy);
25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If we are not currently running the exit animation, we
25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // need to see about starting one.
25913b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    if (!win.mExiting || win.mSurfacePendingDestroy) {
25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Try starting an animation; if there isn't one, we
25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // can destroy the surface right away.
25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int transit = WindowManagerPolicy.TRANSIT_EXIT;
25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (win.getAttrs().type == TYPE_APPLICATION_STARTING) {
25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            transit = WindowManagerPolicy.TRANSIT_PREVIEW_DONE;
25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
25983b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        if (!win.mSurfacePendingDestroy && win.isWinVisibleLw() &&
25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              applyAnimationLocked(win, transit, false)) {
26003b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            focusMayChange = true;
26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            win.mExiting = true;
26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (win.isAnimating()) {
26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Currently in a hide animation... turn this into
26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // an exit.
26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            win.mExiting = true;
26066136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                        } else if (win == mWallpaperTarget) {
26076136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                            // If the wallpaper is currently behind this
26086136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                            // window, we need to change both of them inside
26096136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                            // of a transaction to avoid artifacts.
26106136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                            win.mExiting = true;
26116136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                            win.mAnimating = true;
26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (mInputMethodWindow == win) {
26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                mInputMethodWindow = null;
26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            win.destroySurfaceLocked();
26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2620ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
26213b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                if (win.mSurface == null || (win.getAttrs().flags
26223b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        & WindowManager.LayoutParams.FLAG_KEEP_SURFACE_WHILE_ANIMATING) == 0
26233b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        || win.mSurfacePendingDestroy) {
26243b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // We are being called from a local process, which
26253b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // means outSurface holds its current surface.  Ensure the
26263b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // surface object is cleared, but we don't want it actually
26273b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // destroyed at this point.
26283b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    win.mSurfacePendingDestroy = false;
26293b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    outSurface.release();
26308a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_VISIBILITY) Slog.i(TAG, "Releasing surface in: " + win);
26313b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                } else if (win.mSurface != null) {
26328a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_VISIBILITY) Slog.i(TAG,
26333b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            "Keeping surface, will report destroy: " + win);
26343b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    win.mReportDestroySurface = true;
26353b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    outSurface.copyFrom(win.mSurface);
26363b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                }
26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (focusMayChange) {
26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //System.out.println("Focus may change: " + win.mAttrs.getTitle());
26413a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                if (updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
26423a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        false /*updateInputWindows*/)) {
26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    imMayMove = false;
26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //System.out.println("Relayout " + win + ": focus=" + mCurrentFocus);
26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
264706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
2648c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            // updateFocusedWindowLocked() already assigned layers so we only need to
2649c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            // reassign them at this point if the IM window state gets shuffled
2650c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            boolean assignLayers = false;
265106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imMayMove) {
26538abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn                if (moveInputMethodWindowsIfNeededLocked(false) || displayed) {
26548abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn                    // Little hack here -- we -should- be able to rely on the
26558abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn                    // function to return true if the IME has moved and needs
26568abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn                    // its layer recomputed.  However, if the IME was hidden
26578abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn                    // and isn't actually moved in the list, its layer may be
26588abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn                    // out of data so we make sure to recompute it.
26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    assignLayers = true;
26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26624c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            if (wallpaperMayMove) {
26630586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                if ((adjustWallpaperWindowsLocked()&ADJUST_WALLPAPER_LAYERS_CHANGED) != 0) {
26644c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    assignLayers = true;
26654c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
26664c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
266706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLayoutNeeded = true;
26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mGivenInsetsPending = insetsPending;
26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assignLayers) {
26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                assignLayersLocked();
26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
267394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            configChanged = updateOrientationFromAppTokensLocked(false);
26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            performLayoutAndPlaceSurfacesLocked();
2675284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            if (displayed && win.mIsWallpaper) {
2676284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                updateWallpaperOffsetLocked(win, mDisplay.getWidth(),
267719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                        mDisplay.getHeight(), false);
2678284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            }
26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.mAppToken != null) {
26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mAppToken.updateReportedVisibilityLocked();
26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outFrame.set(win.mFrame);
26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outContentInsets.set(win.mContentInsets);
26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outVisibleInsets.set(win.mVisibleInsets);
26858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (localLOGV) Slog.v(
26869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Relayout given client " + client.asBinder()
268706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                + ", requestedWidth=" + requestedWidth
26889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", requestedHeight=" + requestedHeight
26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", viewVisibility=" + viewVisibility
26909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "\nRelayout returning frame=" + outFrame
26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", surface=" + outSurface);
26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26938a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (localLOGV || DEBUG_FOCUS) Slog.v(
26949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Relayout of " + win + ": focusMayChange=" + focusMayChange);
26959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            inTouchMode = mInTouchMode;
2697e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
26982e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown            mInputMonitor.updateInputWindowsLw(true /*force*/);
26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2701e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        if (configChanged) {
27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendNewConfiguration();
27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
270406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
270606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
27079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (inTouchMode ? WindowManagerImpl.RELAYOUT_IN_TOUCH_MODE : 0)
27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                | (displayed ? WindowManagerImpl.RELAYOUT_FIRST_TIME : 0);
27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void finishDrawingWindow(Session session, IWindow client) {
27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long origId = Binder.clearCallingIdentity();
27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
2714e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            WindowState win = windowForClientLocked(session, client, false);
27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win != null && win.finishDrawingLocked()) {
2716759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                if ((win.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0) {
2717759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    adjustWallpaperWindowsLocked();
2718759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                }
27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutNeeded = true;
27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                performLayoutAndPlaceSurfacesLocked();
27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private AttributeCache.Entry getCachedAnimations(WindowManager.LayoutParams lp) {
272708121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn        if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: layout params pkg="
27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + (lp != null ? lp.packageName : null)
27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " resId=0x" + (lp != null ? Integer.toHexString(lp.windowAnimations) : null));
27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (lp != null && lp.windowAnimations != 0) {
27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If this is a system resource, don't try to load it from the
27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // application resources.  It is nice to avoid loading application
27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // resources if we can.
27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String packageName = lp.packageName != null ? lp.packageName : "android";
27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int resId = lp.windowAnimations;
27369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((resId&0xFF000000) == 0x01000000) {
27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                packageName = "android";
27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: picked package="
27409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + packageName);
27419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return AttributeCache.instance().get(packageName, resId,
27429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.WindowAnimation);
27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
274606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
27473b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    private AttributeCache.Entry getCachedAnimations(String packageName, int resId) {
274808121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn        if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: package="
27493b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                + packageName + " resId=0x" + Integer.toHexString(resId));
27503b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        if (packageName != null) {
27513b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if ((resId&0xFF000000) == 0x01000000) {
27523b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                packageName = "android";
27533b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            }
27548a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: picked package="
27553b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    + packageName);
27563b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            return AttributeCache.instance().get(packageName, resId,
27573b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    com.android.internal.R.styleable.WindowAnimation);
27583b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        }
27593b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        return null;
27603b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    }
27613b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn
27626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void applyEnterAnimationLocked(WindowState win) {
27639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int transit = WindowManagerPolicy.TRANSIT_SHOW;
27649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (win.mEnterAnimationPending) {
27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.mEnterAnimationPending = false;
27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            transit = WindowManagerPolicy.TRANSIT_ENTER;
27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        applyAnimationLocked(win, transit, true);
27709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean applyAnimationLocked(WindowState win,
27739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int transit, boolean isEntrance) {
27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (win.mLocalAnimating && win.mAnimationIsEntrance == isEntrance) {
27759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If we are trying to apply an animation, but already running
27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // an animation of the same type, then just leave that one alone.
27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
277906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Only apply an animation if the display isn't frozen.  If it is
27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // frozen, there is no reason to animate and it can cause strange
27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // artifacts when we unfreeze the display if some different animation
27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // is running.
2784de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn        if (!mDisplayFrozen && mPolicy.isScreenOn()) {
27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int anim = mPolicy.selectAnimationLw(win, transit);
27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int attr = -1;
27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Animation a = null;
27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (anim != 0) {
27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                a = AnimationUtils.loadAnimation(mContext, anim);
27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
27919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                switch (transit) {
27929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case WindowManagerPolicy.TRANSIT_ENTER:
27939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        attr = com.android.internal.R.styleable.WindowAnimation_windowEnterAnimation;
27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case WindowManagerPolicy.TRANSIT_EXIT:
27969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        attr = com.android.internal.R.styleable.WindowAnimation_windowExitAnimation;
27979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case WindowManagerPolicy.TRANSIT_SHOW:
27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        attr = com.android.internal.R.styleable.WindowAnimation_windowShowAnimation;
28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case WindowManagerPolicy.TRANSIT_HIDE:
28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        attr = com.android.internal.R.styleable.WindowAnimation_windowHideAnimation;
28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (attr >= 0) {
28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    a = loadAnimation(win.mAttrs, attr);
28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28098a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_ANIM) Slog.v(TAG, "applyAnimation: win=" + win
28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " anim=" + anim + " attr=0x" + Integer.toHexString(attr)
28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mAnimation=" + win.mAnimation
28129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " isEntrance=" + isEntrance);
28139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (a != null) {
28149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_ANIM) {
2815b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    RuntimeException e = null;
2816b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (!HIDE_STACK_CRAWLS) {
2817b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        e = new RuntimeException();
2818b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        e.fillInStackTrace();
2819b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
28208a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "Loaded animation " + a + " for " + win, e);
28219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.setAnimation(a);
28239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mAnimationIsEntrance = isEntrance;
28249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
28269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            win.clearAnimation();
28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return win.mAnimation != null;
28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Animation loadAnimation(WindowManager.LayoutParams lp, int animAttr) {
28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int anim = 0;
28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Context context = mContext;
28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (animAttr >= 0) {
28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AttributeCache.Entry ent = getCachedAnimations(lp);
28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ent != null) {
28389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                context = ent.context;
28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                anim = ent.array.getResourceId(animAttr, 0);
28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (anim != 0) {
28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return AnimationUtils.loadAnimation(context, anim);
28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
284706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
28483b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    private Animation loadAnimation(String packageName, int resId) {
28493b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        int anim = 0;
28503b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        Context context = mContext;
28513b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        if (resId >= 0) {
28523b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            AttributeCache.Entry ent = getCachedAnimations(packageName, resId);
28533b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if (ent != null) {
28543b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                context = ent.context;
28553b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                anim = resId;
28563b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            }
28573b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        }
28583b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        if (anim != 0) {
28593b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            return AnimationUtils.loadAnimation(context, anim);
28603b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        }
28613b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        return null;
28623b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    }
28633b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn
28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean applyAnimationLocked(AppWindowToken wtoken,
28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowManager.LayoutParams lp, int transit, boolean enter) {
28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Only apply an animation if the display isn't frozen.  If it is
28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // frozen, there is no reason to animate and it can cause strange
28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // artifacts when we unfreeze the display if some different animation
28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // is running.
2870de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn        if (!mDisplayFrozen && mPolicy.isScreenOn()) {
28710a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima            Animation a;
2872d2967e261650651414faa2a0def9ac2bffd63becMitsuru Oshima            if (lp != null && (lp.flags & FLAG_COMPATIBLE_WINDOW) != 0) {
28730a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                a = new FadeInOutAnimation(enter);
28748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_ANIM) Slog.v(TAG,
28750a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        "applying FadeInOutAnimation for a window in compatibility mode");
28763b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            } else if (mNextAppTransitionPackage != null) {
28773b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                a = loadAnimation(mNextAppTransitionPackage, enter ?
28783b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        mNextAppTransitionEnter : mNextAppTransitionExit);
28790a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima            } else {
28800a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                int animAttr = 0;
28810a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                switch (transit) {
28820a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                    case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN:
28830a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        animAttr = enter
28840a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                ? com.android.internal.R.styleable.WindowAnimation_activityOpenEnterAnimation
28850a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                : com.android.internal.R.styleable.WindowAnimation_activityOpenExitAnimation;
28860a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        break;
28870a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                    case WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE:
28880a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        animAttr = enter
28890a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                ? com.android.internal.R.styleable.WindowAnimation_activityCloseEnterAnimation
28900a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                : com.android.internal.R.styleable.WindowAnimation_activityCloseExitAnimation;
28910a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        break;
28920a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                    case WindowManagerPolicy.TRANSIT_TASK_OPEN:
28930a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        animAttr = enter
28940a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                ? com.android.internal.R.styleable.WindowAnimation_taskOpenEnterAnimation
28950a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                : com.android.internal.R.styleable.WindowAnimation_taskOpenExitAnimation;
28960a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        break;
28970a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                    case WindowManagerPolicy.TRANSIT_TASK_CLOSE:
28980a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        animAttr = enter
28990a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                ? com.android.internal.R.styleable.WindowAnimation_taskCloseEnterAnimation
29000a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                : com.android.internal.R.styleable.WindowAnimation_taskCloseExitAnimation;
29010a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        break;
29020a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                    case WindowManagerPolicy.TRANSIT_TASK_TO_FRONT:
29030a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        animAttr = enter
29040a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                ? com.android.internal.R.styleable.WindowAnimation_taskToFrontEnterAnimation
29050a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                : com.android.internal.R.styleable.WindowAnimation_taskToFrontExitAnimation;
29060a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        break;
29070a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                    case WindowManagerPolicy.TRANSIT_TASK_TO_BACK:
29080a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        animAttr = enter
29095a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima                                ? com.android.internal.R.styleable.WindowAnimation_taskToBackEnterAnimation
29100a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                : com.android.internal.R.styleable.WindowAnimation_taskToBackExitAnimation;
29110a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        break;
291225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                    case WindowManagerPolicy.TRANSIT_WALLPAPER_OPEN:
291325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        animAttr = enter
291425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                ? com.android.internal.R.styleable.WindowAnimation_wallpaperOpenEnterAnimation
291525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                : com.android.internal.R.styleable.WindowAnimation_wallpaperOpenExitAnimation;
291625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        break;
291725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                    case WindowManagerPolicy.TRANSIT_WALLPAPER_CLOSE:
291825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        animAttr = enter
291925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                ? com.android.internal.R.styleable.WindowAnimation_wallpaperCloseEnterAnimation
292025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                : com.android.internal.R.styleable.WindowAnimation_wallpaperCloseExitAnimation;
292125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        break;
292225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                    case WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_OPEN:
2923f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                        animAttr = enter
292425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenEnterAnimation
292525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenExitAnimation;
2926f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                        break;
292725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                    case WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_CLOSE:
2928f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                        animAttr = enter
292925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseEnterAnimation
293025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseExitAnimation;
2931f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                        break;
29320a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                }
2933bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                a = animAttr != 0 ? loadAnimation(lp, animAttr) : null;
29348a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_ANIM) Slog.v(TAG, "applyAnimation: wtoken=" + wtoken
29350a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        + " anim=" + a
29360a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        + " animAttr=0x" + Integer.toHexString(animAttr)
29370a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        + " transit=" + transit);
29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (a != null) {
29409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_ANIM) {
2941b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    RuntimeException e = null;
2942b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (!HIDE_STACK_CRAWLS) {
2943b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        e = new RuntimeException();
2944b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        e.fillInStackTrace();
2945b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
29468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.v(TAG, "Loaded animation " + a + " for " + wtoken, e);
29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.setAnimation(a);
29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.clearAnimation();
29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return wtoken.animation != null;
29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Application Window Tokens
29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void validateAppTokens(List tokens) {
29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int v = tokens.size()-1;
29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int m = mAppTokens.size()-1;
29649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (v >= 0 && m >= 0) {
29659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = mAppTokens.get(m);
29669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken.removed) {
29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                m--;
29689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tokens.get(v) != wtoken.token) {
29718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Tokens out of sync: external is " + tokens.get(v)
29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + " @ " + v + ", internal is " + wtoken.token + " @ " + m);
29739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            v--;
29759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            m--;
29769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (v >= 0) {
29788a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "External token not found: " + tokens.get(v) + " @ " + v);
29799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            v--;
29809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (m >= 0) {
29829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = mAppTokens.get(m);
29839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!wtoken.removed) {
29848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Invalid internal token: " + wtoken.token + " @ " + m);
29859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            m--;
29879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean checkCallingPermission(String permission, String func) {
29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Quick check: if the calling permission is me, it's all okay.
29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Binder.getCallingPid() == Process.myPid()) {
29939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
299506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mContext.checkCallingPermission(permission)
29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                == PackageManager.PERMISSION_GRANTED) {
29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String msg = "Permission Denial: " + func + " from pid="
30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Binder.getCallingPid()
30029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", uid=" + Binder.getCallingUid()
30039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " requires " + permission;
30048a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        Slog.w(TAG, msg);
30059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
30069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
300706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
30089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AppWindowToken findAppWindowToken(IBinder token) {
30099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowToken wtoken = mTokenMap.get(token);
30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wtoken == null) {
30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return wtoken.appWindowToken;
30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
301506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void addWindowToken(IBinder token, int type) {
30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "addWindowToken()")) {
3019cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
302106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken wtoken = mTokenMap.get(token);
30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken != null) {
30258a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to add existing input method token: " + token);
30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            wtoken = new WindowToken(this, token, type, true);
30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTokenMap.put(token, wtoken);
30304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            if (type == TYPE_WALLPAPER) {
30314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                mWallpaperTokens.add(wtoken);
30324c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
303506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeWindowToken(IBinder token) {
30379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "removeWindowToken()")) {
3039cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
30409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long origId = Binder.clearCallingIdentity();
30439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
30449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken wtoken = mTokenMap.remove(token);
30459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken != null) {
30469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean delayed = false;
30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!wtoken.hidden) {
30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wtoken.hidden = true;
304906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int N = wtoken.windows.size();
30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean changed = false;
305206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i=0; i<N; i++) {
30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        WindowState win = wtoken.windows.get(i);
30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (win.isAnimating()) {
30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            delayed = true;
30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
305906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (win.isVisibleNow()) {
30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            applyAnimationLocked(win,
30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    WindowManagerPolicy.TRANSIT_EXIT, false);
30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            changed = true;
30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (changed) {
30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLayoutNeeded = true;
30699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        performLayoutAndPlaceSurfacesLocked();
30703a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL,
30713a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                                false /*updateInputWindows*/);
30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
307306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (delayed) {
30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mExitingTokens.add(wtoken);
30764c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    } else if (wtoken.windowType == TYPE_WALLPAPER) {
30774c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                        mWallpaperTokens.remove(wtoken);
30789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
308006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
30812e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                mInputMonitor.updateInputWindowsLw(true /*force*/);
30829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
30838a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to remove non-existing token: " + token);
30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
30879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void addAppToken(int addPos, IApplicationToken token,
30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int groupId, int requestedOrientation, boolean fullscreen) {
30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "addAppToken()")) {
3093cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3095349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
3096349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // Get the dispatching timeout here while we are not holding any locks so that it
3097349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // can be cached by the AppWindowToken.  The timeout value is used later by the
3098349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // input dispatcher in code that does hold locks.  If we did not cache the value
3099349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // here we would run the chance of introducing a deadlock between the window manager
3100349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // (which holds locks while updating the input dispatcher state) and the activity manager
3101349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // (which holds locks while querying the application token).
3102349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        long inputDispatchingTimeoutNanos;
3103349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        try {
3104349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown            inputDispatchingTimeoutNanos = token.getKeyDispatchingTimeout() * 1000000L;
3105349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        } catch (RemoteException ex) {
3106349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown            Slog.w(TAG, "Could not get dispatching timeout.", ex);
3107349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown            inputDispatchingTimeoutNanos = DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS;
3108349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        }
310906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token.asBinder());
31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken != null) {
31138a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to add existing app token: " + token);
31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            wtoken = new AppWindowToken(this, token);
3117349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown            wtoken.inputDispatchingTimeoutNanos = inputDispatchingTimeoutNanos;
31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.groupId = groupId;
31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.appFullscreen = fullscreen;
31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.requestedOrientation = requestedOrientation;
3121f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            if (DEBUG_TOKEN_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG, "addAppToken: " + wtoken);
31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAppTokens.add(addPos, wtoken);
31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTokenMap.put(token.asBinder(), wtoken);
312406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Application tokens start out hidden.
31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.hidden = true;
31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.hiddenRequested = true;
312806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //dump();
31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
313206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAppGroupId(IBinder token, int groupId) {
31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppStartingIcon()")) {
3136cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token);
31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null) {
31428a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to set group id of non-existing app token: " + token);
31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.groupId = groupId;
31469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
314806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getOrientationFromWindowsLocked() {
31509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = mWindows.size() - 1;
31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (pos >= 0) {
3152e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState wtoken = mWindows.get(pos);
31539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos--;
31549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken.mAppToken != null) {
31559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We hit an application window. so the orientation will be determined by the
31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // app window. No point in continuing further.
31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3159b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate            if (!wtoken.isVisibleLw() || !wtoken.mPolicyVisibilityAfterAnim) {
31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int req = wtoken.mAttrs.screenOrientation;
31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if((req == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) ||
31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (req == ActivityInfo.SCREEN_ORIENTATION_BEHIND)){
31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return req;
31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
317206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getOrientationFromAppTokensLocked() {
3174e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        int pos = mAppTokens.size() - 1;
3175e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        int curGroup = 0;
3176e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        int lastOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
3177e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        boolean findingBehind = false;
3178e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        boolean haveGroup = false;
3179e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        boolean lastFullscreen = false;
3180e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        while (pos >= 0) {
3181e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            AppWindowToken wtoken = mAppTokens.get(pos);
3182e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            pos--;
3183e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // if we're about to tear down this window and not seek for
3184e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // the behind activity, don't use it for orientation
3185e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            if (!findingBehind
3186e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    && (!wtoken.hidden && wtoken.hiddenRequested)) {
3187e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                continue;
3188e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
3189e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
3190e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            if (!haveGroup) {
3191e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // We ignore any hidden applications on the top.
3192e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                if (wtoken.hiddenRequested || wtoken.willBeHidden) {
3193105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    continue;
3194105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                }
3195e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                haveGroup = true;
3196e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                curGroup = wtoken.groupId;
3197e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                lastOrientation = wtoken.requestedOrientation;
3198e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            } else if (curGroup != wtoken.groupId) {
3199e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // If we have hit a new application group, and the bottom
3200e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // of the previous group didn't explicitly say to use
3201e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // the orientation behind it, and the last app was
3202e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // full screen, then we'll stick with the
3203e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // user's orientation.
3204e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                if (lastOrientation != ActivityInfo.SCREEN_ORIENTATION_BEHIND
3205e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                        && lastFullscreen) {
3206e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    return lastOrientation;
3207e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                }
3208e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
3209e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            int or = wtoken.requestedOrientation;
3210e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // If this application is fullscreen, and didn't explicitly say
3211e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // to use the orientation behind it, then just take whatever
3212e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // orientation it has and ignores whatever is under it.
3213e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            lastFullscreen = wtoken.appFullscreen;
3214e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            if (lastFullscreen
3215e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    && or != ActivityInfo.SCREEN_ORIENTATION_BEHIND) {
3216e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                return or;
3217e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
3218e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // If this application has requested an explicit orientation,
3219e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // then use it.
3220e5439f228f603f60febe058f633d91d5af2fff76Dianne Hackborn            if (or != ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
3221e5439f228f603f60febe058f633d91d5af2fff76Dianne Hackborn                    && or != ActivityInfo.SCREEN_ORIENTATION_BEHIND) {
3222e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                return or;
3223e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
3224e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            findingBehind |= (or == ActivityInfo.SCREEN_ORIENTATION_BEHIND);
3225e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        }
3226e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
32279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
322806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Configuration updateOrientationFromAppTokens(
3230105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            Configuration currentConfig, IBinder freezeThisOneIfNeeded) {
3231cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
3232cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn                "updateOrientationFromAppTokens()")) {
3233cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
3234cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn        }
3235ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
3236e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        Configuration config = null;
32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long ident = Binder.clearCallingIdentity();
3238e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
324094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            if (updateOrientationFromAppTokensLocked(false)) {
3241e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                if (freezeThisOneIfNeeded != null) {
3242e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    AppWindowToken wtoken = findAppWindowToken(
3243e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                            freezeThisOneIfNeeded);
3244e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    if (wtoken != null) {
3245e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                        startAppFreezingScreenLocked(wtoken,
3246e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                                ActivityInfo.CONFIG_ORIENTATION);
3247e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    }
3248e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                }
3249e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                config = computeNewConfigurationLocked();
3250e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
3251e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            } else if (currentConfig != null) {
3252e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                // No obvious action we need to take, but if our current
32530920ba5ef14379c773cb3df54fd91b25de2e51abCasey Burkhardt                // state mismatches the activity manager's, update it,
32540920ba5ef14379c773cb3df54fd91b25de2e51abCasey Burkhardt                // disregarding font scale, which should remain set to
32550920ba5ef14379c773cb3df54fd91b25de2e51abCasey Burkhardt                // the value of the previous configuration.
3256e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                mTempConfiguration.setToDefaults();
32570920ba5ef14379c773cb3df54fd91b25de2e51abCasey Burkhardt                mTempConfiguration.fontScale = currentConfig.fontScale;
3258e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                if (computeNewConfigurationLocked(mTempConfiguration)) {
3259e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    if (currentConfig.diff(mTempConfiguration) != 0) {
3260e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                        mWaitingForConfig = true;
3261e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                        mLayoutNeeded = true;
326294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        startFreezingDisplayLocked(false);
3263e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                        config = new Configuration(mTempConfiguration);
3264e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    }
3265e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                }
3266bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn            }
32679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3268e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
3269e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        Binder.restoreCallingIdentity(ident);
32709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return config;
32719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
327206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
32739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
3274e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * Determine the new desired orientation of the display, returning
3275e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * a non-null new Configuration if it has changed from the current
3276e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * orientation.  IF TRUE IS RETURNED SOMEONE MUST CALL
3277e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * setNewConfiguration() TO TELL THE WINDOW MANAGER IT CAN UNFREEZE THE
3278e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * SCREEN.  This will typically be done for you if you call
3279e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * sendNewConfiguration().
3280e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     *
32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The orientation is computed from non-application windows first. If none of
32829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the non-application windows specify orientation, the orientation is computed from
328306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     * application tokens.
32849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.IWindowManager#updateOrientationFromAppTokens(
32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * android.os.IBinder)
32869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
328794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn    boolean updateOrientationFromAppTokensLocked(boolean inTransaction) {
328894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn        if (mDisplayFrozen || mOpeningApps.size() > 0 || mClosingApps.size() > 0) {
3289b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate            // If the display is frozen, some activities may be in the middle
3290b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate            // of restarting, and thus have removed their old window.  If the
3291b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate            // window has the flag to hide the lock screen, then the lock screen
3292b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate            // can re-appear and inflict its own orientation on us.  Keep the
3293b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate            // orientation stable until this all settles down.
3294b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate            return false;
3295b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        }
3296b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate
32979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean changed = false;
32989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long ident = Binder.clearCallingIdentity();
32999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3300c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            int req = computeForcedAppOrientationLocked();
330106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
33029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (req != mForcedAppOrientation) {
33039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mForcedAppOrientation = req;
33049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //send a message to Policy indicating orientation change to take
33059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //action like disabling/enabling sensors etc.,
3306c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                mPolicy.setCurrentOrientationLw(req);
3307e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                if (setRotationUncheckedLocked(WindowManagerPolicy.USE_LAST_ROTATION,
330894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        mLastRotationFlags | Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE,
330994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        inTransaction)) {
3310e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    changed = true;
33119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
33129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3313105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
3314e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            return changed;
33159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
33169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(ident);
33179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
331906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3320c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    int computeForcedAppOrientationLocked() {
3321c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        int req = getOrientationFromWindowsLocked();
3322c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        if (req == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) {
3323c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project            req = getOrientationFromAppTokensLocked();
3324c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        }
3325c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        return req;
3326c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    }
332706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3328e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    public void setNewConfiguration(Configuration config) {
3329e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
3330e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                "setNewConfiguration()")) {
3331e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
3332e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        }
3333e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
3334e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        synchronized(mWindowMap) {
3335e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            mCurConfiguration = new Configuration(config);
3336e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            mWaitingForConfig = false;
3337e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            performLayoutAndPlaceSurfacesLocked();
3338e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        }
3339e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    }
3340e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
33419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAppOrientation(IApplicationToken token, int requestedOrientation) {
33429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
33439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppOrientation()")) {
3344cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
33459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
334606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
33479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
33489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token.asBinder());
33499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null) {
33508a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to set orientation of non-existing app token: " + token);
33519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
33529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
335306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
33549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.requestedOrientation = requestedOrientation;
33559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
335706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
33589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getAppOrientation(IApplicationToken token) {
33599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
33609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token.asBinder());
33619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null) {
33629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
33639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
336406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
33659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return wtoken.requestedOrientation;
33669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
336806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
33699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setFocusedApp(IBinder token, boolean moveFocusNow) {
33709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
33719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setFocusedApp()")) {
3372cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
33739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
33769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean changed = false;
33779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token == null) {
33788a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_FOCUS) Slog.v(TAG, "Clearing focused app, was " + mFocusedApp);
33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                changed = mFocusedApp != null;
33809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFocusedApp = null;
338100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                if (changed) {
338200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    mInputMonitor.setFocusedAppLw(null);
3383349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown                }
33849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AppWindowToken newFocus = findAppWindowToken(token);
33869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (newFocus == null) {
33878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Attempted to set focus to non-existing app token: " + token);
33889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
33899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
33909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                changed = mFocusedApp != newFocus;
33919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFocusedApp = newFocus;
33928a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_FOCUS) Slog.v(TAG, "Set focused app to: " + mFocusedApp);
339300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                if (changed) {
339400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    mInputMonitor.setFocusedAppLw(newFocus);
3395349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown                }
33969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (moveFocusNow && changed) {
33999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final long origId = Binder.clearCallingIdentity();
34003a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/);
34019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.restoreCallingIdentity(origId);
34029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34067da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn    public void prepareAppTransition(int transit, boolean alwaysKeepCurrent) {
34079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
34089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "prepareAppTransition()")) {
3409cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
34109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
341106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
34129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
34138a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_APP_TRANSITIONS) Slog.v(
34149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    TAG, "Prepare app transition: transit=" + transit
34159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mNextAppTransition=" + mNextAppTransition);
3416b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn            if (!mDisplayFrozen && mPolicy.isScreenOn()) {
3417bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET
3418bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                        || mNextAppTransition == WindowManagerPolicy.TRANSIT_NONE) {
34199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNextAppTransition = transit;
34207da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                } else if (!alwaysKeepCurrent) {
34217da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    if (transit == WindowManagerPolicy.TRANSIT_TASK_OPEN
34227da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            && mNextAppTransition == WindowManagerPolicy.TRANSIT_TASK_CLOSE) {
34237da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        // Opening a new task always supersedes a close for the anim.
34247da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        mNextAppTransition = transit;
34257da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    } else if (transit == WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN
34267da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                            && mNextAppTransition == WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE) {
34277da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        // Opening a new activity always supersedes a close for the anim.
34287da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                        mNextAppTransition = transit;
34297da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn                    }
34309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppTransitionReady = false;
34329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppTransitionTimeout = false;
34339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStartingIconInTransition = false;
34349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSkipAppTransitionAnimation = false;
34359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mH.removeMessages(H.APP_TRANSITION_TIMEOUT);
34369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mH.sendMessageDelayed(mH.obtainMessage(H.APP_TRANSITION_TIMEOUT),
34379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        5000);
34389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getPendingAppTransition() {
34439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mNextAppTransition;
34449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
344506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
34463b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    public void overridePendingAppTransition(String packageName,
34473b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            int enterAnim, int exitAnim) {
34488b571a817cc953ce96750f440645f104c7f55157Dianne Hackborn        if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
34493b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            mNextAppTransitionPackage = packageName;
34503b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            mNextAppTransitionEnter = enterAnim;
34513b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            mNextAppTransitionExit = exitAnim;
34523b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        }
34533b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn    }
3454ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void executeAppTransition() {
34569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
34579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "executeAppTransition()")) {
3458cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
34599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
346006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
34619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
34623b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if (DEBUG_APP_TRANSITIONS) {
34633b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                RuntimeException e = new RuntimeException("here");
34643b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                e.fillInStackTrace();
34658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Execute app transition: mNextAppTransition="
34663b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        + mNextAppTransition, e);
34673b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            }
3468bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn            if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
34699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppTransitionReady = true;
34709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final long origId = Binder.clearCallingIdentity();
34719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                performLayoutAndPlaceSurfacesLocked();
34729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.restoreCallingIdentity(origId);
34739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAppStartingWindow(IBinder token, String pkg,
34789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int theme, CharSequence nonLocalizedLabel, int labelRes, int icon,
34797eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn            int windowFlags, IBinder transferFrom, boolean createIfNeeded) {
34809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
34819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppStartingIcon()")) {
3482cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
34839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
34868a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_STARTING_WINDOW) Slog.v(
34879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    TAG, "setAppStartingIcon: token=" + token + " pkg=" + pkg
34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " transferFrom=" + transferFrom);
348906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
34909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token);
34919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null) {
34928a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to set icon of non-existing app token: " + token);
34939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
34949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If the display is frozen, we won't do anything until the
34979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // actual window is displayed so there is no reason to put in
34989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // the starting window.
3499de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn            if (mDisplayFrozen || !mPolicy.isScreenOn()) {
35009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
35019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
350206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
35039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken.startingData != null) {
35049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
35059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
350606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
35079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (transferFrom != null) {
35089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AppWindowToken ttoken = findAppWindowToken(transferFrom);
35099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ttoken != null) {
35109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowState startingWindow = ttoken.startingWindow;
35119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (startingWindow != null) {
35129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mStartingIconInTransition) {
35139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // In this case, the starting icon has already
35149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // been displayed, so start letting windows get
35159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // shown immediately without any more transitions.
35169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mSkipAppTransitionAnimation = true;
35179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
35188a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_STARTING_WINDOW) Slog.v(TAG,
35199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Moving existing starting from " + ttoken
35209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " to " + wtoken);
35219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        final long origId = Binder.clearCallingIdentity();
352206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
35239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Transfer the starting window over to the new
35249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // token.
35259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wtoken.startingData = ttoken.startingData;
35269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wtoken.startingView = ttoken.startingView;
35279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wtoken.startingWindow = startingWindow;
35289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.startingData = null;
35299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.startingView = null;
35309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.startingWindow = null;
35319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.startingMoved = true;
35329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        startingWindow.mToken = wtoken;
3533ef49c57bdcdb6c808870570c205434b002431c37Dianne Hackborn                        startingWindow.mRootToken = wtoken;
35349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        startingWindow.mAppToken = wtoken;
3535f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                        if (DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG,
35369bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                                "Removing starting window: " + startingWindow);
35379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mWindows.remove(startingWindow);
3538dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                        mWindowsChanged = true;
3539f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                        if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Removing starting " + startingWindow
3540f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                                + " from " + ttoken);
35419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.windows.remove(startingWindow);
35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.allAppWindows.remove(startingWindow);
35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        addWindowToListInOrderLocked(startingWindow, true);
354406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Propagate other interesting state between the
35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // tokens.  If the old token is displayed, we should
35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // immediately force the new one to be displayed.  If
35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // it is animating, we need to move that animation to
35499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // the new one.
35509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (ttoken.allDrawn) {
35519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.allDrawn = true;
35529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
35539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (ttoken.firstWindowDrawn) {
35549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.firstWindowDrawn = true;
35559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
35569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!ttoken.hidden) {
35579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.hidden = false;
35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.hiddenRequested = false;
35599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.willBeHidden = false;
35609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
35619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (wtoken.clientHidden != ttoken.clientHidden) {
35629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.clientHidden = ttoken.clientHidden;
35639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.sendAppVisibilityToClients();
35649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
35659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (ttoken.animation != null) {
35669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.animation = ttoken.animation;
35679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.animating = ttoken.animating;
35689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.animLayerAdjustment = ttoken.animLayerAdjustment;
35699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ttoken.animation = null;
35709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ttoken.animLayerAdjustment = 0;
35719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.updateLayers();
35729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ttoken.updateLayers();
35739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
357406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
35753a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
35763a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                                true /*updateInputWindows*/);
35779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLayoutNeeded = true;
35789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        performLayoutAndPlaceSurfacesLocked();
35799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Binder.restoreCallingIdentity(origId);
35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return;
35819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (ttoken.startingData != null) {
35829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // The previous app was getting ready to show a
35839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // starting window, but hasn't yet done so.  Steal it!
35848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_STARTING_WINDOW) Slog.v(TAG,
35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Moving pending starting from " + ttoken
35869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " to " + wtoken);
35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wtoken.startingData = ttoken.startingData;
35889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.startingData = null;
35899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ttoken.startingMoved = true;
35909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Message m = mH.obtainMessage(H.ADD_STARTING, wtoken);
35919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Note: we really want to do sendMessageAtFrontOfQueue() because we
35929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // want to process the message ASAP, before any other queued
35939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // messages.
35949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mH.sendMessageAtFrontOfQueue(m);
35959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return;
35969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
35979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // There is no existing starting window, and the caller doesn't
36019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // want us to create one, so that's it!
36029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!createIfNeeded) {
36039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
36049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
360506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3606284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            // If this is a translucent or wallpaper window, then don't
3607284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            // show a starting window -- the current effect (a full-screen
3608284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            // opaque starting window that fades away to the real contents
3609284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            // when it is ready) does not work for this.
3610284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            if (theme != 0) {
3611284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                AttributeCache.Entry ent = AttributeCache.instance().get(pkg, theme,
3612284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        com.android.internal.R.styleable.Window);
3613284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                if (ent.array.getBoolean(
3614284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        com.android.internal.R.styleable.Window_windowIsTranslucent, false)) {
3615284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    return;
3616284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                }
3617284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                if (ent.array.getBoolean(
36186136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                        com.android.internal.R.styleable.Window_windowIsFloating, false)) {
36196136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                    return;
36206136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                }
36216136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                if (ent.array.getBoolean(
3622284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                        com.android.internal.R.styleable.Window_windowShowWallpaper, false)) {
3623284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    return;
3624284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                }
3625284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            }
3626ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
36279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStartingIconInTransition = true;
36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.startingData = new StartingData(
36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pkg, theme, nonLocalizedLabel,
36307eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                    labelRes, icon, windowFlags);
36319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Message m = mH.obtainMessage(H.ADD_STARTING, wtoken);
36329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Note: we really want to do sendMessageAtFrontOfQueue() because we
36339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // want to process the message ASAP, before any other queued
36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // messages.
36359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendMessageAtFrontOfQueue(m);
36369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAppWillBeHidden(IBinder token) {
36409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
36419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppWillBeHidden()")) {
3642cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
36439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AppWindowToken wtoken;
36469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
36489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken = findAppWindowToken(token);
36499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null) {
36508a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to set will be hidden of non-existing app token: " + token);
36519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
36529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.willBeHidden = true;
36549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
365606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
36579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean setTokenVisibilityLocked(AppWindowToken wtoken, WindowManager.LayoutParams lp,
36589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean visible, int transit, boolean performLayout) {
36599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean delayed = false;
36609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wtoken.clientHidden == visible) {
36629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.clientHidden = !visible;
36639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.sendAppVisibilityToClients();
36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
366506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
36669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        wtoken.willBeHidden = false;
36679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wtoken.hidden == visible) {
36689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = wtoken.allAppWindows.size();
36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean changed = false;
36708a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_APP_TRANSITIONS) Slog.v(
36719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Changing app " + wtoken + " hidden=" + wtoken.hidden
36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " performLayout=" + performLayout);
367306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
36749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean runningAppAnimation = false;
367506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
3676bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn            if (transit != WindowManagerPolicy.TRANSIT_UNSET) {
36779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wtoken.animation == sDummyAnimation) {
36789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wtoken.animation = null;
36799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                applyAnimationLocked(wtoken, lp, transit, visible);
36819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                changed = true;
36829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wtoken.animation != null) {
36839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    delayed = runningAppAnimation = true;
36849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
368606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
36879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
36889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState win = wtoken.allAppWindows.get(i);
36899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win == wtoken.startingWindow) {
36909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
36919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.isAnimating()) {
36949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    delayed = true;
36959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
369606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
36978a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                //Slog.i(TAG, "Window " + win + ": vis=" + win.isVisible());
36989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //win.dump("  ");
36999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (visible) {
37009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!win.isVisibleNow()) {
37019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!runningAppAnimation) {
37029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            applyAnimationLocked(win,
37039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    WindowManagerPolicy.TRANSIT_ENTER, true);
37049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
37059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        changed = true;
37069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (win.isVisibleNow()) {
37089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!runningAppAnimation) {
37099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        applyAnimationLocked(win,
37109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                WindowManagerPolicy.TRANSIT_EXIT, false);
37119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    changed = true;
37139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.hidden = wtoken.hiddenRequested = !visible;
37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!visible) {
37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                unsetAppFreezingScreenLocked(wtoken, true, true);
37199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
37209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If we are being set visible, and the starting window is
37219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // not yet displayed, then make sure it doesn't get displayed.
37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState swin = wtoken.startingWindow;
37239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (swin != null && (swin.mDrawPending
37249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || swin.mCommitDrawPending)) {
37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    swin.mPolicyVisibility = false;
37269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    swin.mPolicyVisibilityAfterAnim = false;
37279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 }
37289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
372906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
37308a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "setTokenVisibilityLocked: " + wtoken
37319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + ": hidden=" + wtoken.hidden + " hiddenRequested="
37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + wtoken.hiddenRequested);
373306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
37349b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn            if (changed) {
37359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutNeeded = true;
37363a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                mInputMonitor.setUpdateInputWindowsNeededLw();
37379b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn                if (performLayout) {
37383a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
37393a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                            false /*updateInputWindows*/);
37409b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn                    performLayoutAndPlaceSurfacesLocked();
37419b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn                }
37422e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                mInputMonitor.updateInputWindowsLw(false /*force*/);
37439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wtoken.animation != null) {
37479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            delayed = true;
37489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
374906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
37509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return delayed;
37519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAppVisibility(IBinder token, boolean visible) {
37549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
37559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppVisibility()")) {
3756cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
37579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AppWindowToken wtoken;
37609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
37629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken = findAppWindowToken(token);
37639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null) {
37648a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to set visibility of non-existing app token: " + token);
37659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
37669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_APP_TRANSITIONS || DEBUG_ORIENTATION) {
3769b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                RuntimeException e = null;
3770b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (!HIDE_STACK_CRAWLS) {
3771b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    e = new RuntimeException();
3772b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    e.fillInStackTrace();
3773b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                }
37748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.v(TAG, "setAppVisibility(" + token + ", " + visible
37759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + "): mNextAppTransition=" + mNextAppTransition
37769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " hidden=" + wtoken.hidden
37779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " hiddenRequested=" + wtoken.hiddenRequested, e);
37789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
377906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
37809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If we are preparing an app transition, then delay changing
37819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // the visibility of this token until we execute that transition.
3782b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn            if (!mDisplayFrozen && mPolicy.isScreenOn()
3783b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                    && mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
37849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Already in requested state, don't do anything more.
37859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wtoken.hiddenRequested != visible) {
37869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
37879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.hiddenRequested = !visible;
378906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
37908a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_APP_TRANSITIONS) Slog.v(
37919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        TAG, "Setting dummy animation on: " + wtoken);
37929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.setDummyAnimation();
37939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOpeningApps.remove(wtoken);
37949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mClosingApps.remove(wtoken);
3795a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                wtoken.waitingToShow = wtoken.waitingToHide = false;
37969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.inPendingTransaction = true;
37979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (visible) {
37989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mOpeningApps.add(wtoken);
37999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wtoken.startingDisplayed = false;
38009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    wtoken.startingMoved = false;
3801ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
3802195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    // If the token is currently hidden (should be the
3803195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    // common case), then we need to set up to wait for
3804195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    // its windows to be ready.
3805195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    if (wtoken.hidden) {
3806195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                        wtoken.allDrawn = false;
3807195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                        wtoken.waitingToShow = true;
3808ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
3809195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                        if (wtoken.clientHidden) {
3810195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            // In the case where we are making an app visible
3811195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            // but holding off for a transition, we still need
3812195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            // to tell the client to make its windows visible so
3813195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            // they get drawn.  Otherwise, we will wait on
3814195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            // performing the transition until all windows have
3815195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            // been drawn, they never will be, and we are sad.
3816195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            wtoken.clientHidden = false;
3817195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                            wtoken.sendAppVisibilityToClients();
3818195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                        }
38199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
38209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
38219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mClosingApps.add(wtoken);
3822ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
3823195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    // If the token is currently visible (should be the
3824195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    // common case), then set up to wait for it to be hidden.
3825195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    if (!wtoken.hidden) {
3826195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                        wtoken.waitingToHide = true;
3827195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn                    }
38289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
38309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
383106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
38329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long origId = Binder.clearCallingIdentity();
3833bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn            setTokenVisibilityLocked(wtoken, null, visible, WindowManagerPolicy.TRANSIT_UNSET, true);
38349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wtoken.updateReportedVisibilityLocked();
38359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(origId);
38369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void unsetAppFreezingScreenLocked(AppWindowToken wtoken,
38409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean unfreezeSurfaceNow, boolean force) {
38419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (wtoken.freezingScreen) {
38428a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_ORIENTATION) Slog.v(TAG, "Clear freezing of " + wtoken
38439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " force=" + force);
38449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = wtoken.allAppWindows.size();
38459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean unfrozeWindows = false;
38469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
38479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState w = wtoken.allAppWindows.get(i);
38489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (w.mAppFreezing) {
38499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mAppFreezing = false;
38509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (w.mSurface != null && !w.mOrientationChanging) {
38519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mOrientationChanging = true;
38529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
38539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    unfrozeWindows = true;
38549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (force || unfrozeWindows) {
38578a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_ORIENTATION) Slog.v(TAG, "No longer freezing: " + wtoken);
38589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.freezingScreen = false;
38599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppsFreezingScreen--;
38609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (unfreezeSurfaceNow) {
38629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (unfrozeWindows) {
38639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLayoutNeeded = true;
38649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    performLayoutAndPlaceSurfacesLocked();
38659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3866e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                stopFreezingDisplayLocked();
38679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
387006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
38719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startAppFreezingScreenLocked(AppWindowToken wtoken,
38729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int configChanges) {
38739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_ORIENTATION) {
3874b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            RuntimeException e = null;
3875b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            if (!HIDE_STACK_CRAWLS) {
3876b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                e = new RuntimeException();
3877b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                e.fillInStackTrace();
3878b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            }
38798a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.i(TAG, "Set freezing of " + wtoken.appToken
38809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ": hidden=" + wtoken.hidden + " freezing="
38819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + wtoken.freezingScreen, e);
38829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!wtoken.hiddenRequested) {
38849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!wtoken.freezingScreen) {
38859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.freezingScreen = true;
38869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppsFreezingScreen++;
38879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mAppsFreezingScreen == 1) {
388894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    startFreezingDisplayLocked(false);
38899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mH.removeMessages(H.APP_FREEZE_TIMEOUT);
38909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mH.sendMessageDelayed(mH.obtainMessage(H.APP_FREEZE_TIMEOUT),
38919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            5000);
38929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = wtoken.allAppWindows.size();
38959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
38969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState w = wtoken.allAppWindows.get(i);
38979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mAppFreezing = true;
38989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
390106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
39029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startAppFreezingScreen(IBinder token, int configChanges) {
39039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
39049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppFreezingScreen()")) {
3905cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
39069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
3909b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn            if (configChanges == 0 && !mDisplayFrozen && mPolicy.isScreenOn()) {
39108a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_ORIENTATION) Slog.v(TAG, "Skipping set freeze of " + token);
39119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
39129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
391306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
39149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token);
39159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null || wtoken.appToken == null) {
39168a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to freeze screen with non-existing app token: " + wtoken);
39179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
39189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long origId = Binder.clearCallingIdentity();
39209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            startAppFreezingScreenLocked(wtoken, configChanges);
39219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(origId);
39229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
392406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
39259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void stopAppFreezingScreen(IBinder token, boolean force) {
39269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
39279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAppFreezingScreen()")) {
3928cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
39299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
39329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken wtoken = findAppWindowToken(token);
39339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null || wtoken.appToken == null) {
39349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
39359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long origId = Binder.clearCallingIdentity();
39378a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_ORIENTATION) Slog.v(TAG, "Clear freezing of " + token
39389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ": hidden=" + wtoken.hidden + " freezing=" + wtoken.freezingScreen);
39399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unsetAppFreezingScreenLocked(wtoken, true, force);
39409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(origId);
39419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
394306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
39449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeAppToken(IBinder token) {
39459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
39469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "removeAppToken()")) {
3947cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
39489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AppWindowToken wtoken = null;
39519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AppWindowToken startingToken = null;
39529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean delayed = false;
39539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long origId = Binder.clearCallingIdentity();
39559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
39569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken basewtoken = mTokenMap.remove(token);
39579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (basewtoken != null && (wtoken=basewtoken.appWindowToken) != null) {
39588a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Removing app token: " + wtoken);
3959bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                delayed = setTokenVisibilityLocked(wtoken, null, false, WindowManagerPolicy.TRANSIT_UNSET, true);
39609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.inPendingTransaction = false;
39619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOpeningApps.remove(wtoken);
3962a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                wtoken.waitingToShow = false;
39639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mClosingApps.contains(wtoken)) {
39649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    delayed = true;
3965bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                } else if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
39669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mClosingApps.add(wtoken);
3967a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    wtoken.waitingToHide = true;
39689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    delayed = true;
39699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
39708a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_APP_TRANSITIONS) Slog.v(
39719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        TAG, "Removing app " + wtoken + " delayed=" + delayed
39729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " animation=" + wtoken.animation
39739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " animating=" + wtoken.animating);
39749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (delayed) {
39759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // set the token aside because it has an active animation to be finished
3976f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG,
3977f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            "removeAppToken make exiting: " + wtoken);
39789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mExitingAppTokens.add(wtoken);
39799bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                } else {
39809bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    // Make sure there is no animation running on this token,
39819bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    // so any windows associated with it will be removed as
39829bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    // soon as their animations are complete
39839bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    wtoken.animation = null;
39849bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    wtoken.animating = false;
39859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3986f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG,
3987f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                        "removeAppToken: " + wtoken);
39889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppTokens.remove(wtoken);
39899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.removed = true;
39909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wtoken.startingData != null) {
39919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    startingToken = wtoken;
39929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
39939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                unsetAppFreezingScreenLocked(wtoken, true, true);
39949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mFocusedApp == wtoken) {
39958a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_FOCUS) Slog.v(TAG, "Removing focused app token:" + wtoken);
39969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mFocusedApp = null;
39973a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/);
399800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    mInputMonitor.setFocusedAppLw(null);
39999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
40009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
40018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempted to remove non-existing app token: " + token);
40029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
400306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
40049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!delayed && wtoken != null) {
40059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wtoken.updateReportedVisibilityLocked();
40069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
40099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (startingToken != null) {
40118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Schedule remove starting "
40129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + startingToken + ": app token removed");
40139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Message m = mH.obtainMessage(H.REMOVE_STARTING, startingToken);
40149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendMessage(m);
40159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean tmpRemoveAppWindowsLocked(WindowToken token) {
40199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NW = token.windows.size();
40209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<NW; i++) {
40219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowState win = token.windows.get(i);
40228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Tmp removing app window " + win);
40239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindows.remove(win);
4024dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            mWindowsChanged = true;
40259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int j = win.mChildWindows.size();
40269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (j > 0) {
40279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                j--;
4028e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState cwin = win.mChildWindows.get(j);
40298a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG,
4030bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                        "Tmp removing child window " + cwin);
4031bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                mWindows.remove(cwin);
40329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NW > 0;
40359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dumpAppTokensLocked() {
40389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=mAppTokens.size()-1; i>=0; i--) {
40398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.v(TAG, "  #" + i + ": " + mAppTokens.get(i).token);
40409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
404206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
40439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dumpWindowsLocked() {
40449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=mWindows.size()-1; i>=0; i--) {
40458a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.v(TAG, "  #" + i + ": " + mWindows.get(i));
40469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
404806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
40499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int findWindowOffsetLocked(int tokenPos) {
40509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NW = mWindows.size();
40519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (tokenPos >= mAppTokens.size()) {
40539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int i = NW;
40549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (i > 0) {
40559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
4056e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState win = mWindows.get(i);
40579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (win.getAppToken() != null) {
40589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return i+1;
40599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
40609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (tokenPos > 0) {
40649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Find the first app token below the new position that has
40659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // a window displayed.
40669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final AppWindowToken wtoken = mAppTokens.get(tokenPos-1);
40678a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_REORDER) Slog.v(TAG, "Looking for lower windows @ "
40689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + tokenPos + " -- " + wtoken.token);
4069a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            if (wtoken.sendingToBottom) {
40708a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_REORDER) Slog.v(TAG,
4071a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        "Skipping token -- currently sending to bottom");
4072a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                tokenPos--;
4073a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                continue;
4074a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
40759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int i = wtoken.windows.size();
40769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (i > 0) {
40779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
40789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState win = wtoken.windows.get(i);
40799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int j = win.mChildWindows.size();
40809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (j > 0) {
40819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    j--;
4082e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    WindowState cwin = win.mChildWindows.get(j);
4083a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    if (cwin.mSubLayer >= 0) {
40849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int pos=NW-1; pos>=0; pos--) {
40859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (mWindows.get(pos) == cwin) {
40868a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_REORDER) Slog.v(TAG,
40879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "Found child win @" + (pos+1));
40889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                return pos+1;
40899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
40909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
40919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
40929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
40939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int pos=NW-1; pos>=0; pos--) {
40949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mWindows.get(pos) == win) {
40958a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_REORDER) Slog.v(TAG, "Found win @" + (pos+1));
40969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return pos+1;
40979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
40989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
40999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            tokenPos--;
41019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
41049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final int reAddWindowLocked(int index, WindowState win) {
41079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NCW = win.mChildWindows.size();
41089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean added = false;
41099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int j=0; j<NCW; j++) {
4110e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState cwin = win.mChildWindows.get(j);
41119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!added && cwin.mSubLayer >= 0) {
41128a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding child window at "
4113bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                        + index + ": " + cwin);
4114f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                win.mRebuilding = false;
41159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindows.add(index, win);
41169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                index++;
41179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                added = true;
41189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41198a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding window at "
4120bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                    + index + ": " + cwin);
4121f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            cwin.mRebuilding = false;
41229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindows.add(index, cwin);
41239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index++;
41249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!added) {
41268a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding window at "
4127bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                    + index + ": " + win);
4128f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            win.mRebuilding = false;
41299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindows.add(index, win);
41309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index++;
41319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4132dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        mWindowsChanged = true;
41339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return index;
41349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
413506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
41369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final int reAddAppWindowsLocked(int index, WindowToken token) {
41379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NW = token.windows.size();
41389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<NW; i++) {
41399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index = reAddWindowLocked(index, token.windows.get(i));
41409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return index;
41429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void moveAppToken(int index, IBinder token) {
41459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
41469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "moveAppToken()")) {
4147cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
41489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
41518a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_REORDER) Slog.v(TAG, "Initial app tokens:");
41529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_REORDER) dumpAppTokensLocked();
41539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final AppWindowToken wtoken = findAppWindowToken(token);
4154f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            if (DEBUG_TOKEN_MOVEMENT || DEBUG_REORDER) Slog.v(TAG,
4155f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    "Start moving token " + wtoken + " initially at "
4156f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    + mAppTokens.indexOf(wtoken));
41579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wtoken == null || !mAppTokens.remove(wtoken)) {
41588a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempting to reorder token that doesn't exist: "
41599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + token + " (" + wtoken + ")");
41609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
41619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAppTokens.add(index, wtoken);
41638a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_REORDER) Slog.v(TAG, "Moved " + token + " to " + index + ":");
4164f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            else if (DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, "Moved " + token + " to " + index);
41659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_REORDER) dumpAppTokensLocked();
416606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
41679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long origId = Binder.clearCallingIdentity();
41688a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_REORDER) Slog.v(TAG, "Removing windows in " + token + ":");
41699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_REORDER) dumpWindowsLocked();
41709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tmpRemoveAppWindowsLocked(wtoken)) {
41718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_REORDER) Slog.v(TAG, "Adding windows back in:");
41729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_REORDER) dumpWindowsLocked();
41739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reAddAppWindowsLocked(findWindowOffsetLocked(index), wtoken);
41748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_REORDER) Slog.v(TAG, "Final window list:");
41759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_REORDER) dumpWindowsLocked();
41763a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
41773a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        false /*updateInputWindows*/);
41789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutNeeded = true;
41792e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                mInputMonitor.setUpdateInputWindowsNeededLw();
41809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                performLayoutAndPlaceSurfacesLocked();
41812e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                mInputMonitor.updateInputWindowsLw(false /*force*/);
41829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(origId);
41849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void removeAppTokensLocked(List<IBinder> tokens) {
41889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // XXX This should be done more efficiently!
41899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // (take advantage of the fact that both lists should be
41909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // ordered in the same way.)
41919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int N = tokens.size();
41929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
41939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IBinder token = tokens.get(i);
41949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final AppWindowToken wtoken = findAppWindowToken(token);
4195f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            if (DEBUG_REORDER || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG,
4196f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    "Temporarily removing " + wtoken + " from " + mAppTokens.indexOf(wtoken));
41979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mAppTokens.remove(wtoken)) {
41988a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Attempting to reorder token that doesn't exist: "
41999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + token + " (" + wtoken + ")");
42009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
42019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                N--;
42029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
42039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4206a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    private void moveAppWindowsLocked(AppWindowToken wtoken, int tokenPos,
4207a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            boolean updateFocusAndLayout) {
4208a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        // First remove all of the windows from the list.
4209a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        tmpRemoveAppWindowsLocked(wtoken);
4210a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn
4211a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        // Where to start adding?
4212a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        int pos = findWindowOffsetLocked(tokenPos);
4213a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn
4214a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        // And now add them back at the correct place.
4215a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        pos = reAddAppWindowsLocked(pos, wtoken);
4216a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn
4217a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        if (updateFocusAndLayout) {
42182e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown            mInputMonitor.setUpdateInputWindowsNeededLw();
42193a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown            if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
42203a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    false /*updateInputWindows*/)) {
4221a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                assignLayersLocked();
4222a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
4223a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            mLayoutNeeded = true;
4224a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            performLayoutAndPlaceSurfacesLocked();
42252e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown            mInputMonitor.updateInputWindowsLw(false /*force*/);
4226a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        }
4227a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    }
4228a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn
42299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void moveAppWindowsLocked(List<IBinder> tokens, int tokenPos) {
42309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // First remove all of the windows from the list.
42319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = tokens.size();
42329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i;
42339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=0; i<N; i++) {
42349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken token = mTokenMap.get(tokens.get(i));
42359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token != null) {
42369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                tmpRemoveAppWindowsLocked(token);
42379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
42389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Where to start adding?
42419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = findWindowOffsetLocked(tokenPos);
42429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // And now add them back at the correct place.
42449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=0; i<N; i++) {
42459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken token = mTokenMap.get(tokens.get(i));
42469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token != null) {
42479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pos = reAddAppWindowsLocked(pos, token);
42489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
42499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42512e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown        mInputMonitor.setUpdateInputWindowsNeededLw();
42523a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
42533a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                false /*updateInputWindows*/)) {
4254a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            assignLayersLocked();
4255a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        }
42569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLayoutNeeded = true;
42579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        performLayoutAndPlaceSurfacesLocked();
42582e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown        mInputMonitor.updateInputWindowsLw(false /*force*/);
42599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //dump();
42619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void moveAppTokensToTop(List<IBinder> tokens) {
42649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
42659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "moveAppTokensToTop()")) {
4266cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
42679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long origId = Binder.clearCallingIdentity();
42709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
42719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            removeAppTokensLocked(tokens);
42729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = tokens.size();
42739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
42749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AppWindowToken wt = findAppWindowToken(tokens.get(i));
42759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wt != null) {
4276f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    if (DEBUG_TOKEN_MOVEMENT || DEBUG_REORDER) Slog.v(TAG,
4277f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            "Adding next to top: " + wt);
42789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAppTokens.add(wt);
4279bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                    if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
4280a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mToTopApps.remove(wt);
4281a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mToBottomApps.remove(wt);
4282a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mToTopApps.add(wt);
4283a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        wt.sendingToBottom = false;
4284a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        wt.sendingToTop = true;
4285a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    }
42869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
42879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4288ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
4289bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn            if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET) {
4290a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                moveAppWindowsLocked(tokens, mAppTokens.size());
4291a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
42929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
42949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void moveAppTokensToBottom(List<IBinder> tokens) {
42979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
42989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "moveAppTokensToBottom()")) {
4299cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
43009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long origId = Binder.clearCallingIdentity();
43039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
43049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            removeAppTokensLocked(tokens);
43059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = tokens.size();
43069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int pos = 0;
43079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
43089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AppWindowToken wt = findAppWindowToken(tokens.get(i));
43099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (wt != null) {
4310f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    if (DEBUG_TOKEN_MOVEMENT) Slog.v(TAG,
4311f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                            "Adding next to bottom: " + wt + " at " + pos);
43129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAppTokens.add(pos, wt);
4313bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                    if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
4314a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mToTopApps.remove(wt);
4315a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mToBottomApps.remove(wt);
4316a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mToBottomApps.add(i, wt);
4317a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        wt.sendingToTop = false;
4318a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        wt.sendingToBottom = true;
4319a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    }
43209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pos++;
43219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
43229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4323ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
4324bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn            if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET) {
4325a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                moveAppWindowsLocked(tokens, 0);
4326a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
43279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
43299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
43329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Misc IWindowSession methods
43339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
433406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4335284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller    private boolean shouldAllowDisableKeyguard()
4336d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller    {
4337284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        // We fail safe and prevent disabling keyguard in the unlikely event this gets
4338284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        // called before DevicePolicyManagerService has started.
4339284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        if (mAllowDisableKeyguard == ALLOW_DISABLE_UNKNOWN) {
4340284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService(
4341284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                    Context.DEVICE_POLICY_SERVICE);
4342284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            if (dpm != null) {
4343284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                mAllowDisableKeyguard = dpm.getPasswordQuality(null)
4344284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                        == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED ?
4345284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                                ALLOW_DISABLE_YES : ALLOW_DISABLE_NO;
4346284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            }
4347284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        }
4348284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        return mAllowDisableKeyguard == ALLOW_DISABLE_YES;
4349d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller    }
4350d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller
43519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void disableKeyguard(IBinder token, String tag) {
4352733fdf34b6a8a8e3983ff7663828a928d3c19944Mike Lockwood        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD)
43539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            != PackageManager.PERMISSION_GRANTED) {
43549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException("Requires DISABLE_KEYGUARD permission");
43559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4356d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller
4357284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        synchronized (mKeyguardTokenWatcher) {
4358284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            mKeyguardTokenWatcher.acquire(token, tag);
4359dd8846886aa21980ecdca7ba42deac4f7ecd8ff0Mike Lockwood        }
43609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void reenableKeyguard(IBinder token) {
4363733fdf34b6a8a8e3983ff7663828a928d3c19944Mike Lockwood        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD)
43649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            != PackageManager.PERMISSION_GRANTED) {
43659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException("Requires DISABLE_KEYGUARD permission");
43669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4367d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller
4368284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller        synchronized (mKeyguardTokenWatcher) {
4369284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            mKeyguardTokenWatcher.release(token);
4370284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller
4371284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller            if (!mKeyguardTokenWatcher.isAcquired()) {
4372284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // If we are the last one to reenable the keyguard wait until
4373284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // we have actually finished reenabling until returning.
4374284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // It is possible that reenableKeyguard() can be called before
4375284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // the previous disableKeyguard() is handled, in which case
4376284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // neither mKeyguardTokenWatcher.acquired() or released() would
4377284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // be called. In that case mKeyguardDisabled will be false here
4378284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                // and we have nothing to wait for.
4379284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                while (mKeyguardDisabled) {
4380284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                    try {
4381284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                        mKeyguardTokenWatcher.wait();
4382284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                    } catch (InterruptedException e) {
4383284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller                        Thread.currentThread().interrupt();
43849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
43859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
43869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
43879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
43919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.app.KeyguardManager#exitKeyguardSecurely
43929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
43939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void exitKeyguardSecurely(final IOnKeyguardExitResult callback) {
4394733fdf34b6a8a8e3983ff7663828a928d3c19944Mike Lockwood        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD)
43959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            != PackageManager.PERMISSION_GRANTED) {
43969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new SecurityException("Requires DISABLE_KEYGUARD permission");
43979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPolicy.exitKeyguardSecurely(new WindowManagerPolicy.OnKeyguardExitResult() {
43999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void onKeyguardExitResult(boolean success) {
44009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
44019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    callback.onKeyguardExitResult(success);
44029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
44039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Client has died, we don't care.
44049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
44059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
44069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        });
44079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean inKeyguardRestrictedInputMode() {
44109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPolicy.inKeyguardRestrictedKeyInputMode();
44119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
441206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4413520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood    public boolean isKeyguardLocked() {
4414520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood        return mPolicy.isKeyguardLocked();
4415520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood    }
4416520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood
4417520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood    public boolean isKeyguardSecure() {
4418520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood        return mPolicy.isKeyguardSecure();
4419520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood    }
4420520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood
4421ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn    public void closeSystemDialogs(String reason) {
4422ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        synchronized(mWindowMap) {
4423ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn            for (int i=mWindows.size()-1; i>=0; i--) {
4424e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState w = mWindows.get(i);
4425ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                if (w.mSurface != null) {
4426ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                    try {
4427ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                        w.mClient.closeSystemDialogs(reason);
4428ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                    } catch (RemoteException e) {
4429ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                    }
4430ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                }
4431ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn            }
4432ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        }
4433ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn    }
4434ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
44359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static float fixScale(float scale) {
44369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (scale < 0) scale = 0;
44379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else if (scale > 20) scale = 20;
44389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return Math.abs(scale);
44399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
444006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
44419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAnimationScale(int which, float scale) {
44429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.SET_ANIMATION_SCALE,
44439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAnimationScale()")) {
4444cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires SET_ANIMATION_SCALE permission");
44459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (scale < 0) scale = 0;
44489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else if (scale > 20) scale = 20;
44499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        scale = Math.abs(scale);
44509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
44519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 0: mWindowAnimationScale = fixScale(scale); break;
44529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 1: mTransitionAnimationScale = fixScale(scale); break;
44539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
445406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
44559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Persist setting
44569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.obtainMessage(H.PERSIST_ANIMATION_SCALE).sendToTarget();
44579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
445806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
44599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAnimationScales(float[] scales) {
44609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.SET_ANIMATION_SCALE,
44619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "setAnimationScale()")) {
4462cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires SET_ANIMATION_SCALE permission");
44639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (scales != null) {
44669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (scales.length >= 1) {
44679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindowAnimationScale = fixScale(scales[0]);
44689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
44699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (scales.length >= 2) {
44709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTransitionAnimationScale = fixScale(scales[1]);
44719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
44729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
447306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
44749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Persist setting
44759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.obtainMessage(H.PERSIST_ANIMATION_SCALE).sendToTarget();
44769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
447706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
44789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float getAnimationScale(int which) {
44799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
44809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 0: return mWindowAnimationScale;
44819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 1: return mTransitionAnimationScale;
44829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
44849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
448506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
44869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float[] getAnimationScales() {
44879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new float[] { mWindowAnimationScale, mTransitionAnimationScale };
44889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
448906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
44909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getSwitchState(int sw) {
44919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
44929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "getSwitchState()")) {
4493cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
44949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44956d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getSwitchState(-1, InputDevice.SOURCE_ANY, sw);
44969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
449706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
44989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getSwitchStateForDevice(int devid, int sw) {
44999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
45009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "getSwitchStateForDevice()")) {
4501cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
45029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45036d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getSwitchState(devid, InputDevice.SOURCE_ANY, sw);
45049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
450506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getScancodeState(int sw) {
45079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
45089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "getScancodeState()")) {
4509cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
45109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45116d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getScanCodeState(-1, InputDevice.SOURCE_ANY, sw);
45129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
451306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getScancodeStateForDevice(int devid, int sw) {
45159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
45169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "getScancodeStateForDevice()")) {
4517cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
45189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45196d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getScanCodeState(devid, InputDevice.SOURCE_ANY, sw);
45209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
452106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45221d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    public int getTrackballScancodeState(int sw) {
45231d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
45241d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn                "getTrackballScancodeState()")) {
45251d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
45261d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        }
45276d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getScanCodeState(-1, InputDevice.SOURCE_TRACKBALL, sw);
45281d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    }
45291d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn
45301d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    public int getDPadScancodeState(int sw) {
45311d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
45321d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn                "getDPadScancodeState()")) {
45331d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
45341d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        }
45356d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getScanCodeState(-1, InputDevice.SOURCE_DPAD, sw);
45361d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    }
45371d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn
45389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getKeycodeState(int sw) {
45399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
45409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "getKeycodeState()")) {
4541cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
45429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45436d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_ANY, sw);
45449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
454506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getKeycodeStateForDevice(int devid, int sw) {
45479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
45489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "getKeycodeStateForDevice()")) {
4549cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
45509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45516d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getKeyCodeState(devid, InputDevice.SOURCE_ANY, sw);
45529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
455306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45541d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    public int getTrackballKeycodeState(int sw) {
45551d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
45561d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn                "getTrackballKeycodeState()")) {
45571d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
45581d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        }
45596d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_TRACKBALL, sw);
45601d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    }
45611d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn
45621d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    public int getDPadKeycodeState(int sw) {
45631d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
45641d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn                "getDPadKeycodeState()")) {
45651d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn            throw new SecurityException("Requires READ_INPUT_STATE permission");
45661d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn        }
45676d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_DPAD, sw);
45681d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn    }
4569a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown
45709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hasKeys(int[] keycodes, boolean[] keyExists) {
45716d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mInputManager.hasKeys(-1, InputDevice.SOURCE_ANY, keycodes, keyExists);
45729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
457306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4574a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown    public InputChannel monitorInput(String inputChannelName) {
4575a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown        if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE,
4576a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown                "monitorInput()")) {
4577a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown            throw new SecurityException("Requires READ_INPUT_STATE permission");
4578a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown        }
4579a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown        return mInputManager.monitorInput(inputChannelName);
4580a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown    }
4581a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown
45828d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public InputDevice getInputDevice(int deviceId) {
45838d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return mInputManager.getInputDevice(deviceId);
45848d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
45858d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
45868d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public int[] getInputDeviceIds() {
45878d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return mInputManager.getInputDeviceIds();
45888d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
45898d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
45909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enableScreenAfterBoot() {
45919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
45929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mSystemBooted) {
45939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
45949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
45959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSystemBooted = true;
45969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
459706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
45989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        performEnableScreen();
45999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
460006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enableScreenIfNeededLocked() {
46029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDisplayEnabled) {
46039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
46049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
46059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mSystemBooted) {
46069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
46079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
46089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.sendMessage(mH.obtainMessage(H.ENABLE_SCREEN));
46099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
461006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void performEnableScreen() {
46129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
46139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDisplayEnabled) {
46149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
46159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
46169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mSystemBooted) {
46179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
46189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
461906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Don't enable the screen until all existing windows
46219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // have been drawn.
46229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = mWindows.size();
46239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
4624e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState w = mWindows.get(i);
4625f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn                if (w.isVisibleLw() && !w.mObscured && !w.isDrawnLw()) {
46269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
46279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
46289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
462906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDisplayEnabled = true;
46319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (false) {
46328a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.i(TAG, "ENABLING SCREEN!");
46339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                StringWriter sw = new StringWriter();
46349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PrintWriter pw = new PrintWriter(sw);
46359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                this.dump(null, pw, null);
46368a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.i(TAG, sw.toString());
46379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
46389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
46399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IBinder surfaceFlinger = ServiceManager.getService("SurfaceFlinger");
46409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (surfaceFlinger != null) {
46418a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    //Slog.i(TAG, "******* TELLING SURFACE FLINGER WE ARE BOOTED!");
46429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Parcel data = Parcel.obtain();
46439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.writeInterfaceToken("android.ui.ISurfaceComposer");
46449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    surfaceFlinger.transact(IBinder.FIRST_CALL_TRANSACTION,
46459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            data, null, 0);
46469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.recycle();
46479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
46489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException ex) {
46498a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.e(TAG, "Boot completed: SurfaceFlinger is dead!");
46509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
46519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
465206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPolicy.enableScreenAfterBoot();
465406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make sure the last requested orientation has been applied.
4656321ae681cad03d00ad1efc6f06f74268e00172a9Dianne Hackborn        setRotationUnchecked(WindowManagerPolicy.USE_LAST_ROTATION, false,
4657321ae681cad03d00ad1efc6f06f74268e00172a9Dianne Hackborn                mLastRotationFlags | Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE);
46589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
465906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
46609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setInTouchMode(boolean mode) {
46619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
46629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInTouchMode = mode;
46639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
46649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46666804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    // TODO: more accounting of which pid(s) turned it on, keep count,
46676804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    // only allow disables from pids which have count on, etc.
46686804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    public void showStrictModeViolation(boolean on) {
46696804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        int pid = Binder.getCallingPid();
46706804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        synchronized(mWindowMap) {
46716804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            // Ignoring requests to enable the red border from clients
46726804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            // which aren't on screen.  (e.g. Broadcast Receivers in
46736804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            // the background..)
46746804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            if (on) {
46756804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                boolean isVisible = false;
46766804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                for (WindowState ws : mWindows) {
46776804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                    if (ws.mSession.mPid == pid && ws.isVisibleLw()) {
46786804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                        isVisible = true;
46796804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                        break;
46806804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                    }
46816804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                }
46826804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                if (!isVisible) {
46836804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                    return;
46846804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick                }
46856804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            }
46866804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick
468794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            if (SHOW_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION showStrictModeViolation");
46886804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            Surface.openTransaction();
468994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            try {
469094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                if (mStrictModeFlash == null) {
469194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    mStrictModeFlash = new StrictModeFlash(mDisplay, mFxSession);
469294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                }
469394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                mStrictModeFlash.setVisibility(on);
469494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            } finally {
469594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                Surface.closeTransaction();
469694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                if (SHOW_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION showStrictModeViolation");
46976804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            }
46986804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        }
46996804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    }
47006804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick
4701c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick    public void setStrictModeVisualIndicatorPreference(String value) {
4702c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick        SystemProperties.set(StrictMode.VISUAL_PROPERTY, value);
4703c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick    }
4704c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick
4705d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn    public Bitmap screenshotApplications(IBinder appToken, int maxWidth, int maxHeight) {
47060aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        if (!checkCallingPermission(android.Manifest.permission.READ_FRAME_BUFFER,
47070aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                "screenshotApplications()")) {
47080aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            throw new SecurityException("Requires READ_FRAME_BUFFER permission");
47090aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        }
47100aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
47110aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        Bitmap rawss;
47120aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
4713d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn        int maxLayer = 0;
47140aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        final Rect frame = new Rect();
47150aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
47160aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        float scale;
47170aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        int sw, sh, dw, dh;
47180aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        int rot;
47190aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
47200aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        synchronized(mWindowMap) {
47210aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            long ident = Binder.clearCallingIdentity();
47220aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
4723428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            dw = mDisplay.getWidth();
4724428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            dh = mDisplay.getHeight();
4725428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn
47260aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            int aboveAppLayer = mPolicy.windowTypeToLayerLw(
47270aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                    WindowManager.LayoutParams.TYPE_APPLICATION) * TYPE_LAYER_MULTIPLIER
47280aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                    + TYPE_LAYER_OFFSET;
47290aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            aboveAppLayer += TYPE_LAYER_MULTIPLIER;
47300aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
4731428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            boolean isImeTarget = mInputMethodTarget != null
4732428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    && mInputMethodTarget.mAppToken != null
4733428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    && mInputMethodTarget.mAppToken.appToken != null
4734428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    && mInputMethodTarget.mAppToken.appToken.asBinder() == appToken;
4735428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn
47360aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            // Figure out the part of the screen that is actually the app.
4737428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            boolean including = false;
4738428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            for (int i=mWindows.size()-1; i>=0; i--) {
47390aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                WindowState ws = mWindows.get(i);
47400aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                if (ws.mSurface == null) {
47410aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                    continue;
47420aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                }
47430aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                if (ws.mLayer >= aboveAppLayer) {
4744d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn                    continue;
4745d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn                }
4746428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                // When we will skip windows: when we are not including
4747428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                // ones behind a window we didn't skip, and we are actually
4748428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                // taking a screenshot of a specific app.
4749428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                if (!including && appToken != null) {
4750428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    // Also, we can possibly skip this window if it is not
4751428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    // an IME target or the application for the screenshot
4752428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    // is not the current IME target.
4753428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    if (!ws.mIsImWindow || !isImeTarget) {
4754428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        // And finally, this window is of no interest if it
4755428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        // is not associated with the screenshot app.
4756428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        if (ws.mAppToken == null || ws.mAppToken.token != appToken) {
4757428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                            continue;
4758428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        }
4759428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                    }
4760428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                }
4761428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn
4762428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                // We keep on including windows until we go past a full-screen
4763428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                // window.
4764428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                including = !ws.mIsImWindow && !ws.isFullscreen(dw, dh);
4765428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn
4766d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn                if (maxLayer < ws.mAnimLayer) {
4767d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn                    maxLayer = ws.mAnimLayer;
4768d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn                }
47690aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                final Rect wf = ws.mFrame;
47700aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                final Rect cr = ws.mContentInsets;
47710aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                int left = wf.left + cr.left;
47720aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                int top = wf.top + cr.top;
47730aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                int right = wf.right - cr.right;
47740aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                int bottom = wf.bottom - cr.bottom;
47750aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                frame.union(left, top, right, bottom);
47760aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            }
47770aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            Binder.restoreCallingIdentity(ident);
47780aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
4779dd962ee1633b1e479bca5eae83744262fb69867fDianne Hackborn            // Constrain frame to the screen size.
4780dd962ee1633b1e479bca5eae83744262fb69867fDianne Hackborn            frame.intersect(0, 0, dw, dh);
4781dd962ee1633b1e479bca5eae83744262fb69867fDianne Hackborn
4782cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn            if (frame.isEmpty() || maxLayer == 0) {
47830aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                return null;
47840aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            }
47850aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
47860aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            // The screenshot API does not apply the current screen rotation.
47870aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            rot = mDisplay.getRotation();
47880aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            int fw = frame.width();
47890aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            int fh = frame.height();
47900aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
47910aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            // First try reducing to fit in x dimension.
47920aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            scale = maxWidth/(float)fw;
47930aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            sw = maxWidth;
47940aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            sh = (int)(fh*scale);
47950aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            if (sh > maxHeight) {
47960aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                // y dimension became too long; constrain by that.
47970aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                scale = maxHeight/(float)fh;
47980aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                sw = (int)(fw*scale);
47990aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                sh = maxHeight;
48000aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            }
48010aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
48020aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            // The screen shot will contain the entire screen.
4803428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            dw = (int)(dw*scale);
4804428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            dh = (int)(dh*scale);
48050aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            if (rot == Surface.ROTATION_90 || rot == Surface.ROTATION_270) {
48060aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                int tmp = dw;
48070aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                dw = dh;
48080aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                dh = tmp;
48090aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn                rot = (rot == Surface.ROTATION_90) ? Surface.ROTATION_270 : Surface.ROTATION_90;
48100aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn            }
4811d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn            rawss = Surface.screenshot(dw, dh, 0, maxLayer);
48120aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        }
48130aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
4814cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn        if (rawss == null) {
481588b03bd2e12c10c73e455a7eccf7d1aa324049d7Dianne Hackborn            Log.w(TAG, "Failure taking screenshot for (" + dw + "x" + dh
481688b03bd2e12c10c73e455a7eccf7d1aa324049d7Dianne Hackborn                    + ") to layer " + maxLayer);
4817cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn            return null;
4818cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn        }
4819cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn
48200aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        Bitmap bm = Bitmap.createBitmap(sw, sh, rawss.getConfig());
48210aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        Matrix matrix = new Matrix();
48220aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        ScreenRotationAnimation.createRotationMatrix(rot, dw, dh, matrix);
48230aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        matrix.postTranslate(-(int)(frame.left*scale), -(int)(frame.top*scale));
48240aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        Canvas canvas = new Canvas(bm);
48250aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        canvas.drawBitmap(rawss, matrix, null);
48260aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
48270aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        rawss.recycle();
48280aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn        return bm;
48290aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn    }
48300aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn
4831b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler    public void freezeRotation() {
4832b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION,
48332ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler                "freezeRotation()")) {
4834b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler            throw new SecurityException("Requires SET_ORIENTATION permission");
4835b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        }
4836b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler
48372ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler        if (DEBUG_ORIENTATION) Slog.v(TAG, "freezeRotation: mRotation=" + mRotation);
48382ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler
4839b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        mPolicy.setUserRotationMode(WindowManagerPolicy.USER_ROTATION_LOCKED, mRotation);
4840b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        setRotationUnchecked(WindowManagerPolicy.USE_LAST_ROTATION, false, 0);
4841b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler    }
4842b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler
4843b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler    public void thawRotation() {
4844b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION,
48452ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler                "thawRotation()")) {
4846b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler            throw new SecurityException("Requires SET_ORIENTATION permission");
4847b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        }
4848b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler
48492ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler        if (DEBUG_ORIENTATION) Slog.v(TAG, "thawRotation: mRotation=" + mRotation);
48502ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler
48512ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler        mPolicy.setUserRotationMode(WindowManagerPolicy.USER_ROTATION_FREE, 777); // rot not used
4852b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler        setRotationUnchecked(WindowManagerPolicy.USE_LAST_ROTATION, false, 0);
4853b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler    }
4854b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler
485506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy    public void setRotation(int rotation,
48561e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn            boolean alwaysSendConfiguration, int animFlags) {
48579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION,
48581e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn                "setRotation()")) {
4859cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires SET_ORIENTATION permission");
48609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48621e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn        setRotationUnchecked(rotation, alwaysSendConfiguration, animFlags);
48639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
486406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
48651e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn    public void setRotationUnchecked(int rotation,
48661e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn            boolean alwaysSendConfiguration, int animFlags) {
48678a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if(DEBUG_ORIENTATION) Slog.v(TAG,
4868910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner                   "setRotationUnchecked(rotation=" + rotation +
4869910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner                   " alwaysSendConfiguration=" + alwaysSendConfiguration +
4870910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner                   " animFlags=" + animFlags);
487106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
48729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long origId = Binder.clearCallingIdentity();
48739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean changed;
48749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
487594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            changed = setRotationUncheckedLocked(rotation, animFlags, false);
48769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
487706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4878e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        if (changed || alwaysSendConfiguration) {
48799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendNewConfiguration();
48809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
488106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
48829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Binder.restoreCallingIdentity(origId);
48839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
488406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
4885e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    /**
4886e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * Apply a new rotation to the screen, respecting the requests of
4887e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * applications.  Use WindowManagerPolicy.USE_LAST_ROTATION to simply
4888e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * re-evaluate the desired rotation.
4889e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     *
4890e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * Returns null if the rotation has been changed.  In this case YOU
4891e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * MUST CALL setNewConfiguration() TO UNFREEZE THE SCREEN.
4892e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     */
489394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn    public boolean setRotationUncheckedLocked(int rotation, int animFlags, boolean inTransaction) {
489489ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        if (mDragState != null || mScreenRotationAnimation != null) {
4895ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate            // Potential rotation during a drag.  Don't do the rotation now, but make
4896ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate            // a note to perform the rotation later.
489789ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            if (DEBUG_ORIENTATION) Slog.v(TAG, "Deferring rotation.");
489889ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            if (rotation != WindowManagerPolicy.USE_LAST_ROTATION) {
489989ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                mDeferredRotation = rotation;
490089ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                mDeferredRotationAnimFlags = animFlags;
490189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            }
4902ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate            return false;
4903ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate        }
4904ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate
49059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean changed;
49069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (rotation == WindowManagerPolicy.USE_LAST_ROTATION) {
490789ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            if (mDeferredRotation != WindowManagerPolicy.USE_LAST_ROTATION) {
490889ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                rotation = mDeferredRotation;
490989ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                mRequestedRotation = rotation;
491089ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                mLastRotationFlags = mDeferredRotationAnimFlags;
491189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            }
49129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            rotation = mRequestedRotation;
49139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
49149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRequestedRotation = rotation;
4915321ae681cad03d00ad1efc6f06f74268e00172a9Dianne Hackborn            mLastRotationFlags = animFlags;
49169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
491789ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        mDeferredRotation = WindowManagerPolicy.USE_LAST_ROTATION;
49188a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_ORIENTATION) Slog.v(TAG, "Overwriting rotation value from " + rotation);
4919c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        rotation = mPolicy.rotationForOrientationLw(mForcedAppOrientation,
49209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRotation, mDisplayEnabled);
49218a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_ORIENTATION) Slog.v(TAG, "new rotation is set to " + rotation);
49229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        changed = mDisplayEnabled && mRotation != rotation;
492306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
49249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (changed) {
49258a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_ORIENTATION) Slog.v(TAG,
49269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Rotation changed to " + rotation
49279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " from " + mRotation
49289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " (forceApp=" + mForcedAppOrientation
49299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ", req=" + mRequestedRotation + ")");
49309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRotation = rotation;
49319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowsFreezingScreen = true;
49329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT);
49339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendMessageDelayed(mH.obtainMessage(H.WINDOW_FREEZE_TIMEOUT),
49349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    2000);
4935e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            mWaitingForConfig = true;
4936e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            mLayoutNeeded = true;
493794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            startFreezingDisplayLocked(inTransaction);
49388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.i(TAG, "Setting rotation to " + rotation + ", animFlags=" + animFlags);
493900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            mInputManager.setDisplayOrientation(0, rotation);
49409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDisplayEnabled) {
4941910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner                // NOTE: We disable the rotation in the emulator because
4942910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner                //       it doesn't support hardware OpenGL emulation yet.
4943910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner                if (CUSTOM_SCREEN_ROTATION && !mInEmulator) {
4944a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn                    Surface.freezeDisplay(0);
494594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    if (!inTransaction) {
494694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        if (SHOW_TRANSACTIONS) Slog.i(TAG,
494794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                                ">>> OPEN TRANSACTION setRotationUnchecked");
494894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        Surface.openTransaction();
494994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    }
495094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    try {
495194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        if (mScreenRotationAnimation != null) {
495294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                            mScreenRotationAnimation.setRotation(rotation);
495394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        }
495494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    } finally {
495594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        if (!inTransaction) {
495694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                            Surface.closeTransaction();
495794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                            if (SHOW_TRANSACTIONS) Slog.i(TAG,
495894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                                    "<<< CLOSE TRANSACTION setRotationUnchecked");
495994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        }
4960a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn                    }
4961a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn                    Surface.setOrientation(0, rotation, animFlags);
4962a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn                    Surface.unfreezeDisplay(0);
4963a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn                } else {
4964a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn                    Surface.setOrientation(0, rotation, animFlags);
4965a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn                }
49669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
49679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=mWindows.size()-1; i>=0; i--) {
4968e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState w = mWindows.get(i);
49699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (w.mSurface != null) {
49709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mOrientationChanging = true;
49719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
49729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
49739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=mRotationWatchers.size()-1; i>=0; i--) {
49749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
49759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRotationWatchers.get(i).onRotationChanged(rotation);
49769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
49779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
49789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
49799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } //end if changed
498006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
49819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return changed;
49829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
498306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
49849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getRotation() {
49859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRotation;
49869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
49879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int watchRotation(IRotationWatcher watcher) {
49899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final IBinder watcherBinder = watcher.asBinder();
49909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IBinder.DeathRecipient dr = new IBinder.DeathRecipient() {
49919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void binderDied() {
49929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (mWindowMap) {
49939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i=0; i<mRotationWatchers.size(); i++) {
49949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (watcherBinder == mRotationWatchers.get(i).asBinder()) {
4995fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu                            IRotationWatcher removed = mRotationWatchers.remove(i);
4996fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu                            if (removed != null) {
4997fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu                                removed.asBinder().unlinkToDeath(this, 0);
4998fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu                            }
49999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            i--;
50009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
50019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
50029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
50039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
50049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
500506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
50069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
50079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
50089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                watcher.asBinder().linkToDeath(dr, 0);
50099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mRotationWatchers.add(watcher);
50109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
50119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Client died, no cleanup needed.
50129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
501306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
50149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mRotation;
50159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
50169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
50179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
50199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Starts the view server on the specified port.
50209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
50219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param port The port to listener to.
50229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
50239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the server was successfully started, false otherwise.
50249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5025a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn     * @see com.android.server.wm.ViewServer
5026a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn     * @see com.android.server.wm.ViewServer#VIEW_SERVER_DEFAULT_PORT
50279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
50289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean startViewServer(int port) {
502906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy        if (isSystemSecure()) {
50309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
50319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
50329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(Manifest.permission.DUMP, "startViewServer")) {
50349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
50359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
50369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (port < 1024) {
50389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
50399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
50409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mViewServer != null) {
50429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mViewServer.isRunning()) {
50439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
50449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mViewServer.start();
50459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IOException e) {
50468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "View server did not start");
50479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
50489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
50499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
50509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
50519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
50539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mViewServer = new ViewServer(this, port);
50549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mViewServer.start();
50559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
50568a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "View server did not start");
50579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
50589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
50599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
50609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
506106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy    private boolean isSystemSecure() {
506206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy        return "1".equals(SystemProperties.get(SYSTEM_SECURE, "1")) &&
506306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                "0".equals(SystemProperties.get(SYSTEM_DEBUGGABLE, "0"));
506406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy    }
506506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
50669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
50679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Stops the view server if it exists.
50689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
50699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the server stopped, false if it wasn't started or
50709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         couldn't be stopped.
50719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5072a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn     * @see com.android.server.wm.ViewServer
50739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
50749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean stopViewServer() {
507506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy        if (isSystemSecure()) {
50769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
50779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
50789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(Manifest.permission.DUMP, "stopViewServer")) {
50809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
50819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
50829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mViewServer != null) {
50849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mViewServer.stop();
50859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
50869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
50879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
50889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
50909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether the view server is running.
50919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
50929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the server is running, false otherwise.
50939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5094a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn     * @see com.android.server.wm.ViewServer
50959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
50969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isViewServerRunning() {
509706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy        if (isSystemSecure()) {
50989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
50999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(Manifest.permission.DUMP, "isViewServerRunning")) {
51029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
51039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mViewServer != null && mViewServer.isRunning();
51069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
51079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
51099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Lists all availble windows in the system. The listing is written in the
51109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * specified Socket's output stream with the following syntax:
51119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * windowHashCodeInHexadecimal windowName
51129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Each line of the ouput represents a different window.
51139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
51149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param client The remote client to send the listing to.
51159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return False if an error occured, true otherwise.
51169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
51179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean viewServerListWindows(Socket client) {
511806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy        if (isSystemSecure()) {
51199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
51209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean result = true;
51239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5124e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        WindowState[] windows;
51259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
51269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //noinspection unchecked
5127e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            windows = mWindows.toArray(new WindowState[mWindows.size()]);
51289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        BufferedWriter out = null;
51319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Any uncaught exception will crash the system process
51339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
51349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            OutputStream clientStream = client.getOutputStream();
51359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out = new BufferedWriter(new OutputStreamWriter(clientStream), 8 * 1024);
51369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int count = windows.length;
51389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < count; i++) {
5139e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                final WindowState w = windows[i];
51409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.write(Integer.toHexString(System.identityHashCode(w)));
51419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.write(' ');
51429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.append(w.mAttrs.getTitle());
51439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.write('\n');
51449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
51459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.write("DONE.\n");
51479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.flush();
51489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
51499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            result = false;
51509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
51519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (out != null) {
51529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
51539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.close();
51549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IOException e) {
51559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    result = false;
51569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
51579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
51589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
51619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
51629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5164f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev     * Returns the focused window in the following format:
5165f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev     * windowHashCodeInHexadecimal windowName
5166f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev     *
5167f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev     * @param client The remote client to send the listing to.
5168f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev     * @return False if an error occurred, true otherwise.
5169f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev     */
5170f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev    boolean viewServerGetFocusedWindow(Socket client) {
5171f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        if (isSystemSecure()) {
5172f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            return false;
5173f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        }
5174f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev
5175f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        boolean result = true;
5176f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev
5177f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        WindowState focusedWindow = getFocusedWindow();
5178f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev
5179f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        BufferedWriter out = null;
5180f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev
5181f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        // Any uncaught exception will crash the system process
5182f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        try {
5183f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            OutputStream clientStream = client.getOutputStream();
5184f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            out = new BufferedWriter(new OutputStreamWriter(clientStream), 8 * 1024);
5185f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev
5186f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            if(focusedWindow != null) {
5187f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev                out.write(Integer.toHexString(System.identityHashCode(focusedWindow)));
5188f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev                out.write(' ');
5189f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev                out.append(focusedWindow.mAttrs.getTitle());
5190f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            }
5191f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            out.write('\n');
5192f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            out.flush();
5193f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev        } catch (Exception e) {
5194f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev            result = false;
51959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
51969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (out != null) {
51979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
51989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.close();
51999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IOException e) {
52009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    result = false;
52019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
52029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
52069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
52079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
52099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sends a command to a target window. The result of the command, if any, will be
52109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * written in the output stream of the specified socket.
52119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
52129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The parameters must follow this syntax:
52139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * windowHashcode extra
52149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
52159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Where XX is the length in characeters of the windowTitle.
52169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
52179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The first parameter is the target window. The window with the specified hashcode
52189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be the target. If no target can be found, nothing happens. The extra parameters
52199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be delivered to the target window and as parameters to the command itself.
52209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
52219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param client The remote client to sent the result, if any, to.
52229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param command The command to execute.
52239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param parameters The command parameters.
52249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
52259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the command was successfully delivered, false otherwise. This does
52269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         not indicate whether the command itself was successful.
52279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
52289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean viewServerWindowCommand(Socket client, String command, String parameters) {
522906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy        if (isSystemSecure()) {
52309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
52319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean success = true;
52349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data = null;
52359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel reply = null;
52369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
523743b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev        BufferedWriter out = null;
523843b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev
52399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Any uncaught exception will crash the system process
52409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
52419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Find the hashcode of the window
52429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int index = parameters.indexOf(' ');
52439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (index == -1) {
52449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                index = parameters.length();
52459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final String code = parameters.substring(0, index);
5247236092a36216c79507ec19eb207831810caced19Romain Guy            int hashCode = (int) Long.parseLong(code, 16);
52489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Extract the command's parameter after the window description
52509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (index < parameters.length()) {
52519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                parameters = parameters.substring(index + 1);
52529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
52539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                parameters = "";
52549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            final WindowState window = findWindow(hashCode);
52579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (window == null) {
52589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
52599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data = Parcel.obtain();
52629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.writeInterfaceToken("android.view.IWindow");
52639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.writeString(command);
52649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.writeString(parameters);
52659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.writeInt(1);
52669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ParcelFileDescriptor.fromSocket(client).writeToParcel(data, 0);
52679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply = Parcel.obtain();
52699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final IBinder binder = window.mClient.asBinder();
52719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // TODO: GET THE TRANSACTION CODE IN A SAFER MANNER
52729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            binder.transact(IBinder.FIRST_CALL_TRANSACTION, data, reply, 0);
52739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply.readException();
52759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
527643b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev            if (!client.isOutputShutdown()) {
527743b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
527843b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                out.write("DONE\n");
527943b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                out.flush();
528043b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev            }
528143b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev
52829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
52838a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Could not send command " + command + " with parameters " + parameters, e);
52849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            success = false;
52859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
52869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (data != null) {
52879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                data.recycle();
52889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (reply != null) {
52909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reply.recycle();
52919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
529243b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev            if (out != null) {
529343b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                try {
529443b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                    out.close();
529543b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                } catch (IOException e) {
529643b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev
529743b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev                }
529843b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev            }
52999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
53009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return success;
53029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
53039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5304dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    public void addWindowChangeListener(WindowChangeListener listener) {
5305dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        synchronized(mWindowMap) {
5306dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            mWindowChangeListeners.add(listener);
5307dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        }
5308dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    }
5309dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev
5310dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    public void removeWindowChangeListener(WindowChangeListener listener) {
5311dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        synchronized(mWindowMap) {
5312dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            mWindowChangeListeners.remove(listener);
5313dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        }
5314dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    }
5315dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev
5316dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    private void notifyWindowsChanged() {
5317dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        WindowChangeListener[] windowChangeListeners;
5318dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        synchronized(mWindowMap) {
5319dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            if(mWindowChangeListeners.isEmpty()) {
5320dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                return;
5321dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            }
5322dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            windowChangeListeners = new WindowChangeListener[mWindowChangeListeners.size()];
5323dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            windowChangeListeners = mWindowChangeListeners.toArray(windowChangeListeners);
5324dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        }
5325dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        int N = windowChangeListeners.length;
5326dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        for(int i = 0; i < N; i++) {
5327dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            windowChangeListeners[i].windowsChanged();
5328dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev        }
5329dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev    }
5330dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev
53316e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev    private void notifyFocusChanged() {
53326e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        WindowChangeListener[] windowChangeListeners;
53336e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        synchronized(mWindowMap) {
53346e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev            if(mWindowChangeListeners.isEmpty()) {
53356e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev                return;
53366e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev            }
53376e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev            windowChangeListeners = new WindowChangeListener[mWindowChangeListeners.size()];
53386e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev            windowChangeListeners = mWindowChangeListeners.toArray(windowChangeListeners);
53396e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        }
53406e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        int N = windowChangeListeners.length;
53416e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        for(int i = 0; i < N; i++) {
53426e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev            windowChangeListeners[i].focusChanged();
53436e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev        }
53446e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev    }
53456e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev
53469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowState findWindow(int hashCode) {
53479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (hashCode == -1) {
53489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getFocusedWindow();
53499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
53509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
5352e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            final ArrayList<WindowState> windows = mWindows;
53539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int count = windows.size();
53549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < count; i++) {
5356e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState w = windows.get(i);
53579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (System.identityHashCode(w) == hashCode) {
53589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return w;
53599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
53609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
53619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
53629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
53649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
53659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
53679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Instruct the Activity Manager to fetch the current configuration and broadcast
53689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that to config-changed listeners if appropriate.
53699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
53709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void sendNewConfiguration() {
53719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
53729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mActivityManager.updateConfiguration(null);
53739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
53749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
53759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
537606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
53779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Configuration computeNewConfiguration() {
53789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
537994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            Configuration config = computeNewConfigurationLocked();
538094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            if (config == null && mWaitingForConfig) {
538194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                // Nothing changed but we are waiting for something... stop that!
538294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                mWaitingForConfig = false;
538394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                performLayoutAndPlaceSurfacesLocked();
538494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            }
538594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            return config;
5386c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        }
5387c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn    }
538806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
5389c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn    Configuration computeNewConfigurationLocked() {
5390c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        Configuration config = new Configuration();
5391c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        if (!computeNewConfigurationLocked(config)) {
5392c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn            return null;
5393c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        }
5394c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        return config;
5395c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn    }
539606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
5397c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn    boolean computeNewConfigurationLocked(Configuration config) {
5398c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        if (mDisplay == null) {
5399c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn            return false;
54009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
540100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown
540200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        mInputManager.getInputConfiguration(config);
5403b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate
5404b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        // Use the effective "visual" dimensions based on current rotation
5405b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        final boolean rotated = (mRotation == Surface.ROTATION_90
5406b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate                || mRotation == Surface.ROTATION_270);
5407b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        final int dw = rotated ? mInitialDisplayHeight : mInitialDisplayWidth;
5408b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        final int dh = rotated ? mInitialDisplayWidth : mInitialDisplayHeight;
5409b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate
5410c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        int orientation = Configuration.ORIENTATION_SQUARE;
5411c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        if (dw < dh) {
5412c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn            orientation = Configuration.ORIENTATION_PORTRAIT;
5413c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        } else if (dw > dh) {
5414c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn            orientation = Configuration.ORIENTATION_LANDSCAPE;
5415c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        }
5416c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        config.orientation = orientation;
5417ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
54181ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima        DisplayMetrics dm = new DisplayMetrics();
54191ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima        mDisplay.getMetrics(dm);
54201ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima        CompatibilityInfo.updateCompatibleScreenFrame(dm, orientation, mCompatibleScreenFrame);
54211ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
5422c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (mScreenLayout == Configuration.SCREENLAYOUT_SIZE_UNDEFINED) {
5423723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            // Note we only do this once because at this point we don't
5424723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            // expect the screen to change in this way at runtime, and want
5425723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            // to avoid all of this computation for every config change.
5426723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            int longSize = dw;
5427723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            int shortSize = dh;
5428723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            if (longSize < shortSize) {
5429723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                int tmp = longSize;
5430723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                longSize = shortSize;
5431723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                shortSize = tmp;
5432723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            }
5433723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            longSize = (int)(longSize/dm.density);
5434723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            shortSize = (int)(shortSize/dm.density);
54351ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
5436723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            // These semi-magic numbers define our compatibility modes for
5437723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            // applications with different screens.  Don't change unless you
5438723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            // make sure to test lots and lots of apps!
5439723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            if (longSize < 470) {
5440723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                // This is shorter than an HVGA normal density screen (which
5441723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                // is 480 pixels on its long side).
5442c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                mScreenLayout = Configuration.SCREENLAYOUT_SIZE_SMALL
5443c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                        | Configuration.SCREENLAYOUT_LONG_NO;
5444723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            } else {
544514cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                // What size is this screen screen?
544614cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                if (longSize >= 800 && shortSize >= 600) {
544714cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                    // SVGA or larger screens at medium density are the point
544814cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                    // at which we consider it to be an extra large screen.
544914cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                    mScreenLayout = Configuration.SCREENLAYOUT_SIZE_XLARGE;
5450b51dc0fe2abe300593eedb8abd35e676c9224dc6Dianne Hackborn                } else if (longSize >= 530 && shortSize >= 400) {
5451b51dc0fe2abe300593eedb8abd35e676c9224dc6Dianne Hackborn                    // SVGA or larger screens at high density are the point
5452c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                    // at which we consider it to be a large screen.
5453c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                    mScreenLayout = Configuration.SCREENLAYOUT_SIZE_LARGE;
5454c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                } else {
5455c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                    mScreenLayout = Configuration.SCREENLAYOUT_SIZE_NORMAL;
5456e97a12e340dfdc246b531dfb49596628bd24e81bDianne Hackborn                }
5457e97a12e340dfdc246b531dfb49596628bd24e81bDianne Hackborn
5458e97a12e340dfdc246b531dfb49596628bd24e81bDianne Hackborn                // If this screen is wider than normal HVGA, or taller
5459e97a12e340dfdc246b531dfb49596628bd24e81bDianne Hackborn                // than FWVGA, then for old apps we want to run in size
5460e97a12e340dfdc246b531dfb49596628bd24e81bDianne Hackborn                // compatibility mode.
5461e97a12e340dfdc246b531dfb49596628bd24e81bDianne Hackborn                if (shortSize > 321 || longSize > 570) {
5462e97a12e340dfdc246b531dfb49596628bd24e81bDianne Hackborn                    mScreenLayout |= Configuration.SCREENLAYOUT_COMPAT_NEEDED;
5463c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                }
5464ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
5465c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                // Is this a long screen?
5466c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                if (((longSize*3)/5) >= (shortSize-1)) {
5467c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                    // Anything wider than WVGA (5:3) is considering to be long.
5468c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                    mScreenLayout |= Configuration.SCREENLAYOUT_LONG_YES;
5469c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                } else {
5470c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                    mScreenLayout |= Configuration.SCREENLAYOUT_LONG_NO;
5471c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                }
5472723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            }
5473723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        }
5474c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        config.screenLayout = mScreenLayout;
5475ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
5476597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        // Determine whether a hard keyboard is available and enabled.
54772992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        boolean hardKeyboardAvailable = config.keyboard != Configuration.KEYBOARD_NOKEYS;
54782992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        if (hardKeyboardAvailable != mHardKeyboardAvailable) {
54792992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            mHardKeyboardAvailable = hardKeyboardAvailable;
54802992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            mHardKeyboardEnabled = hardKeyboardAvailable;
54812992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
54822992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            mH.removeMessages(H.REPORT_HARD_KEYBOARD_STATUS_CHANGE);
54832992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            mH.sendEmptyMessage(H.REPORT_HARD_KEYBOARD_STATUS_CHANGE);
54842992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
54852992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        if (!mHardKeyboardEnabled) {
54862992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            config.keyboard = Configuration.KEYBOARD_NOKEYS;
54872992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
5488597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown
5489597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        // Update value of keyboardHidden, hardKeyboardHidden and navigationHidden
5490597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        // based on whether a hard or soft keyboard is present, whether navigation keys
5491597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        // are present and the lid switch state.
5492597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        config.keyboardHidden = Configuration.KEYBOARDHIDDEN_NO;
5493597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_NO;
5494597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        config.navigationHidden = Configuration.NAVIGATIONHIDDEN_NO;
5495597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown        mPolicy.adjustConfigurationLw(config);
5496c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn        return true;
54979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5498a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
54992992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    public boolean isHardKeyboardAvailable() {
55002992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        synchronized (mWindowMap) {
55012992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            return mHardKeyboardAvailable;
55022992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
55032992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
55042992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
55052992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    public boolean isHardKeyboardEnabled() {
55062992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        synchronized (mWindowMap) {
55072992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            return mHardKeyboardEnabled;
55082992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
55092992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
55102992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
55112992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    public void setHardKeyboardEnabled(boolean enabled) {
55122992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        synchronized (mWindowMap) {
55132992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            if (mHardKeyboardEnabled != enabled) {
55142992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                mHardKeyboardEnabled = enabled;
55152992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
55162992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            }
55172992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
55182992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
55192992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
55202992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    public void setOnHardKeyboardStatusChangeListener(
55212992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            OnHardKeyboardStatusChangeListener listener) {
55222992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        synchronized (mWindowMap) {
55232992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            mHardKeyboardStatusChangeListener = listener;
55242992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
55252992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
55262992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
55272992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    void notifyHardKeyboardStatusChange() {
55282992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        final boolean available, enabled;
55292992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        final OnHardKeyboardStatusChangeListener listener;
55302992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        synchronized (mWindowMap) {
55312992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            listener = mHardKeyboardStatusChangeListener;
55322992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            available = mHardKeyboardAvailable;
55332992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            enabled = mHardKeyboardEnabled;
55342992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
55352992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        if (listener != null) {
55362992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown            listener.onHardKeyboardStatusChange(available, enabled);
55372992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        }
55382992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
55392992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
5540a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    // -------------------------------------------------------------
5541a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    // Drag and drop
5542a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    // -------------------------------------------------------------
5543a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
5544a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    IBinder prepareDragSurface(IWindow window, SurfaceSession session,
554502d2b3ba9ba830a8147db2739613f7bbb2d0fcbfChristopher Tate            int flags, int width, int height, Surface outSurface) {
5546a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        if (DEBUG_DRAG) {
5547a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            Slog.d(TAG, "prepare drag surface: w=" + width + " h=" + height
554802d2b3ba9ba830a8147db2739613f7bbb2d0fcbfChristopher Tate                    + " flags=" + Integer.toHexString(flags) + " win=" + window
5549a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    + " asbinder=" + window.asBinder());
5550a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        }
5551a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
5552a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        final int callerPid = Binder.getCallingPid();
5553a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        final long origId = Binder.clearCallingIdentity();
5554a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        IBinder token = null;
5555a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
5556a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        try {
5557a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            synchronized (mWindowMap) {
5558a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                try {
5559a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    if (mDragState == null) {
5560a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        Surface surface = new Surface(session, callerPid, "drag surface", 0,
5561a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                                width, height, PixelFormat.TRANSLUCENT, Surface.HIDDEN);
5562ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                        if (SHOW_TRANSACTIONS) Slog.i(TAG, "  DRAG "
5563ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                                + surface + ": CREATE");
5564a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        outSurface.copyFrom(surface);
55657b362e431f3e17a755e56bc7dbc99bd661cb46baChris Tate                        final IBinder winBinder = window.asBinder();
5566a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        token = new Binder();
55676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        mDragState = new DragState(this, token, surface, /*flags*/ 0, winBinder);
5568a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        mDragState.mSurface = surface;
5569a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        token = mDragState.mToken = new Binder();
5570a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
5571a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        // 5 second timeout for this window to actually begin the drag
55727b362e431f3e17a755e56bc7dbc99bd661cb46baChris Tate                        mH.removeMessages(H.DRAG_START_TIMEOUT, winBinder);
55737b362e431f3e17a755e56bc7dbc99bd661cb46baChris Tate                        Message msg = mH.obtainMessage(H.DRAG_START_TIMEOUT, winBinder);
5574a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        mH.sendMessageDelayed(msg, 5000);
5575a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    } else {
5576a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        Slog.w(TAG, "Drag already in progress");
5577a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
5578a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                } catch (Surface.OutOfResourcesException e) {
5579a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    Slog.e(TAG, "Can't allocate drag surface w=" + width + " h=" + height, e);
5580a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    if (mDragState != null) {
5581a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        mDragState.reset();
5582a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        mDragState = null;
5583a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
5584a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                }
5585a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            }
5586a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        } finally {
5587a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            Binder.restoreCallingIdentity(origId);
5588a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        }
5589a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
5590a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        return token;
5591a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    }
5592a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
55939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
55949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Input Events and Focus Management
55959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
559646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
55976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final InputMonitor mInputMonitor = new InputMonitor(this);
55987fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
55999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void pauseKeyDispatching(IBinder _token) {
56009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
56019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "pauseKeyDispatching()")) {
5602cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
56039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
560406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
56059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
56069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken token = mTokenMap.get(_token);
56079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token != null) {
560800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                mInputMonitor.pauseDispatchingLw(token);
56099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
56109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
56119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5612ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
56139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void resumeKeyDispatching(IBinder _token) {
56149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
56159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "resumeKeyDispatching()")) {
5616cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
5617e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan        }
5618e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan
56199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
56209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken token = mTokenMap.get(_token);
56219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (token != null) {
562200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                mInputMonitor.resumeDispatchingLw(token);
5623e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan            }
5624e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan        }
56259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5626e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan
56279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setEventDispatching(boolean enabled) {
56289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
56299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "resumeKeyDispatching()")) {
5630cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn            throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
56319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
563206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
56339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
563400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            mInputMonitor.setEventDispatchingLw(enabled);
56359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
56369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
563706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
56389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
56399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Injects a keystroke event into the UI.
5640bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * Even when sync is false, this method may block while waiting for current
5641bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * input events to be dispatched.
564206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     *
564306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     * @param ev A motion event describing the keystroke action.  (Be sure to use
56449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link SystemClock#uptimeMillis()} as the timebase.)
56459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sync If true, wait for the event to be completed before returning to the caller.
56469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if event was dispatched, false if it was dropped for any reason
56479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
56489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean injectKeyEvent(KeyEvent ev, boolean sync) {
56499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long downTime = ev.getDownTime();
56509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long eventTime = ev.getEventTime();
565106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
56529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int action = ev.getAction();
56539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int code = ev.getKeyCode();
56549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int repeatCount = ev.getRepeatCount();
56559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int metaState = ev.getMetaState();
56569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int deviceId = ev.getDeviceId();
56579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int scancode = ev.getScanCode();
5658c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        int source = ev.getSource();
5659c6ded10dd1ee08c887d0e81d683a7611fbe3ca4dMike Playle        int flags = ev.getFlags();
5660c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
5661c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        if (source == InputDevice.SOURCE_UNKNOWN) {
5662c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            source = InputDevice.SOURCE_KEYBOARD;
5663c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        }
566406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
56659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (eventTime == 0) eventTime = SystemClock.uptimeMillis();
56669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (downTime == 0) downTime = eventTime;
566706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
56689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        KeyEvent newEvent = new KeyEvent(downTime, eventTime, action, code, repeatCount, metaState,
56694a88013a4a06a9ea80e8419f94694936e6b013f0Jean-Baptiste Queru                deviceId, scancode, flags | KeyEvent.FLAG_FROM_SYSTEM, source);
567006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
56712bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final int pid = Binder.getCallingPid();
56722bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final int uid = Binder.getCallingUid();
56732bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final long ident = Binder.clearCallingIdentity();
567446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
5675bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final int result = mInputManager.injectInputEvent(newEvent, pid, uid,
5676bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                sync ? InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISH
5677bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                        : InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT,
5678bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                INJECTION_TIMEOUT_MILLIS);
567946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
56802bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        Binder.restoreCallingIdentity(ident);
56817fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        return reportInjectionResult(result);
56829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
56839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
56859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Inject a pointer (touch) event into the UI.
5686bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * Even when sync is false, this method may block while waiting for current
5687bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * input events to be dispatched.
568806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     *
568906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     * @param ev A motion event describing the pointer (touch) action.  (As noted in
569006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     * {@link MotionEvent#obtain(long, long, int, float, float, int)}, be sure to use
56919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link SystemClock#uptimeMillis()} as the timebase.)
56929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sync If true, wait for the event to be completed before returning to the caller.
56939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if event was dispatched, false if it was dropped for any reason
56949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
56959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean injectPointerEvent(MotionEvent ev, boolean sync) {
56962bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final int pid = Binder.getCallingPid();
56972bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final int uid = Binder.getCallingUid();
56982bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final long ident = Binder.clearCallingIdentity();
569946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
5700c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        MotionEvent newEvent = MotionEvent.obtain(ev);
5701c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        if ((newEvent.getSource() & InputDevice.SOURCE_CLASS_POINTER) == 0) {
5702c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            newEvent.setSource(InputDevice.SOURCE_TOUCHSCREEN);
5703c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        }
5704c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
5705bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final int result = mInputManager.injectInputEvent(newEvent, pid, uid,
5706bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                sync ? InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISH
5707bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                        : InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT,
5708bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                INJECTION_TIMEOUT_MILLIS);
570946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
57102bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        Binder.restoreCallingIdentity(ident);
57117fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        return reportInjectionResult(result);
57129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
571306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
57149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
57159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Inject a trackball (navigation device) event into the UI.
5716bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * Even when sync is false, this method may block while waiting for current
5717bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * input events to be dispatched.
571806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     *
571906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     * @param ev A motion event describing the trackball action.  (As noted in
572006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     * {@link MotionEvent#obtain(long, long, int, float, float, int)}, be sure to use
57219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link SystemClock#uptimeMillis()} as the timebase.)
57229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param sync If true, wait for the event to be completed before returning to the caller.
57239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if event was dispatched, false if it was dropped for any reason
57249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
57259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean injectTrackballEvent(MotionEvent ev, boolean sync) {
57262bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final int pid = Binder.getCallingPid();
57272bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final int uid = Binder.getCallingUid();
57282bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        final long ident = Binder.clearCallingIdentity();
572946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
5730c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        MotionEvent newEvent = MotionEvent.obtain(ev);
5731c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        if ((newEvent.getSource() & InputDevice.SOURCE_CLASS_TRACKBALL) == 0) {
5732c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            newEvent.setSource(InputDevice.SOURCE_TRACKBALL);
5733c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        }
5734c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
5735bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final int result = mInputManager.injectInputEvent(newEvent, pid, uid,
5736bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                sync ? InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISH
5737bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                        : InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT,
5738bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                INJECTION_TIMEOUT_MILLIS);
5739bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown
5740bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        Binder.restoreCallingIdentity(ident);
5741bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        return reportInjectionResult(result);
5742bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown    }
5743bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown
5744bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown    /**
5745bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * Inject an input event into the UI without waiting for dispatch to commence.
5746bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * This variant is useful for fire-and-forget input event injection.  It does not
5747bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * block any longer than it takes to enqueue the input event.
5748bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     *
5749bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * @param ev An input event.  (Be sure to set the input source correctly.)
5750bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     * @return Returns true if event was dispatched, false if it was dropped for any reason
5751bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown     */
5752bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown    public boolean injectInputEventNoWait(InputEvent ev) {
5753bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final int pid = Binder.getCallingPid();
5754bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final int uid = Binder.getCallingUid();
5755bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final long ident = Binder.clearCallingIdentity();
5756bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown
5757bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown        final int result = mInputManager.injectInputEvent(ev, pid, uid,
5758bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                InputManager.INPUT_EVENT_INJECTION_SYNC_NONE,
5759bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown                INJECTION_TIMEOUT_MILLIS);
576046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
57612bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn        Binder.restoreCallingIdentity(ident);
57627fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown        return reportInjectionResult(result);
57637fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    }
57647fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
57657fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    private boolean reportInjectionResult(int result) {
576600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        switch (result) {
576700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            case InputManager.INPUT_EVENT_INJECTION_PERMISSION_DENIED:
576800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                Slog.w(TAG, "Input event injection permission denied.");
576900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                throw new SecurityException(
577000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                        "Injecting to another application requires INJECT_EVENTS permission");
577100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            case InputManager.INPUT_EVENT_INJECTION_SUCCEEDED:
577209e85dc0270ac9ce660c17ee8290ff2d136b395bChristopher Tate                //Slog.v(TAG, "Input event injection succeeded.");
577300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                return true;
577400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            case InputManager.INPUT_EVENT_INJECTION_TIMED_OUT:
577500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                Slog.w(TAG, "Input event injection timed out.");
577600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                return false;
577700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            case InputManager.INPUT_EVENT_INJECTION_FAILED:
577800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            default:
577900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                Slog.w(TAG, "Input event injection failed.");
578000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                return false;
5781cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn        }
57829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
578306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
57849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowState getFocusedWindow() {
57859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
57869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getFocusedWindowLocked();
57879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
57889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
57899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
57909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowState getFocusedWindowLocked() {
57919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCurrentFocus;
57929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
579306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
57949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean detectSafeMode() {
5795b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown        if (!mInputMonitor.waitForInputDevicesReady(
5796b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown                INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS)) {
5797b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown            Slog.w(TAG, "Devices still not ready after waiting "
5798b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown                    + INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS
5799b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown                    + " milliseconds before attempting to detect safe mode.");
5800b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown        }
5801b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown
58029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSafeMode = mPolicy.detectSafeMode();
58039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSafeMode;
58049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
580506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
58069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void systemReady() {
58075132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn        synchronized(mWindowMap) {
58085132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            if (mDisplay != null) {
58095132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn                throw new IllegalStateException("Display already initialized");
58105132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            }
58115132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
58125132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            mDisplay = wm.getDefaultDisplay();
58135132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            mInitialDisplayWidth = mDisplay.getWidth();
58145132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            mInitialDisplayHeight = mDisplay.getHeight();
581599aac7beca18b6d73e40db5e8e49f52f94be638eDianne Hackborn            mInputManager.setDisplaySize(0, mDisplay.getRealWidth(), mDisplay.getRealHeight());
58165132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn        }
58175132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn
58185132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn        try {
58195132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn            mActivityManager.updateConfiguration(null);
58205132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn        } catch (RemoteException e) {
58215132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn        }
5822154db5f6358284d917d515f05d4474606b4896b2Dianne Hackborn
5823154db5f6358284d917d515f05d4474606b4896b2Dianne Hackborn        mPolicy.systemReady();
58245132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn    }
58255132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn
58266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // This is an animation that does nothing: it just immediately finishes
58276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // itself every time it is called.  It is used as a stub animation in cases
58286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // where we want to synchronize multiple things that may be animating.
58296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    static final class DummyAnimation extends Animation {
58306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public boolean getTransformation(long currentTime, Transformation outTransformation) {
58316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return false;
58326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
58336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
58346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    static final Animation sDummyAnimation = new DummyAnimation();
58356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
58369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
58376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Async Handler
58389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
58399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
58406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final class H extends Handler {
58416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int REPORT_FOCUS_CHANGE = 2;
58426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int REPORT_LOSING_FOCUS = 3;
58436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int ANIMATE = 4;
58446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int ADD_STARTING = 5;
58456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int REMOVE_STARTING = 6;
58466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int FINISHED_STARTING = 7;
58476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int REPORT_APPLICATION_TOKEN_WINDOWS = 8;
58486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int WINDOW_FREEZE_TIMEOUT = 11;
58496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int HOLD_SCREEN_CHANGED = 12;
58506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int APP_TRANSITION_TIMEOUT = 13;
58516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int PERSIST_ANIMATION_SCALE = 14;
58526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int FORCE_GC = 15;
58536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int ENABLE_SCREEN = 16;
58546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int APP_FREEZE_TIMEOUT = 17;
58556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int SEND_NEW_CONFIGURATION = 18;
58566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int REPORT_WINDOWS_CHANGE = 19;
58576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int DRAG_START_TIMEOUT = 20;
58586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int DRAG_END_TIMEOUT = 21;
58596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        public static final int REPORT_HARD_KEYBOARD_STATUS_CHANGE = 22;
586006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
58619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Session mLastReportedHold;
586206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
58639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public H() {
58649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
586506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
58669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
58679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void handleMessage(Message msg) {
58689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (msg.what) {
58699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case REPORT_FOCUS_CHANGE: {
58709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowState lastFocus;
58719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowState newFocus;
587206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
58739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized(mWindowMap) {
58749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        lastFocus = mLastFocus;
58759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newFocus = mCurrentFocus;
58769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (lastFocus == newFocus) {
58779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Focus is not changing, so nothing to do.
58789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return;
58799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
58809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLastFocus = newFocus;
58818a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        //Slog.i(TAG, "Focus moving from " + lastFocus
58829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        //        + " to " + newFocus);
58839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (newFocus != null && lastFocus != null
58849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                && !newFocus.isDisplayedLw()) {
58858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            //Slog.i(TAG, "Delaying loss of focus...");
58869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLosingFocus.add(lastFocus);
58879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            lastFocus = null;
58889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
58899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
58909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
58919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (lastFocus != newFocus) {
58929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        //System.out.println("Changing focus from " + lastFocus
58939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        //                   + " to " + newFocus);
58949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (newFocus != null) {
58959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            try {
58968a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                //Slog.i(TAG, "Gaining focus: " + newFocus);
58979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                newFocus.mClient.windowFocusChanged(true, mInTouchMode);
58989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } catch (RemoteException e) {
58999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // Ignore if process has died.
59009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
59015e7833a571967d1dbc8618ac96ad6a379bcdf66aKonstantin Lopyrev                            notifyFocusChanged();
59029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
59039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (lastFocus != null) {
59059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            try {
59068a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                //Slog.i(TAG, "Losing focus: " + lastFocus);
59079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                lastFocus.mClient.windowFocusChanged(false, mInTouchMode);
59089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } catch (RemoteException e) {
59099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // Ignore if process has died.
59109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
59119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
5912664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato
5913664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                        mPolicy.focusChanged(lastFocus, newFocus);
59149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
59159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
59169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case REPORT_LOSING_FOCUS: {
59189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ArrayList<WindowState> losers;
591906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
59209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized(mWindowMap) {
59219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        losers = mLosingFocus;
59229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLosingFocus = new ArrayList<WindowState>();
59239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
59249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int N = losers.size();
59269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i=0; i<N; i++) {
59279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        try {
59288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            //Slog.i(TAG, "Losing delayed focus: " + losers.get(i));
59299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            losers.get(i).mClient.windowFocusChanged(false, mInTouchMode);
59309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } catch (RemoteException e) {
59319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                             // Ignore if process has died.
59329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
59339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
59349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
59359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case ANIMATE: {
59379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized(mWindowMap) {
59389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAnimationPending = false;
59399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        performLayoutAndPlaceSurfacesLocked();
59409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
59419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
59429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case ADD_STARTING: {
59449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final AppWindowToken wtoken = (AppWindowToken)msg.obj;
59459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final StartingData sd = wtoken.startingData;
59469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (sd == null) {
59489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Animation has been canceled... do nothing.
59499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return;
59509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
595106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
59528a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Add starting "
59539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + wtoken + ": pkg=" + sd.pkg);
595406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
59559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    View view = null;
59569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
59579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        view = mPolicy.addStartingWindow(
59589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.token, sd.pkg,
59599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sd.theme, sd.nonLocalizedLabel, sd.labelRes,
59607eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                            sd.icon, sd.windowFlags);
59619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (Exception e) {
59628a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "Exception when adding starting window", e);
59639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
59649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (view != null) {
59669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        boolean abort = false;
59679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        synchronized(mWindowMap) {
59699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (wtoken.removed || wtoken.startingData == null) {
59709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // If the window was successfully added, then
59719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // we need to remove it.
59729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (wtoken.startingWindow != null) {
59738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                    if (DEBUG_STARTING_WINDOW) Slog.v(TAG,
59749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            "Aborted starting " + wtoken
59759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + ": removed=" + wtoken.removed
59769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " startingData=" + wtoken.startingData);
59779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    wtoken.startingWindow = null;
59789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    wtoken.startingData = null;
59799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    abort = true;
59809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
59819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } else {
59829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                wtoken.startingView = view;
59839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
59848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_STARTING_WINDOW && !abort) Slog.v(TAG,
59859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Added starting " + wtoken
59869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + ": startingWindow="
59879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + wtoken.startingWindow + " startingView="
59889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + wtoken.startingView);
59899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
59909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (abort) {
59929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            try {
59939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                mPolicy.removeStartingWindow(wtoken.token, view);
59949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } catch (Exception e) {
59958a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.w(TAG, "Exception when removing starting window", e);
59969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
59979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
59989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
59999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
60009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
60019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case REMOVE_STARTING: {
60029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final AppWindowToken wtoken = (AppWindowToken)msg.obj;
60039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    IBinder token = null;
60049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    View view = null;
60059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (mWindowMap) {
60068a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Remove starting "
60079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + wtoken + ": startingWindow="
60089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + wtoken.startingWindow + " startingView="
60099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + wtoken.startingView);
60109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (wtoken.startingWindow != null) {
60119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            view = wtoken.startingView;
60129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            token = wtoken.token;
60139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.startingData = null;
60149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.startingView = null;
60159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.startingWindow = null;
60169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
60179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
60189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (view != null) {
60199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        try {
60209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mPolicy.removeStartingWindow(token, view);
60219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } catch (Exception e) {
60228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            Slog.w(TAG, "Exception when removing starting window", e);
60239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
60249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
60259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
60269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
60279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case FINISHED_STARTING: {
60289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    IBinder token = null;
60299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    View view = null;
60309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    while (true) {
60319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        synchronized (mWindowMap) {
60329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            final int N = mFinishedStarting.size();
60339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (N <= 0) {
60349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                break;
60359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
60369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AppWindowToken wtoken = mFinishedStarting.remove(N-1);
60379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
60388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_STARTING_WINDOW) Slog.v(TAG,
60399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Finished starting " + wtoken
60409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + ": startingWindow=" + wtoken.startingWindow
60419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + " startingView=" + wtoken.startingView);
60429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
60439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (wtoken.startingWindow == null) {
60449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                continue;
60459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
60469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
60479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            view = wtoken.startingView;
60489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            token = wtoken.token;
60499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.startingData = null;
60509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.startingView = null;
60519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.startingWindow = null;
60529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
60539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
60549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        try {
60559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mPolicy.removeStartingWindow(token, view);
60569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } catch (Exception e) {
60578a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            Slog.w(TAG, "Exception when removing starting window", e);
60589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
60599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
60609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
60619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
60629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case REPORT_APPLICATION_TOKEN_WINDOWS: {
60639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final AppWindowToken wtoken = (AppWindowToken)msg.obj;
60649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
60659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean nowVisible = msg.arg1 != 0;
60669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean nowGone = msg.arg2 != 0;
60679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
60689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
60698a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_VISIBILITY) Slog.v(
60709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                TAG, "Reporting visible in " + wtoken
60719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " visible=" + nowVisible
60729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " gone=" + nowGone);
60739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (nowVisible) {
60749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.appToken.windowsVisible();
60759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
60769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.appToken.windowsGone();
60779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
60789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (RemoteException ex) {
60799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
60809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } break;
608106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
60829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WINDOW_FREEZE_TIMEOUT: {
60839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (mWindowMap) {
60848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "Window freeze timeout expired.");
60859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int i = mWindows.size();
60869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        while (i > 0) {
60879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            i--;
6088e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                            WindowState w = mWindows.get(i);
60899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (w.mOrientationChanging) {
60909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mOrientationChanging = false;
60918a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.w(TAG, "Force clearing orientation change: " + w);
60929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
60939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
60949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        performLayoutAndPlaceSurfacesLocked();
60959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
60969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
60979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
609806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
60999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case HOLD_SCREEN_CHANGED: {
61009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Session oldHold;
61019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Session newHold;
61029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (mWindowMap) {
61039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        oldHold = mLastReportedHold;
61049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newHold = (Session)msg.obj;
61059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLastReportedHold = newHold;
61069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
610706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
61089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (oldHold != newHold) {
61099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        try {
61109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (oldHold != null) {
61119adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                                mBatteryStats.noteStopWakelock(oldHold.mUid, -1,
61129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "window",
61139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        BatteryStats.WAKE_TYPE_WINDOW);
61149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
61159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (newHold != null) {
61169adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                                mBatteryStats.noteStartWakelock(newHold.mUid, -1,
61179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "window",
61189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        BatteryStats.WAKE_TYPE_WINDOW);
61199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
61209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } catch (RemoteException e) {
61219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
61229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
61239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
61249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
612506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
61269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case APP_TRANSITION_TIMEOUT: {
61279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (mWindowMap) {
6128bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                        if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
61298a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
61309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "*** APP TRANSITION TIMEOUT");
61319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mAppTransitionReady = true;
61329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mAppTransitionTimeout = true;
61339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            performLayoutAndPlaceSurfacesLocked();
61349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
61359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
61369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
61379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
613806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
61399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case PERSIST_ANIMATION_SCALE: {
61409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.System.putFloat(mContext.getContentResolver(),
61419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Settings.System.WINDOW_ANIMATION_SCALE, mWindowAnimationScale);
61429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.System.putFloat(mContext.getContentResolver(),
61439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Settings.System.TRANSITION_ANIMATION_SCALE, mTransitionAnimationScale);
61449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
61459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
614606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
61479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case FORCE_GC: {
61489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized(mWindowMap) {
61499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mAnimationPending) {
61509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // If we are animating, don't do the gc now but
61519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // delay a bit so we don't interrupt the animation.
61529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mH.sendMessageDelayed(mH.obtainMessage(H.FORCE_GC),
61539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    2000);
61549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return;
61559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
61569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // If we are currently rotating the display, it will
61579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // schedule a new message when done.
61589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mDisplayFrozen) {
61599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return;
61609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
61619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFreezeGcPending = 0;
61629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
61639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Runtime.getRuntime().gc();
61649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
61659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
616606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
61679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case ENABLE_SCREEN: {
61689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    performEnableScreen();
61699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
61709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
617106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
61729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case APP_FREEZE_TIMEOUT: {
61739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (mWindowMap) {
61748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "App freeze timeout expired.");
61759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int i = mAppTokens.size();
61769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        while (i > 0) {
61779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            i--;
61789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AppWindowToken tok = mAppTokens.get(i);
61799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (tok.freezingScreen) {
61808a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.w(TAG, "Force clearing freeze: " + tok);
61819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                unsetAppFreezingScreenLocked(tok, true, true);
61829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
61839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
61849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
61859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
61869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
618706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6188e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                case SEND_NEW_CONFIGURATION: {
6189e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    removeMessages(SEND_NEW_CONFIGURATION);
6190e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    sendNewConfiguration();
6191c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                    break;
6192c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project                }
619306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
61946e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev                case REPORT_WINDOWS_CHANGE: {
6195dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                    if (mWindowsChanged) {
6196dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                        synchronized (mWindowMap) {
6197dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                            mWindowsChanged = false;
6198dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                        }
6199dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                        notifyWindowsChanged();
6200dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                    }
6201dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                    break;
6202dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                }
6203dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev
6204a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                case DRAG_START_TIMEOUT: {
6205a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    IBinder win = (IBinder)msg.obj;
6206a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    if (DEBUG_DRAG) {
6207a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        Slog.w(TAG, "Timeout starting drag by win " + win);
6208a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
6209a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    synchronized (mWindowMap) {
6210a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        // !!! TODO: ANR the app that has failed to start the drag in time
6211a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (mDragState != null) {
6212d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                            mDragState.unregister();
62132e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown                            mInputMonitor.updateInputWindowsLw(true /*force*/);
6214a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                            mDragState.reset();
6215a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                            mDragState = null;
6216a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        }
6217a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
6218d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    break;
6219a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                }
6220a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
6221d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                case DRAG_END_TIMEOUT: {
6222d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    IBinder win = (IBinder)msg.obj;
6223d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    if (DEBUG_DRAG) {
6224d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        Slog.w(TAG, "Timeout ending drag to win " + win);
6225d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    }
6226d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    synchronized (mWindowMap) {
6227d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        // !!! TODO: ANR the drag-receiving app
6228d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        mDragState.mDragResult = false;
6229d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        mDragState.endDragLw();
6230d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    }
6231d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    break;
6232d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                }
62332992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown
62342992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                case REPORT_HARD_KEYBOARD_STATUS_CHANGE: {
62352992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                    notifyHardKeyboardStatusChange();
62362992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                    break;
62372992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown                }
62389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
62399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
62409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
62419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
62439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // IWindowManager API
62449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
62459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public IWindowSession openSession(IInputMethodClient client,
62479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IInputContext inputContext) {
62489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (client == null) throw new IllegalArgumentException("null client");
62499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (inputContext == null) throw new IllegalArgumentException("null inputContext");
62506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        Session session = new Session(this, client, inputContext);
625146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        return session;
62529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
62539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean inputMethodClientHasFocus(IInputMethodClient client) {
62559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) {
62569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // The focus for the client is the window immediately below
62579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // where we would place the input method window.
62589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int idx = findDesiredInputMethodWindowIndexLocked(false);
62599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowState imFocus;
62609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (idx > 0) {
6261e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                imFocus = mWindows.get(idx-1);
6262e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                //Log.i(TAG, "Desired input method target: " + imFocus);
6263e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                //Log.i(TAG, "Current focus: " + this.mCurrentFocus);
6264e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                //Log.i(TAG, "Last focus: " + this.mLastFocus);
62659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (imFocus != null) {
6266e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // This may be a starting window, in which case we still want
6267e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // to count it as okay.
6268e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    if (imFocus.mAttrs.type == LayoutParams.TYPE_APPLICATION_STARTING
6269e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            && imFocus.mAppToken != null) {
6270e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        // The client has definitely started, so it really should
6271e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        // have a window in this app token.  Let's look for it.
6272e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        for (int i=0; i<imFocus.mAppToken.windows.size(); i++) {
6273e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            WindowState w = imFocus.mAppToken.windows.get(i);
6274e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            if (w != imFocus) {
6275e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                                //Log.i(TAG, "Switching to real app window: " + w);
6276e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                                imFocus = w;
6277e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                                break;
6278e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            }
6279e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        }
6280e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    }
6281e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    //Log.i(TAG, "IM target client: " + imFocus.mSession.mClient);
6282e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    //if (imFocus.mSession.mClient != null) {
6283e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    //    Log.i(TAG, "IM target client binder: " + imFocus.mSession.mClient.asBinder());
6284e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    //    Log.i(TAG, "Requesting client binder: " + client.asBinder());
6285e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    //}
62869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (imFocus.mSession.mClient != null &&
62879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            imFocus.mSession.mClient.asBinder() == client.asBinder()) {
62889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return true;
62899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6290e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn
6291e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // Okay, how about this...  what is the current focus?
6292e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // It seems in some cases we may not have moved the IM
6293e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // target window, such as when it was in a pop-up window,
6294e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // so let's also look at the current focus.  (An example:
6295e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // go to Gmail, start searching so the keyboard goes up,
6296e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // press home.  Sometimes the IME won't go down.)
6297e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // Would be nice to fix this more correctly, but it's
6298e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    // way at the end of a release, and this should be good enough.
6299e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    if (mCurrentFocus != null && mCurrentFocus.mSession.mClient != null &&
6300e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                            mCurrentFocus.mSession.mClient.asBinder() == client.asBinder()) {
6301e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                        return true;
6302e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn                    }
63039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
63049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
63059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
63069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
63079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
630806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
63099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
63109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Internals
63119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // -------------------------------------------------------------
63129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6313e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    final WindowState windowForClientLocked(Session session, IWindow client,
6314e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            boolean throwOnError) {
6315e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        return windowForClientLocked(session, client.asBinder(), throwOnError);
63169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
631706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6318e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    final WindowState windowForClientLocked(Session session, IBinder client,
6319e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            boolean throwOnError) {
63209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState win = mWindowMap.get(client);
63218a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (localLOGV) Slog.v(
63229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Looking up client " + client + ": " + win);
63239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (win == null) {
6324e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            RuntimeException ex = new IllegalArgumentException(
6325e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    "Requested window " + client + " does not exist");
6326e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            if (throwOnError) {
6327e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                throw ex;
6328e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
63298a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Failed looking up window", ex);
63309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
63319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
63329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (session != null && win.mSession != session) {
6333e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            RuntimeException ex = new IllegalArgumentException(
6334e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    "Requested window " + client + " is in session " +
6335e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    win.mSession + ", not " + session);
6336e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            if (throwOnError) {
6337e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                throw ex;
6338e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            }
63398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Failed looking up window", ex);
63409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
63419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
63429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return win;
63449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
63459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6346a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    final void rebuildAppWindowListLocked() {
6347a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        int NW = mWindows.size();
6348a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        int i;
63493b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        int lastWallpaper = -1;
63509bfb707597898f54722460b48588007b682f3e2aDianne Hackborn        int numRemoved = 0;
6351ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
6352f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        if (mRebuildTmp.length < NW) {
6353f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            mRebuildTmp = new WindowState[NW+10];
6354f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn        }
6355f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn
6356a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        // First remove all existing app windows.
6357a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        i=0;
6358a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        while (i < NW) {
6359e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState w = mWindows.get(i);
63603b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if (w.mAppToken != null) {
6361e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState win = mWindows.remove(i);
6362f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                win.mRebuilding = true;
6363f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                mRebuildTmp[numRemoved] = win;
6364dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev                mWindowsChanged = true;
63658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG,
6366bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                        "Rebuild removing window: " + win);
6367a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                NW--;
63689bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                numRemoved++;
6369a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                continue;
63703b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            } else if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_WALLPAPER
63713b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    && lastWallpaper == i-1) {
63723b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                lastWallpaper = i;
6373a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
6374a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            i++;
6375a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        }
6376ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
63773b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        // The wallpaper window(s) typically live at the bottom of the stack,
63783b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        // so skip them before adding app tokens.
63793b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        lastWallpaper++;
63803b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        i = lastWallpaper;
6381ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
6382bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        // First add all of the exiting app tokens...  these are no longer
6383bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        // in the main app list, but still have windows shown.  We put them
6384bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        // in the back because now that the animation is over we no longer
6385bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        // will care about them.
6386bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        int NT = mExitingAppTokens.size();
6387a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        for (int j=0; j<NT; j++) {
6388bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn            i = reAddAppWindowsLocked(i, mExitingAppTokens.get(j));
6389bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        }
6390ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
6391bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        // And add in the still active app tokens in Z order.
6392bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        NT = mAppTokens.size();
6393bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn        for (int j=0; j<NT; j++) {
6394bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn            i = reAddAppWindowsLocked(i, mAppTokens.get(j));
6395a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        }
6396ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
63973b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn        i -= lastWallpaper;
63989bfb707597898f54722460b48588007b682f3e2aDianne Hackborn        if (i != numRemoved) {
63998a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "Rebuild removed " + numRemoved
64009bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                    + " windows but added " + i);
6401f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            for (i=0; i<numRemoved; i++) {
6402f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                WindowState ws = mRebuildTmp[i];
6403f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (ws.mRebuilding) {
6404f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    StringWriter sw = new StringWriter();
6405f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    PrintWriter pw = new PrintWriter(sw);
6406f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    ws.dump(pw, "");
6407f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    pw.flush();
6408f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    Slog.w(TAG, "This window was lost: " + ws);
6409f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    Slog.w(TAG, sw.toString());
6410f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                }
6411f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            }
6412f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            Slog.w(TAG, "Current app token list:");
6413f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            dumpAppTokensLocked();
6414f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            Slog.w(TAG, "Final window list:");
6415f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            dumpWindowsLocked();
64169bfb707597898f54722460b48588007b682f3e2aDianne Hackborn        }
6417a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn    }
6418ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
64199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void assignLayersLocked() {
64209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int N = mWindows.size();
64219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int curBaseLayer = 0;
64229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int curLayer = 0;
64239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i;
642406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
64256c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn        if (DEBUG_LAYERS) {
64266c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            RuntimeException here = new RuntimeException("here");
64276c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            here.fillInStackTrace();
64286c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            Log.v(TAG, "Assigning layers", here);
64296c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn        }
64306c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn
64319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=0; i<N; i++) {
6432e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState w = mWindows.get(i);
64337341d7a104b47996445d069a695e155a07184606Dianne Hackborn            if (w.mBaseLayer == curBaseLayer || w.mIsImWindow
64347341d7a104b47996445d069a695e155a07184606Dianne Hackborn                    || (i > 0 && w.mIsWallpaper)) {
64359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                curLayer += WINDOW_LAYER_MULTIPLIER;
64369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mLayer = curLayer;
64379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
64389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                curBaseLayer = curLayer = w.mBaseLayer;
64399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mLayer = curLayer;
64409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
64419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (w.mTargetAppToken != null) {
64429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mAnimLayer = w.mLayer + w.mTargetAppToken.animLayerAdjustment;
64439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (w.mAppToken != null) {
64449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mAnimLayer = w.mLayer + w.mAppToken.animLayerAdjustment;
64459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
64469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mAnimLayer = w.mLayer;
64479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
64489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (w.mIsImWindow) {
64499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.mAnimLayer += mInputMethodAnimLayerAdjustment;
6450759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn            } else if (w.mIsWallpaper) {
6451759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                w.mAnimLayer += mWallpaperAnimLayerAdjustment;
64529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
64538a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (DEBUG_LAYERS) Slog.v(TAG, "Assign layer " + w + ": "
64549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + w.mAnimLayer);
64559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //System.out.println(
64569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //    "Assigned layer " + curLayer + " to " + w.mClient.asBinder());
64579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
64589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
64599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
64609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mInLayout = false;
64619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void performLayoutAndPlaceSurfacesLocked() {
64629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mInLayout) {
6463cfe6524071624b6679e5fa4db847328e8d0317c8Dave Bort            if (DEBUG) {
64649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException("Recursive call!");
64659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
64668a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.w(TAG, "performLayoutAndPlaceSurfacesLocked called while in layout");
64679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
64689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
64699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6470e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        if (mWaitingForConfig) {
6471e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // Our configuration has changed (most likely rotation), but we
6472e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // don't yet have the complete configuration to report to
6473e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            // applications.  Don't do any window layout until we have it.
6474e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            return;
6475e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        }
6476e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
6477ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        if (mDisplay == null) {
6478ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            // Not yet initialized, nothing to do.
6479ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            return;
6480ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
6481ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
64822e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn        mInLayout = true;
64839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean recoveringMemory = false;
64842e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn
64852e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn        try {
64862e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn            if (mForceRemoves != null) {
64872e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                recoveringMemory = true;
6488f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                // Wait a little bit for things to settle down, and off we go.
64892e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                for (int i=0; i<mForceRemoves.size(); i++) {
64902e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                    WindowState ws = mForceRemoves.get(i);
64912e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                    Slog.i(TAG, "Force removing: " + ws);
64922e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                    removeWindowInnerLocked(ws.mSession, ws);
64932e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                }
64942e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                mForceRemoves = null;
64952e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                Slog.w(TAG, "Due to memory failure, waiting a bit for next layout");
64962e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                Object tmp = new Object();
64972e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                synchronized (tmp) {
64982e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                    try {
64992e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                        tmp.wait(250);
65002e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                    } catch (InterruptedException e) {
65012e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn                    }
65029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
65039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
65042e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn        } catch (RuntimeException e) {
65052e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn            Slog.e(TAG, "Unhandled exception while force removing for memory", e);
65069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
65072e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn
65089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
65099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            performLayoutAndPlaceSurfacesLockedInner(recoveringMemory);
651006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6511f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            int N = mPendingRemove.size();
6512f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            if (N > 0) {
6513f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (mPendingRemoveTmp.length < N) {
6514f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    mPendingRemoveTmp = new WindowState[N+10];
65159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6516f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                mPendingRemove.toArray(mPendingRemoveTmp);
65179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPendingRemove.clear();
6518f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                for (int i=0; i<N; i++) {
6519f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    WindowState w = mPendingRemoveTmp[i];
6520f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    removeWindowInnerLocked(w.mSession, w);
6521f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                }
65229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
65239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInLayout = false;
65249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                assignLayersLocked();
65259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutNeeded = true;
65269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                performLayoutAndPlaceSurfacesLocked();
65279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
65289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
65299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mInLayout = false;
65309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mLayoutNeeded) {
65319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    requestAnimationLocked(0);
65329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
65339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6534dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            if (mWindowsChanged && !mWindowChangeListeners.isEmpty()) {
65356e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev                mH.removeMessages(H.REPORT_WINDOWS_CHANGE);
65366e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev                mH.sendMessage(mH.obtainMessage(H.REPORT_WINDOWS_CHANGE));
6537dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev            }
65389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
65399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInLayout = false;
65408a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.e(TAG, "Unhandled exception while layout out windows", e);
65419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
65429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
65439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
65443a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown    private final int performLayoutLockedInner(boolean initial, boolean updateInputWindows) {
6545b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        if (!mLayoutNeeded) {
6546b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            return 0;
6547b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        }
6548b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
6549b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        mLayoutNeeded = false;
6550b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
65519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int dw = mDisplay.getWidth();
65529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int dh = mDisplay.getHeight();
65539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
65549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = mWindows.size();
65559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i;
65569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
65578a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_LAYOUT) Slog.v(TAG, "performLayout: needed="
65589b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn                + mLayoutNeeded + " dw=" + dw + " dh=" + dh);
65599b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn
6560b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        mPolicy.beginLayoutLw(dw, dh);
656106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6562b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        int seq = mLayoutSeq+1;
6563b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        if (seq < 0) seq = 0;
6564b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        mLayoutSeq = seq;
6565b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
6566b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        // First perform layout of any root windows (not attached
6567b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        // to another window).
6568b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        int topAttached = -1;
6569b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        for (i = N-1; i >= 0; i--) {
6570e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState win = mWindows.get(i);
6571b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
6572b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // Don't do layout of a window if it is not visible, or
6573b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // soon won't be visible, to avoid wasting time and funky
6574b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // changes while a window is animating away.
6575b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            final AppWindowToken atoken = win.mAppToken;
6576b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            final boolean gone = win.mViewVisibility == View.GONE
6577b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    || !win.mRelayoutCalled
6578ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn                    || (atoken == null && win.mRootToken.hidden)
6579b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    || (atoken != null && atoken.hiddenRequested)
6580b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    || win.mAttachedHidden
6581b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    || win.mExiting || win.mDestroying;
6582b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
65831c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn            if (DEBUG_LAYOUT && !win.mLayoutAttached) {
65841c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                Slog.v(TAG, "First pass " + win
6585b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + ": gone=" + gone + " mHaveFrame=" + win.mHaveFrame
6586b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + " mLayoutAttached=" + win.mLayoutAttached);
65871c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                if (gone) Slog.v(TAG, "  (mViewVisibility="
6588b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + win.mViewVisibility + " mRelayoutCalled="
6589b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + win.mRelayoutCalled + " hidden="
6590b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + win.mRootToken.hidden + " hiddenRequested="
6591b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + (atoken != null && atoken.hiddenRequested)
6592b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + " mAttachedHidden=" + win.mAttachedHidden);
6593b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            }
6594e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
6595b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // If this view is GONE, then skip it -- keep the current
6596b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // frame, and let the caller know so they can ignore it
6597b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // if they want.  (We do the normal layout for INVISIBLE
6598b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // windows, since that means "perform layout as normal,
6599b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            // just don't display").
6600b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            if (!gone || !win.mHaveFrame) {
6601e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                if (!win.mLayoutAttached) {
66028e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                    if (initial) {
66030f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                        //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial");
66048e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        win.mContentChanged = false;
66058e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                    }
6606b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    mPolicy.layoutWindowLw(win, win.mAttrs, null);
6607b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    win.mLayoutSeq = seq;
6608b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (DEBUG_LAYOUT) Slog.v(TAG, "-> mFrame="
6609b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + win.mFrame + " mContainingFrame="
6610b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + win.mContainingFrame + " mDisplayFrame="
6611b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + win.mDisplayFrame);
6612b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                } else {
6613b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (topAttached < 0) topAttached = i;
66149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
66159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6616b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        }
661706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
6618b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        // Now perform layout of attached windows, which usually
6619b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        // depend on the position of the window they are attached to.
6620b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        // XXX does not deal with windows that are attached to windows
6621b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        // that are themselves attached.
6622b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        for (i = topAttached; i >= 0; i--) {
6623e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            WindowState win = mWindows.get(i);
66249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6625b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            if (win.mLayoutAttached) {
6626b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (DEBUG_LAYOUT) Slog.v(TAG, "Second pass " + win
6627b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + " mHaveFrame=" + win.mHaveFrame
6628b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + " mViewVisibility=" + win.mViewVisibility
6629b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + " mRelayoutCalled=" + win.mRelayoutCalled);
66301c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                // If this view is GONE, then skip it -- keep the current
66311c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                // frame, and let the caller know so they can ignore it
66321c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                // if they want.  (We do the normal layout for INVISIBLE
66331c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                // windows, since that means "perform layout as normal,
66341c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                // just don't display").
6635b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if ((win.mViewVisibility != View.GONE && win.mRelayoutCalled)
6636b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        || !win.mHaveFrame) {
66378e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                    if (initial) {
66380f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                        //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial");
66398e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        win.mContentChanged = false;
66408e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                    }
6641b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    mPolicy.layoutWindowLw(win, win.mAttrs, win.mAttachedWindow);
6642b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    win.mLayoutSeq = seq;
6643b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (DEBUG_LAYOUT) Slog.v(TAG, "-> mFrame="
6644b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + win.mFrame + " mContainingFrame="
6645b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + win.mContainingFrame + " mDisplayFrame="
6646b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            + win.mDisplayFrame);
66479bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                }
6648958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            }
66499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6650349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
6651349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        // Window frames may have changed.  Tell the input dispatcher about it.
66523a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        mInputMonitor.setUpdateInputWindowsNeededLw();
66533a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        if (updateInputWindows) {
66542e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown            mInputMonitor.updateInputWindowsLw(false /*force*/);
66553a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        }
6656b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
6657b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn        return mPolicy.finishLayoutLw();
66589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
665906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
66606804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    // "Something has changed!  Let's make it correct now."
66619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void performLayoutAndPlaceSurfacesLockedInner(
66629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean recoveringMemory) {
666334bcebca707187393263183aa4dab32728763f2fJoe Onorato        if (mDisplay == null) {
666434bcebca707187393263183aa4dab32728763f2fJoe Onorato            Slog.i(TAG, "skipping performLayoutAndPlaceSurfacesLockedInner with no mDisplay");
666534bcebca707187393263183aa4dab32728763f2fJoe Onorato            return;
666634bcebca707187393263183aa4dab32728763f2fJoe Onorato        }
666734bcebca707187393263183aa4dab32728763f2fJoe Onorato
66689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long currentTime = SystemClock.uptimeMillis();
66699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int dw = mDisplay.getWidth();
66709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int dh = mDisplay.getHeight();
66719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
66729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i;
66739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6674b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn        if (mFocusMayChange) {
6675b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn            mFocusMayChange = false;
66763a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown            updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
66773a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    false /*updateInputWindows*/);
6678b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn        }
6679b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn
66809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Initialize state of exiting tokens.
66819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=mExitingTokens.size()-1; i>=0; i--) {
66829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mExitingTokens.get(i).hasVisible = false;
66839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
66849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
66859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Initialize state of exiting applications.
66869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=mExitingAppTokens.size()-1; i>=0; i--) {
66879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mExitingAppTokens.get(i).hasVisible = false;
66889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
66899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
66909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean orientationChangeComplete = true;
66919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Session holdScreen = null;
66929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float screenBrightness = -1;
6693fb73f79340375013225618a5d87f46b958f698efMike Lockwood        float buttonBrightness = -1;
66949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean focusDisplayed = false;
66959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean animating = false;
6696fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        boolean createWatermark = false;
669789ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        boolean updateRotation = false;
669850660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn        boolean screenRotationFinished = false;
6699fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
6700fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        if (mFxSession == null) {
6701fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn            mFxSession = new SurfaceSession();
6702fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn            createWatermark = true;
6703fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
6704fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
670594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn        if (SHOW_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION performLayoutAndPlaceSurfaces");
67069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Surface.openTransaction();
6708fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
6709fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        if (createWatermark) {
6710fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn            createWatermark();
6711fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
6712fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        if (mWatermark != null) {
6713fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn            mWatermark.positionSurface(dw, dh);
6714fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
67156804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        if (mStrictModeFlash != null) {
67166804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            mStrictModeFlash.positionSurface(dw, dh);
67176804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        }
6718fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
67199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6720de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn            boolean wallpaperForceHidingChanged = false;
6721b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            int repeats = 0;
6722b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            int changes = 0;
6723b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
67249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            do {
6725b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                repeats++;
6726b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (repeats > 6) {
6727b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    Slog.w(TAG, "Animation repeat aborted after too many iterations");
6728b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    mLayoutNeeded = false;
6729b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    break;
6730b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                }
6731b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
6732b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if ((changes&(WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER
6733b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        | WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG
6734b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        | WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT)) != 0) {
6735b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
6736b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        if ((adjustWallpaperWindowsLocked()&ADJUST_WALLPAPER_LAYERS_CHANGED) != 0) {
6737b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            assignLayersLocked();
6738b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            mLayoutNeeded = true;
6739b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        }
6740b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
6741b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG) != 0) {
6742b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        if (DEBUG_LAYOUT) Slog.v(TAG, "Computing new config from layout");
674394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        if (updateOrientationFromAppTokensLocked(true)) {
6744b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            mLayoutNeeded = true;
6745b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
6746b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        }
6747b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
6748b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT) != 0) {
6749b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        mLayoutNeeded = true;
6750b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
6751b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                }
6752b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
6753b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                // FIRST LOOP: Perform a layout, if needed.
6754b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (repeats < 4) {
67553a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    changes = performLayoutLockedInner(repeats == 0, false /*updateInputWindows*/);
6756b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    if (changes != 0) {
6757b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        continue;
6758b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    }
6759b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                } else {
6760b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    Slog.w(TAG, "Layout repeat skipped after too many iterations");
6761b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    changes = 0;
6762b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                }
6763b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
67649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int transactionSequence = ++mTransactionSequence;
67659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Update animations of all applications, including those
67679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // associated with exiting/removed apps
67689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean tokensAnimating = false;
67699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int NAT = mAppTokens.size();
67709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (i=0; i<NAT; i++) {
67719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mAppTokens.get(i).stepAnimationLocked(currentTime, dw, dh)) {
67729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        tokensAnimating = true;
67739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
67749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
67759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int NEAT = mExitingAppTokens.size();
67769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (i=0; i<NEAT; i++) {
67779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mExitingAppTokens.get(i).stepAnimationLocked(currentTime, dw, dh)) {
67789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        tokensAnimating = true;
67799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
67809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
67819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6782b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                // SECOND LOOP: Execute animations and update visibility of windows.
6783b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn
67848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "*** ANIM STEP: seq="
6785de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        + transactionSequence + " tokensAnimating="
6786de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        + tokensAnimating);
6787de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn
67889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                animating = tokensAnimating;
67899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6790f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                if (mScreenRotationAnimation != null) {
6791f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                    if (mScreenRotationAnimation.isAnimating()) {
6792f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                        if (mScreenRotationAnimation.stepAnimation(currentTime)) {
6793f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                            animating = true;
6794f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                        } else {
679550660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn                            screenRotationFinished = true;
679689ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                            updateRotation = true;
6797f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                        }
6798f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                    }
6799f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                }
6800f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn
68019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean tokenMayBeDrawn = false;
68026c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                boolean wallpaperMayChange = false;
6803b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                boolean forceHiding = false;
68046c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                WindowState windowDetachedWallpaper = null;
68059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPolicy.beginAnimationLw(dw, dh);
68079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6808bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn                final int N = mWindows.size();
6809ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
68109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (i=N-1; i>=0; i--) {
6811e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    WindowState w = mWindows.get(i);
68129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final WindowManager.LayoutParams attrs = w.mAttrs;
68149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (w.mSurface != null) {
68168e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        // Take care of the window being ready to display.
68176c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                        if (w.commitFinishDrawingLocked(currentTime)) {
68186c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                            if ((w.mAttrs.flags
68196c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                                    & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) {
68208a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_WALLPAPER) Slog.v(TAG,
68210586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                        "First draw done in potential wallpaper target " + w);
68226c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                                wallpaperMayChange = true;
68236c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                            }
68246c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                        }
6825ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
68266c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        final boolean wasAnimating = w.mAnimating;
68278e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn
68288e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        int animDw = dw;
68298e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        int animDh = dh;
68308e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn
68318e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        // If the window has moved due to its containing
68328e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        // content frame changing, then we'd like to animate
68338e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        // it.  The checks here are ordered by what is least
68343fe7f2f2e35692fe563ae00f62995030f1987c4fJoe Onorato                        // likely to be true first.
68351c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                        if (w.shouldAnimateMove()) {
68368e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            // Frame has moved, containing content frame
68378e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            // has also moved, and we're not currently animating...
68388e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            // let's do something.
68398e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            Animation a = AnimationUtils.loadAnimation(mContext,
68408e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                                    com.android.internal.R.anim.window_move_from_decor);
68418e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            w.setAnimation(a);
68428e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            animDw = w.mLastFrame.left - w.mFrame.left;
68438e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                            animDh = w.mLastFrame.top - w.mFrame.top;
68448e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        }
68458e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn
68468e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        // Execute animation.
68478e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                        final boolean nowAnimating = w.stepAnimationLocked(currentTime,
68488e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn                                animDw, animDh);
68496c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn
68506c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        // If this window is animating, make a note that we have
68516c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        // an animating window and take care of a request to run
68526c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        // a detached wallpaper animation.
68536c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        if (nowAnimating) {
68546c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                            if (w.mAnimation != null && w.mAnimation.getDetachWallpaper()) {
68556c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                                windowDetachedWallpaper = w;
68566c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                            }
68579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            animating = true;
68589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
68596c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn
68606c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        // If this window's app token is running a detached wallpaper
68616c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        // animation, make a note so we can ensure the wallpaper is
68626c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        // displayed behind it.
68636c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        if (w.mAppToken != null && w.mAppToken.animation != null
68646c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                                && w.mAppToken.animation.getDetachWallpaper()) {
68656c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                            windowDetachedWallpaper = w;
68666c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                        }
68676c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn
68686136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                        if (wasAnimating && !w.mAnimating && mWallpaperTarget == w) {
68696136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                            wallpaperMayChange = true;
68706136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn                        }
6871ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
68723b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        if (mPolicy.doesForceHide(w, attrs)) {
68736c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                            if (!wasAnimating && nowAnimating) {
687420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                if (DEBUG_VISIBILITY) Slog.v(TAG,
68756c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                                        "Animation started that could impact force hide: "
687620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        + w);
68773b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                wallpaperForceHidingChanged = true;
6878b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                                mFocusMayChange = true;
68793b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            } else if (w.isReadyForDisplay() && w.mAnimation == null) {
68803b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                forceHiding = true;
68813b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            }
68823b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        } else if (mPolicy.canBeForceHidden(w, attrs)) {
68833b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            boolean changed;
68843b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            if (forceHiding) {
68853b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                changed = w.hideLw(false, false);
688620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                if (DEBUG_VISIBILITY && changed) Slog.v(TAG,
688720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        "Now policy hidden: " + w);
68883b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            } else {
68893b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                changed = w.showLw(false, false);
689020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                if (DEBUG_VISIBILITY && changed) Slog.v(TAG,
689120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        "Now policy shown: " + w);
689220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                if (changed) {
689320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                    if (wallpaperForceHidingChanged
6894b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                            && w.isVisibleNow() /*w.isReadyForDisplay()*/) {
689520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // Assume we will need to animate.  If
689620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // we don't (because the wallpaper will
689720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // stay with the lock screen), then we will
689820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // clean up later.
689920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        Animation a = mPolicy.createForceHideEnterAnimation();
690020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        if (a != null) {
690120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                            w.setAnimation(a);
690220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        }
690320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                    }
690420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                    if (mCurrentFocus == null ||
690520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                            mCurrentFocus.mLayer < w.mLayer) {
690620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // We are showing on to of the current
690720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // focus, so re-evaluate focus to make
690820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        // sure it is correct.
690920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                                        mFocusMayChange = true;
69103b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                    }
69113b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                }
69123b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            }
69133b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            if (changed && (attrs.flags
69143b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                    & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) {
69153b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                wallpaperMayChange = true;
69163b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            }
69173b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        }
6918ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
69199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mPolicy.animatingWindowLw(w, attrs);
69209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
69219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final AppWindowToken atoken = w.mAppToken;
69239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (atoken != null && (!atoken.allDrawn || atoken.freezingScreen)) {
69249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (atoken.lastTransactionSequence != transactionSequence) {
69259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            atoken.lastTransactionSequence = transactionSequence;
69269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            atoken.numInterestingWindows = atoken.numDrawnWindows = 0;
69279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            atoken.startingDisplayed = false;
69289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
69299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if ((w.isOnScreen() || w.mAttrs.type
69309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                == WindowManager.LayoutParams.TYPE_BASE_APPLICATION)
69319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                && !w.mExiting && !w.mDestroying) {
69329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) {
69338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.v(TAG, "Eval win " + w + ": isDrawn="
69347433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn                                        + w.isDrawnLw()
69359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + ", isAnimating=" + w.isAnimating());
69367433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn                                if (!w.isDrawnLw()) {
69378a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                    Slog.v(TAG, "Not displayed: s=" + w.mSurface
69389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " pv=" + w.mPolicyVisibility
69399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " dp=" + w.mDrawPending
69409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " cdp=" + w.mCommitDrawPending
69419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " ah=" + w.mAttachedHidden
69429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " th=" + atoken.hiddenRequested
69439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            + " a=" + w.mAnimating);
69449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
69459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
69469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (w != atoken.startingWindow) {
69479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (!atoken.freezingScreen || !w.mAppFreezing) {
69489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    atoken.numInterestingWindows++;
69497433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn                                    if (w.isDrawnLw()) {
69509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        atoken.numDrawnWindows++;
69518a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                        if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) Slog.v(TAG,
69529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                "tokenMayBeDrawn: " + atoken
69539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                + " freezingScreen=" + atoken.freezingScreen
69549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                + " mAppFreezing=" + w.mAppFreezing);
69559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        tokenMayBeDrawn = true;
69569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    }
69579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
69587433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn                            } else if (w.isDrawnLw()) {
69599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                atoken.startingDisplayed = true;
69609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
69619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
69629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (w.mReadyToShow) {
69639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.performShowLocked();
69649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
69659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
69669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6967b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                changes |= mPolicy.finishAnimationLw();
69689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (tokenMayBeDrawn) {
69709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // See if any windows have been drawn, so they (and others
69719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // associated with them) can now be shown.
6972f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                    final int NT = mAppTokens.size();
69739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (i=0; i<NT; i++) {
6974f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                        AppWindowToken wtoken = mAppTokens.get(i);
69759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (wtoken.freezingScreen) {
69769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int numInteresting = wtoken.numInterestingWindows;
69779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
69788a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_VISIBILITY) Slog.v(TAG,
69799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "allDrawn: " + wtoken
69809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " interesting=" + numInteresting
69819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " drawn=" + wtoken.numDrawnWindows);
69829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                wtoken.showAllWindowsLocked();
69839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                unsetAppFreezingScreenLocked(wtoken, false, true);
69849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                orientationChangeComplete = true;
69859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
69869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (!wtoken.allDrawn) {
69879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int numInteresting = wtoken.numInterestingWindows;
69889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
69898a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_VISIBILITY) Slog.v(TAG,
69909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "allDrawn: " + wtoken
69919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " interesting=" + numInteresting
69929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " drawn=" + wtoken.numDrawnWindows);
69939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                wtoken.allDrawn = true;
6994b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
69959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // We can now show all of the drawn windows!
69979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (!mOpeningApps.contains(wtoken)) {
69989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    wtoken.showAllWindowsLocked();
69999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
70009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
70019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
70029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
70039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
70049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If we are ready to perform an app transition, check through
70069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // all of the app tokens to be shown and see if they are ready
70079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // to go.
70089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mAppTransitionReady) {
70099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int NN = mOpeningApps.size();
70109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean goodToGo = true;
70118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
70129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "Checking " + NN + " opening apps (frozen="
70139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mDisplayFrozen + " timeout="
70149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mAppTransitionTimeout + ")...");
70159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mDisplayFrozen && !mAppTransitionTimeout) {
70169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // If the display isn't frozen, wait to do anything until
70179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // all of the apps are ready.  Otherwise just go because
70189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // we'll unfreeze the display when everyone is ready.
70199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (i=0; i<NN && goodToGo; i++) {
70209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AppWindowToken wtoken = mOpeningApps.get(i);
70218a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
70229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Check opening app" + wtoken + ": allDrawn="
70239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + wtoken.allDrawn + " startingDisplayed="
70249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + wtoken.startingDisplayed);
70259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (!wtoken.allDrawn && !wtoken.startingDisplayed
70269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    && !wtoken.startingMoved) {
70279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                goodToGo = false;
70289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
70299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
70309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
70319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (goodToGo) {
70328a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO");
70339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int transit = mNextAppTransition;
70349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mSkipAppTransitionAnimation) {
7035bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                            transit = WindowManagerPolicy.TRANSIT_UNSET;
70369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
7037bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn                        mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET;
70389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAppTransitionReady = false;
7039a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        mAppTransitionRunning = true;
70409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAppTransitionTimeout = false;
70419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mStartingIconInTransition = false;
70429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mSkipAppTransitionAnimation = false;
70439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mH.removeMessages(H.APP_TRANSITION_TIMEOUT);
70459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7046a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // If there are applications waiting to come to the
7047a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // top of the stack, now is the time to move their windows.
7048a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // (Note that we don't do apps going to the bottom
7049a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // here -- we want to keep their windows in the old
7050a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        // Z-order until the animation completes.)
7051a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        if (mToTopApps.size() > 0) {
7052a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                            NN = mAppTokens.size();
7053a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                            for (i=0; i<NN; i++) {
7054a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                                AppWindowToken wtoken = mAppTokens.get(i);
7055a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                                if (wtoken.sendingToTop) {
7056a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                                    wtoken.sendingToTop = false;
7057a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                                    moveAppWindowsLocked(wtoken, NN, false);
7058a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                                }
7059a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                            }
7060a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                            mToTopApps.clear();
7061a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                        }
7062ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
706325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        WindowState oldWallpaper = mWallpaperTarget;
7064ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
70653be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                        adjustWallpaperWindowsLocked();
70666c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                        wallpaperMayChange = false;
7067ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7068bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // The top-most window will supply the layout params,
7069bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // and we will determine it below.
7070bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        LayoutParams animLp = null;
7071bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        int bestAnimLayer = -1;
707208121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                        boolean fullscreenAnim = false;
7073ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
70748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
70753be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                                "New wallpaper target=" + mWallpaperTarget
70763be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                                + ", lower target=" + mLowerWallpaperTarget
70773be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn                                + ", upper target=" + mUpperWallpaperTarget);
707825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        int foundWallpapers = 0;
7079bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // Do a first pass through the tokens for two
7080bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // things:
7081bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // (1) Determine if both the closing and opening
7082bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // app token sets are wallpaper targets, in which
7083bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // case special animations are needed
7084bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // (since the wallpaper needs to stay static
7085bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // behind them).
7086bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // (2) Find the layout params of the top-most
7087bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // application window in the tokens, which is
7088bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        // what will control the animation theme.
7089bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        final int NC = mClosingApps.size();
7090bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        NN = NC + mOpeningApps.size();
7091bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                        for (i=0; i<NN; i++) {
7092bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            AppWindowToken wtoken;
7093bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            int mode;
7094bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            if (i < NC) {
7095bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                wtoken = mClosingApps.get(i);
7096bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                mode = 1;
7097bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            } else {
7098bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                wtoken = mOpeningApps.get(i-NC);
7099bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                mode = 2;
7100f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                            }
7101bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            if (mLowerWallpaperTarget != null) {
7102bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                if (mLowerWallpaperTarget.mAppToken == wtoken
7103bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                        || mUpperWallpaperTarget.mAppToken == wtoken) {
7104bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                    foundWallpapers |= mode;
7105f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                                }
7106bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            }
7107bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            if (wtoken.appFullscreen) {
7108bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                WindowState ws = wtoken.findMainWindow();
7109bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                if (ws != null) {
7110bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                    // If this is a compatibility mode
7111bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                    // window, we will always use its anim.
7112bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                    if ((ws.mAttrs.flags&FLAG_COMPATIBLE_WINDOW) != 0) {
7113bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                        animLp = ws.mAttrs;
7114bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                        bestAnimLayer = Integer.MAX_VALUE;
711508121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                                    } else if (!fullscreenAnim || ws.mLayer > bestAnimLayer) {
711608121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                                        animLp = ws.mAttrs;
711708121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                                        bestAnimLayer = ws.mLayer;
711808121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                                    }
711908121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                                    fullscreenAnim = true;
712008121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                                }
712108121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                            } else if (!fullscreenAnim) {
712208121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                                WindowState ws = wtoken.findMainWindow();
712308121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                                if (ws != null) {
712408121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn                                    if (ws.mLayer > bestAnimLayer) {
7125bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                        animLp = ws.mAttrs;
7126bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                        bestAnimLayer = ws.mLayer;
7127bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                                    }
7128f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                                }
7129f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                            }
713025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        }
7131ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
713225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        if (foundWallpapers == 3) {
71338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
713425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    "Wallpaper animation!");
713525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            switch (transit) {
713625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN:
713725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                case WindowManagerPolicy.TRANSIT_TASK_OPEN:
713825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                case WindowManagerPolicy.TRANSIT_TASK_TO_FRONT:
713925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    transit = WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_OPEN;
714025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    break;
714125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                case WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE:
714225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                case WindowManagerPolicy.TRANSIT_TASK_CLOSE:
714325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                case WindowManagerPolicy.TRANSIT_TASK_TO_BACK:
714425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    transit = WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_CLOSE;
714525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    break;
7146f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                            }
71478a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
714825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    "New transit: " + transit);
714925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        } else if (oldWallpaper != null) {
715025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            // We are transitioning from an activity with
715125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            // a wallpaper to one without.
715225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            transit = WindowManagerPolicy.TRANSIT_WALLPAPER_CLOSE;
71538a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
715425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    "New transit away from wallpaper: " + transit);
715525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                        } else if (mWallpaperTarget != null) {
715625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            // We are transitioning from an activity without
715725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            // a wallpaper to now showing the wallpaper
715825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                            transit = WindowManagerPolicy.TRANSIT_WALLPAPER_OPEN;
71598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
716025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                                    "New transit into wallpaper: " + transit);
7161f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn                        }
7162ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7163de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        // If all closing windows are obscured, then there is
7164de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        // no need to do an animation.  This is the case, for
7165de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        // example, when this transition is being done behind
7166de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        // the lock screen.
7167de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        if (!mPolicy.allowAppAnimationsLw()) {
7168de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            animLp = null;
7169de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        }
7170de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn
71719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        NN = mOpeningApps.size();
71729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (i=0; i<NN; i++) {
71739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AppWindowToken wtoken = mOpeningApps.get(i);
71748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
71759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Now opening app" + wtoken);
71769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.reportedVisible = false;
71779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.inPendingTransaction = false;
717883360b3167f2c394125b74f655bc577070cb9ccaDianne Hackborn                            wtoken.animation = null;
7179bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            setTokenVisibilityLocked(wtoken, animLp, true, transit, false);
71809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.updateReportedVisibilityLocked();
7181a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                            wtoken.waitingToShow = false;
71829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.showAllWindowsLocked();
71839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
71849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        NN = mClosingApps.size();
71859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (i=0; i<NN; i++) {
71869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AppWindowToken wtoken = mClosingApps.get(i);
71878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
71889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Now closing app" + wtoken);
71899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.inPendingTransaction = false;
719083360b3167f2c394125b74f655bc577070cb9ccaDianne Hackborn                            wtoken.animation = null;
7191bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn                            setTokenVisibilityLocked(wtoken, animLp, false, transit, false);
71929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.updateReportedVisibilityLocked();
7193a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                            wtoken.waitingToHide = false;
71949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Force the allDrawn flag, because we want to start
71959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // this guy's animations regardless of whether it's
71969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // gotten drawn.
71979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            wtoken.allDrawn = true;
71989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
71999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
72008b571a817cc953ce96750f440645f104c7f55157Dianne Hackborn                        mNextAppTransitionPackage = null;
7201ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
72029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mOpeningApps.clear();
72039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mClosingApps.clear();
72049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
72059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // This has changed the visibility of windows, so perform
72069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // a new layout to get them all up-to-date.
720794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT
720894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                                | WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG;
72099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLayoutNeeded = true;
721020583ff9d49257bd4ccc60e7b6337661e34ed887Dianne Hackborn                        if (!moveInputMethodWindowsIfNeededLocked(true)) {
721120583ff9d49257bd4ccc60e7b6337661e34ed887Dianne Hackborn                            assignLayersLocked();
721220583ff9d49257bd4ccc60e7b6337661e34ed887Dianne Hackborn                        }
72133a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                        updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES,
72143a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                                false /*updateInputWindows*/);
7215b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                        mFocusMayChange = false;
72169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
72179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7218ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
721916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                int adjResult = 0;
722016064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn
7221a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                if (!animating && mAppTransitionRunning) {
7222a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // We have finished the animation of an app transition.  To do
7223a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // this, we have delayed a lot of operations like showing and
7224a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // hiding apps, moving apps in Z-order, etc.  The app token list
7225a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // reflects the correct Z-order, but the window list may now
7226a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // be out of sync with it.  So here we will just rebuild the
7227a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // entire app window list.  Fun!
7228a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    mAppTransitionRunning = false;
7229a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    // Clear information about apps that were moving.
7230a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    mToBottomApps.clear();
7231ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7232a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    rebuildAppWindowListLocked();
7233b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT;
723416064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                    adjResult |= ADJUST_WALLPAPER_LAYERS_CHANGED;
7235a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    moveInputMethodWindowsIfNeededLocked(false);
7236a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    wallpaperMayChange = true;
7237c9568e3989f1491abaa7960eca986af12743cb05Suchi Amalapurapu                    // Since the window list has been rebuilt, focus might
7238c9568e3989f1491abaa7960eca986af12743cb05Suchi Amalapurapu                    // have to be recomputed since the actual order of windows
7239c9568e3989f1491abaa7960eca986af12743cb05Suchi Amalapurapu                    // might have changed again.
7240b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                    mFocusMayChange = true;
7241a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                }
7242ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7243b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (wallpaperForceHidingChanged && changes == 0 && !mAppTransitionReady) {
72443b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // At this point, there was a window with a wallpaper that
72453b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // was force hiding other windows behind it, but now it
72463b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // is going away.  This may be simple -- just animate
72473b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // away the wallpaper and its window -- or it may be
72483b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // hard -- the wallpaper now needs to be shown behind
72493b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    // something that was hidden.
72503b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    WindowState oldWallpaper = mWallpaperTarget;
7251de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                    if (mLowerWallpaperTarget != null
7252de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            && mLowerWallpaperTarget.mAppToken != null) {
72538a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_WALLPAPER) Slog.v(TAG,
7254de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                                "wallpaperForceHiding changed with lower="
7255de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                                + mLowerWallpaperTarget);
72568a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (DEBUG_WALLPAPER) Slog.v(TAG,
7257de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                                "hidden=" + mLowerWallpaperTarget.mAppToken.hidden +
7258de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                                " hiddenRequested=" + mLowerWallpaperTarget.mAppToken.hiddenRequested);
7259de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        if (mLowerWallpaperTarget.mAppToken.hidden) {
7260de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            // The lower target has become hidden before we
7261de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            // actually started the animation...  let's completely
7262de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            // re-evaluate everything.
7263de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            mLowerWallpaperTarget = mUpperWallpaperTarget = null;
7264b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
7265de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        }
7266de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                    }
726716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                    adjResult |= adjustWallpaperWindowsLocked();
72683b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    wallpaperMayChange = false;
7269de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                    wallpaperForceHidingChanged = false;
72708a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WALLPAPER) Slog.v(TAG, "****** OLD: " + oldWallpaper
7271de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            + " NEW: " + mWallpaperTarget
7272de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                            + " LOWER: " + mLowerWallpaperTarget);
72733b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    if (mLowerWallpaperTarget == null) {
72743b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        // Whoops, we don't need a special wallpaper animation.
72753b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        // Clear them out.
72763b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        forceHiding = false;
72773b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        for (i=N-1; i>=0; i--) {
7278e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                            WindowState w = mWindows.get(i);
72793b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            if (w.mSurface != null) {
72803b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                final WindowManager.LayoutParams attrs = w.mAttrs;
7281c03d28b9e96f667d29ec6e480bed171bbd07169dSuchi Amalapurapu                                if (mPolicy.doesForceHide(w, attrs) && w.isVisibleLw()) {
72828a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                    if (DEBUG_FOCUS) Slog.i(TAG, "win=" + w + " force hides other windows");
72833b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                    forceHiding = true;
72843b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                } else if (mPolicy.canBeForceHidden(w, attrs)) {
72853b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                    if (!w.mAnimating) {
72863b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                        // We set the animation above so it
72873b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                        // is not yet running.
72883b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                        w.clearAnimation();
72893b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                    }
72903b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                                }
72913b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            }
72923b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        }
72933b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    }
72943b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                }
7295ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
72966c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                if (mWindowDetachedWallpaper != windowDetachedWallpaper) {
72976c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                    if (DEBUG_WALLPAPER) Slog.v(TAG,
72986c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                            "Detached wallpaper changed from " + mWindowDetachedWallpaper
72996c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                            + windowDetachedWallpaper);
73006c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                    mWindowDetachedWallpaper = windowDetachedWallpaper;
73016c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                    wallpaperMayChange = true;
73026c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                }
73036c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn
73046c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                if (wallpaperMayChange) {
73058a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WALLPAPER) Slog.v(TAG,
73060586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                            "Wallpaper may change!  Adjusting");
730716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                    adjResult |= adjustWallpaperWindowsLocked();
73083b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                }
7309ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
73103b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                if ((adjResult&ADJUST_WALLPAPER_LAYERS_CHANGED) != 0) {
73118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WALLPAPER) Slog.v(TAG,
73123b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            "Wallpaper layer changed: assigning layers + relayout");
7313b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT;
73143b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    assignLayersLocked();
73153b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                } else if ((adjResult&ADJUST_WALLPAPER_VISIBILITY_CHANGED) != 0) {
73168a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_WALLPAPER) Slog.v(TAG,
73173b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                            "Wallpaper visibility changed: relayout");
7318b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT;
73193b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                }
7320ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7321b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                if (mFocusMayChange) {
7322b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                    mFocusMayChange = false;
73233a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    if (updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES,
73243a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                            false /*updateInputWindows*/)) {
7325b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
73263b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                        adjResult = 0;
7327a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    }
73286c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn                }
73293b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn
73303b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                if (mLayoutNeeded) {
7331b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                    changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT;
73323b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                }
7333ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7334b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "*** ANIM STEP: changes=0x"
7335b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        + Integer.toHexString(changes));
7336b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn            } while (changes != 0);
73379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // THIRD LOOP: Update the surfaces of all windows.
73399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final boolean someoneLosingFocus = mLosingFocus.size() != 0;
73419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean obscured = false;
73439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean blurring = false;
73449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean dimming = false;
73459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean covered = false;
73469ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn            boolean syswin = false;
7347ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn            boolean backgroundFillerWasShown = mBackgroundFillerTarget != null;
7348ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn            mBackgroundFillerTarget = null;
73499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7350bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn            final int N = mWindows.size();
7351ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
73529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (i=N-1; i>=0; i--) {
7353e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState w = mWindows.get(i);
73549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean displayed = false;
73569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final WindowManager.LayoutParams attrs = w.mAttrs;
73579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int attrFlags = attrs.flags;
73589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (w.mSurface != null) {
7360ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // XXX NOTE: The logic here could be improved.  We have
7361ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // the decision about whether to resize a window separated
7362ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // from whether to hide the surface.  This can cause us to
7363ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // resize a surface even if we are going to hide it.  You
7364ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // can see this by (1) holding device in landscape mode on
7365ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // home screen; (2) tapping browser icon (device will rotate
7366ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // to landscape; (3) tap home.  The wallpaper will be resized
7367ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // in step 2 but then immediately hidden, causing us to
7368ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // have to resize and then redraw it again in step 3.  It
7369ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // would be nice to figure out how to avoid this, but it is
7370ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // difficult because we do need to resize surfaces in some
7371ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // cases while they are hidden such as when first showing a
7372ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    // window.
7373ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn
73749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.computeShownFrameLocked();
73758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (localLOGV) Slog.v(
73769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            TAG, "Placing surface #" + i + " " + w.mSurface
73779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + ": new=" + w.mShownFrame + ", old="
73789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + w.mLastShownFrame);
73799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int width, height;
73819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if ((w.mAttrs.flags & w.mAttrs.FLAG_SCALED) != 0) {
73829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // for a scaled surface, we just want to use
73839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // the requested size.
73849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        width  = w.mRequestedWidth;
73859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        height = w.mRequestedHeight;
73869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastRequestedWidth = width;
73879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastRequestedHeight = height;
73889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastShownFrame.set(w.mShownFrame);
73899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
73909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        width = w.mShownFrame.width();
73919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        height = w.mShownFrame.height();
73929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastShownFrame.set(w.mShownFrame);
73939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
73949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7395fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                    if (w.mSurface != null) {
7396fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                        if (w.mSurfaceX != w.mShownFrame.left
7397fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                || w.mSurfaceY != w.mShownFrame.top) {
7398fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                            try {
7399fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                if (SHOW_TRANSACTIONS) logSurface(w,
7400fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        "POS " + w.mShownFrame.left
7401fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + ", " + w.mShownFrame.top, null);
7402fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                w.mSurfaceX = w.mShownFrame.left;
7403fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                w.mSurfaceY = w.mShownFrame.top;
7404fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                w.mSurface.setPosition(w.mShownFrame.left, w.mShownFrame.top);
7405fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                            } catch (RuntimeException e) {
7406fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                Slog.w(TAG, "Error positioning surface of " + w
7407fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + " pos=(" + w.mShownFrame.left
7408fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + "," + w.mShownFrame.top + ")", e);
7409fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                if (!recoveringMemory) {
7410fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                    reclaimSomeSurfaceMemoryLocked(w, "position");
7411fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                }
7412fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                            }
7413fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                        }
7414fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown
7415fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                        if (width < 1) {
7416fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                            width = 1;
7417fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                        }
7418fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                        if (height < 1) {
7419fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                            height = 1;
7420fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                        }
7421fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown
7422fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                        if (w.mSurfaceW != width || w.mSurfaceH != height) {
74239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            try {
7424b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                if (SHOW_TRANSACTIONS) logSurface(w,
7425fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        "SIZE " + w.mShownFrame.width() + "x"
7426b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                        + w.mShownFrame.height(), null);
7427ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                                w.mSurfaceResized = true;
742816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                w.mSurfaceW = width;
742916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                w.mSurfaceH = height;
74309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mSurface.setSize(width, height);
74319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } catch (RuntimeException e) {
74329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // If something goes wrong with the surface (such
74339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // as running out of memory), don't take down the
74349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // entire system.
7435fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                Slog.e(TAG, "Error resizing surface of " + w
7436fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + " size=(" + width + "x" + height + ")", e);
74379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (!recoveringMemory) {
74389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    reclaimSomeSurfaceMemoryLocked(w, "size");
74399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
74409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
74419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
74429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
7443fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown
7444e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    if (!w.mAppFreezing && w.mLayoutSeq == mLayoutSeq) {
74459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mContentInsetsChanged =
74469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            !w.mLastContentInsets.equals(w.mContentInsets);
74479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mVisibleInsetsChanged =
74489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            !w.mLastVisibleInsets.equals(w.mVisibleInsets);
7449e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                        boolean configChanged =
7450e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                            w.mConfiguration != mCurConfiguration
7451e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                            && (w.mConfiguration == null
7452e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                                    || mCurConfiguration.diff(w.mConfiguration) != 0);
7453694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        if (DEBUG_CONFIGURATION && configChanged) {
7454694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            Slog.v(TAG, "Win " + w + " config changed: "
7455694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                    + mCurConfiguration);
7456694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                        }
74578a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (localLOGV) Slog.v(TAG, "Resizing " + w
7458e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                                + ": configChanged=" + configChanged
7459e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                                + " last=" + w.mLastFrame + " frame=" + w.mFrame);
7460fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                        boolean frameChanged = !w.mLastFrame.equals(w.mFrame);
7461fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                        if (frameChanged
74629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                || w.mContentInsetsChanged
7463e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                                || w.mVisibleInsetsChanged
7464ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                                || w.mSurfaceResized
7465e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                                || configChanged) {
7466fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                            if (DEBUG_RESIZE || DEBUG_ORIENTATION) {
7467fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                Slog.v(TAG, "Resize reasons: "
7468fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + "frameChanged=" + frameChanged
7469fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + " contentInsetsChanged=" + w.mContentInsetsChanged
7470fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + " visibleInsetsChanged=" + w.mVisibleInsetsChanged
7471fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + " surfaceResized=" + w.mSurfaceResized
7472fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                                        + " configChanged=" + configChanged);
7473fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown                            }
7474fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown
74759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            w.mLastFrame.set(w.mFrame);
74769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            w.mLastContentInsets.set(w.mContentInsets);
74779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            w.mLastVisibleInsets.set(w.mVisibleInsets);
74780586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                            // If the screen is currently frozen, then keep
74790586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                            // it frozen until this window draws at its new
74800586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                            // orientation.
74810586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                            if (mDisplayFrozen) {
74828a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_ORIENTATION) Slog.v(TAG,
74830586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                        "Resizing while display frozen: " + w);
74840586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                w.mOrientationChanging = true;
7485e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                                if (!mWindowsFreezingScreen) {
74860586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                    mWindowsFreezingScreen = true;
74870586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                    // XXX should probably keep timeout from
74880586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                    // when we first froze the display.
74890586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                    mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT);
74900586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                    mH.sendMessageDelayed(mH.obtainMessage(
74910586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                            H.WINDOW_FREEZE_TIMEOUT), 2000);
74920586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                }
74930586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                            }
74949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // If the orientation is changing, then we need to
74959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // hold off on unfreezing the display until this
74969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // window has been redrawn; to do that, we need
74979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // to go through the process of getting informed
74989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // by the application when it has finished drawing.
74999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (w.mOrientationChanging) {
75008a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_ORIENTATION) Slog.v(TAG,
75019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "Orientation start waiting for draw in "
75029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + w + ", surface " + w.mSurface);
75039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mDrawPending = true;
75049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mCommitDrawPending = false;
75059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mReadyToShow = false;
75069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (w.mAppToken != null) {
75079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    w.mAppToken.allDrawn = false;
75089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
75099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
7510ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                            if (DEBUG_RESIZE || DEBUG_ORIENTATION) Slog.v(TAG,
75119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Resizing window " + w + " to " + w.mFrame);
75129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mResizingWindows.add(w);
75139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (w.mOrientationChanging) {
75149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (!w.mDrawPending && !w.mCommitDrawPending) {
75158a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_ORIENTATION) Slog.v(TAG,
75169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "Orientation not waiting for draw in "
75179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + w + ", surface " + w.mSurface);
75189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mOrientationChanging = false;
75199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
75209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
75219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
75229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
75233b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    if (w.mAttachedHidden || !w.isReadyForDisplay()) {
75249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!w.mLastHidden) {
75259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            //dump();
75269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            w.mLastHidden = true;
7527b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            if (SHOW_TRANSACTIONS) logSurface(w,
7528b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                    "HIDE (performLayout)", null);
75299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (w.mSurface != null) {
753016064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                w.mSurfaceShown = false;
75319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                try {
75329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    w.mSurface.hide();
75339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                } catch (RuntimeException e) {
75348a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                    Slog.w(TAG, "Exception hiding surface in " + w);
75359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
75369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
75379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
75389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // If we are waiting for this window to handle an
75399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // orientation change, well, it is hidden, so
75409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // doesn't really matter.  Note that this does
75419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // introduce a potential glitch if the window
75429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // becomes unhidden before it has drawn for the
75439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // new orientation.
75449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (w.mOrientationChanging) {
75459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            w.mOrientationChanging = false;
75468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_ORIENTATION) Slog.v(TAG,
75479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Orientation change skips hidden " + w);
75489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
75499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (w.mLastLayer != w.mAnimLayer
75509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastAlpha != w.mShownAlpha
75519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastDsDx != w.mDsDx
75529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastDtDx != w.mDtDx
75539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastDsDy != w.mDsDy
75549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastDtDy != w.mDtDy
75559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastHScale != w.mHScale
75569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastVScale != w.mVScale
75579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            || w.mLastHidden) {
75589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        displayed = true;
75599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastAlpha = w.mShownAlpha;
75609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastLayer = w.mAnimLayer;
75619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastDsDx = w.mDsDx;
75629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastDtDx = w.mDtDx;
75639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastDsDy = w.mDsDy;
75649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastDtDy = w.mDtDy;
75659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastHScale = w.mHScale;
75669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mLastVScale = w.mVScale;
7567b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                        if (SHOW_TRANSACTIONS) logSurface(w,
7568b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                "alpha=" + w.mShownAlpha + " layer=" + w.mAnimLayer
75690586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                + " matrix=[" + (w.mDsDx*w.mHScale)
75700586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                + "," + (w.mDtDx*w.mVScale)
75710586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                                + "][" + (w.mDsDy*w.mHScale)
7572b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                + "," + (w.mDtDy*w.mVScale) + "]", null);
75739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (w.mSurface != null) {
75749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            try {
757516064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                w.mSurfaceAlpha = w.mShownAlpha;
75769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mSurface.setAlpha(w.mShownAlpha);
757716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                w.mSurfaceLayer = w.mAnimLayer;
75789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mSurface.setLayer(w.mAnimLayer);
75799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mSurface.setMatrix(
75809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        w.mDsDx*w.mHScale, w.mDtDx*w.mVScale,
75819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        w.mDsDy*w.mHScale, w.mDtDy*w.mVScale);
75829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } catch (RuntimeException e) {
75838a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                Slog.w(TAG, "Error updating surface in " + w, e);
75849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (!recoveringMemory) {
75859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    reclaimSomeSurfaceMemoryLocked(w, "update");
75869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
75879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
75889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
75899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
75909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (w.mLastHidden && !w.mDrawPending
75919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                && !w.mCommitDrawPending
75929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                && !w.mReadyToShow) {
7593b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                            if (SHOW_TRANSACTIONS) logSurface(w,
7594b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn                                    "SHOW (performLayout)", null);
75958a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                            if (DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + w
75969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + " during relayout");
75979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (showSurfaceRobustlyLocked(w)) {
75989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mHasDrawn = true;
75999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mLastHidden = false;
76009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } else {
76019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mOrientationChanging = false;
76029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
76039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
76049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (w.mSurface != null) {
76059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            w.mToken.hasVisible = true;
76069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
76079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
76089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        displayed = true;
76099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
76109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
76119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (displayed) {
76129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!covered) {
7613980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy                            if (attrs.width == LayoutParams.MATCH_PARENT
7614980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy                                    && attrs.height == LayoutParams.MATCH_PARENT) {
76159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                covered = true;
76169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
76179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
76189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (w.mOrientationChanging) {
76199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (w.mDrawPending || w.mCommitDrawPending) {
76209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                orientationChangeComplete = false;
76218a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_ORIENTATION) Slog.v(TAG,
76229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "Orientation continue waiting for draw in " + w);
76239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } else {
76249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                w.mOrientationChanging = false;
76258a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                if (DEBUG_ORIENTATION) Slog.v(TAG,
76269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        "Orientation change complete in " + w);
76279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
76289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
76299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        w.mToken.hasVisible = true;
76309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
76319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (w.mOrientationChanging) {
76328a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    if (DEBUG_ORIENTATION) Slog.v(TAG,
76339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "Orientation change skips hidden " + w);
76349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.mOrientationChanging = false;
76359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
76369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
76370f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                if (w.mContentChanged) {
76380f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                    //Slog.i(TAG, "Window " + this + " clearing mContentChanged - done placing");
76390f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                    w.mContentChanged = false;
76400f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                }
76410f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
76429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final boolean canBeSeen = w.isDisplayedLw();
76439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
76449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (someoneLosingFocus && w == mCurrentFocus && canBeSeen) {
76459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    focusDisplayed = true;
76469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
76479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7648e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                final boolean obscuredChanged = w.mObscured != obscured;
7649ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7650ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                if (mBackgroundFillerTarget != null) {
7651ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                    if (w.isAnimating()) {
7652ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                        // Background filler is below all other windows that
7653ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                        // are animating.
7654ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                        mBackgroundFillerTarget = w;
7655ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                    } else if (w.mIsWallpaper) {
7656ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                        mBackgroundFillerTarget = w;
7657ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                    }
7658ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                }
7659ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn
76609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Update effect.
76617341d7a104b47996445d069a695e155a07184606Dianne Hackborn                if (!(w.mObscured=obscured)) {
76629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (w.mSurface != null) {
76639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if ((attrFlags&FLAG_KEEP_SCREEN_ON) != 0) {
76649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            holdScreen = w.mSession;
76659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
76669ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn                        if (!syswin && w.mAttrs.screenBrightness >= 0
76679ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn                                && screenBrightness < 0) {
76689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            screenBrightness = w.mAttrs.screenBrightness;
76699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
7670fb73f79340375013225618a5d87f46b958f698efMike Lockwood                        if (!syswin && w.mAttrs.buttonBrightness >= 0
7671fb73f79340375013225618a5d87f46b958f698efMike Lockwood                                && buttonBrightness < 0) {
7672fb73f79340375013225618a5d87f46b958f698efMike Lockwood                            buttonBrightness = w.mAttrs.buttonBrightness;
7673fb73f79340375013225618a5d87f46b958f698efMike Lockwood                        }
767446af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood                        if (canBeSeen
767546af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood                                && (attrs.type == WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG
767646af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood                                 || attrs.type == WindowManager.LayoutParams.TYPE_KEYGUARD
767746af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood                                 || attrs.type == WindowManager.LayoutParams.TYPE_SYSTEM_ERROR)) {
76789ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn                            syswin = true;
76799ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn                        }
76809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
76811ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
768225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                    boolean opaqueDrawn = canBeSeen && w.isOpaqueDrawn();
768325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn                    if (opaqueDrawn && w.isFullscreen(dw, dh)) {
76849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // This window completely covers everything behind it,
76859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // so we want to leave all of them as unblurred (for
76869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // performance reasons).
76879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        obscured = true;
7688ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                    } else if (w.needsBackgroundFiller(dw, dh) && (canBeSeen || w.isAnimating())) {
76890a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                        // This window is in compatibility mode, and needs background filler.
76901ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima                        obscured = true;
7691ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                        mBackgroundFillerTarget = w;
76923b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    } else if (canBeSeen && !obscured &&
76939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            (attrFlags&FLAG_BLUR_BEHIND|FLAG_DIM_BEHIND) != 0) {
76948a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (localLOGV) Slog.v(TAG, "Win " + w
76959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ": blurring=" + blurring
76969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " obscured=" + obscured
76979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " displayed=" + displayed);
76989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if ((attrFlags&FLAG_DIM_BEHIND) != 0) {
76999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (!dimming) {
77008a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                //Slog.i(TAG, "DIM BEHIND: " + w);
77019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                dimming = true;
77020a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                if (mDimAnimator == null) {
77030a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                    mDimAnimator = new DimAnimator(mFxSession);
77049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
77050a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                                mDimAnimator.show(dw, dh);
77061c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                                mDimAnimator.updateParameters(mContext.getResources(),
77071c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn                                        w, currentTime);
77089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
77099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
77109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if ((attrFlags&FLAG_BLUR_BEHIND) != 0) {
77119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (!blurring) {
77128a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                //Slog.i(TAG, "BLUR BEHIND: " + w);
77139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                blurring = true;
77149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (mBlurSurface == null) {
77159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    try {
771606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy                                        mBlurSurface = new Surface(mFxSession, 0,
77175d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian                                                "BlurSurface",
77189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                -1, 16, 16,
77199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                PixelFormat.OPAQUE,
77209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                Surface.FX_SURFACE_BLUR);
77219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    } catch (Exception e) {
77228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                                        Slog.e(TAG, "Exception creating Blur surface", e);
77239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    }
7724ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                                    if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BLUR "
7725ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                                            + mBlurSurface + ": CREATE");
77269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
77279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (mBlurSurface != null) {
772816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                    if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BLUR "
772916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                            + mBlurSurface + ": pos=(0,0) (" +
773016064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                            dw + "x" + dh + "), layer=" + (w.mAnimLayer-1));
77319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    mBlurSurface.setPosition(0, 0);
77329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    mBlurSurface.setSize(dw, dh);
773316064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                    mBlurSurface.setLayer(w.mAnimLayer-2);
773416064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                    if (!mBlurShown) {
773516064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                        try {
773616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                            if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BLUR "
773716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                                    + mBlurSurface + ": SHOW");
773816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                            mBlurSurface.show();
773916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                        } catch (RuntimeException e) {
774016064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                            Slog.w(TAG, "Failure showing blur surface", e);
774116064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                        }
774216064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                                        mBlurShown = true;
77439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    }
77449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
77459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
77469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
77479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
77489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7749ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7750e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                if (obscuredChanged && mWallpaperTarget == w) {
7751e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    // This is the wallpaper target and its obscured state
7752e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    // changed... make sure the current wallaper's visibility
7753e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    // has been updated accordingly.
7754e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                    updateWallpaperVisibilityLocked();
7755e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn                }
77569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7757ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7758ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn            if (mBackgroundFillerTarget != null) {
7759ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                if (mBackgroundFillerSurface == null) {
7760ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                    try {
7761ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                        mBackgroundFillerSurface = new Surface(mFxSession, 0,
7762ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                                "BackGroundFiller",
7763ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                                0, dw, dh,
7764ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                                PixelFormat.OPAQUE,
7765ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                                Surface.FX_SURFACE_NORMAL);
7766ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                    } catch (Exception e) {
7767ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                        Slog.e(TAG, "Exception creating filler surface", e);
7768ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                    }
7769ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                    if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BG FILLER "
7770ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                            + mBackgroundFillerSurface + ": CREATE");
7771ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                }
7772ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                try {
7773ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                    if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BG FILLER "
7774ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                            + mBackgroundFillerSurface + " SHOW: pos=(0,0) ("
7775ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                            + dw + "x" + dh + ") layer="
7776ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                            + (mBackgroundFillerTarget.mLayer - 1));
7777ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                    mBackgroundFillerSurface.setPosition(0, 0);
7778ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                    mBackgroundFillerSurface.setSize(dw, dh);
7779ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                    // Using the same layer as Dim because they will never be shown at the
7780ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                    // same time.  NOTE: we do NOT use mAnimLayer, because we don't
7781ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                    // want this surface dragged up in front of stuff that is animating.
7782ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                    mBackgroundFillerSurface.setLayer(mBackgroundFillerTarget.mLayer - 1);
7783ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                    mBackgroundFillerSurface.show();
7784ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                } catch (RuntimeException e) {
7785ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                    Slog.e(TAG, "Exception showing filler surface");
7786ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                }
7787ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn            } else if (backgroundFillerWasShown) {
7788ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                mBackgroundFillerTarget = null;
7789ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BG FILLER "
7790ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn                        + mBackgroundFillerSurface + " HIDE");
77911ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima                try {
77921ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima                    mBackgroundFillerSurface.hide();
77931ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima                } catch (RuntimeException e) {
77948a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.e(TAG, "Exception hiding filler surface", e);
77951ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima                }
77961ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima            }
77979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
77980a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima            if (mDimAnimator != null && mDimAnimator.mDimShown) {
7799de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                animating |= mDimAnimator.updateSurface(dimming, currentTime,
7800de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn                        mDisplayFrozen || !mPolicy.isScreenOn());
78019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
780206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
78039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!blurring && mBlurShown) {
78048a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BLUR " + mBlurSurface
78059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": HIDE");
78069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
78079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mBlurSurface.hide();
78089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IllegalArgumentException e) {
78098a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.w(TAG, "Illegal argument exception hiding blur surface");
78109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
78119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mBlurShown = false;
78129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
78139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
78148a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.e(TAG, "Unhandled exception in Window Manager", e);
78159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
78169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
78179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Surface.closeTransaction();
781806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
781994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn        if (SHOW_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION performLayoutAndPlaceSurfaces");
782094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn
7821b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        if (mWatermark != null) {
7822b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            mWatermark.drawIfNeeded();
7823b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        }
7824b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn
78258a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (DEBUG_ORIENTATION && mDisplayFrozen) Slog.v(TAG,
78269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "With display frozen, orientationChangeComplete="
78279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + orientationChangeComplete);
78289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (orientationChangeComplete) {
78299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mWindowsFreezingScreen) {
78309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindowsFreezingScreen = false;
78319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT);
78329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7833e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            stopFreezingDisplayLocked();
78349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
783506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
78369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        i = mResizingWindows.size();
78379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (i > 0) {
78389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            do {
78399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
78409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState win = mResizingWindows.get(i);
78419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
7842ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    if (DEBUG_RESIZE || DEBUG_ORIENTATION) Slog.v(TAG,
7843ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                            "Reporting new frame to " + win + ": " + win.mFrame);
7844694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    int diff = 0;
7845e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    boolean configChanged =
7846e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                        win.mConfiguration != mCurConfiguration
7847e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                        && (win.mConfiguration == null
7848694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                || (diff=mCurConfiguration.diff(win.mConfiguration)) != 0);
7849694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    if ((DEBUG_RESIZE || DEBUG_ORIENTATION || DEBUG_CONFIGURATION)
7850694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            && configChanged) {
78518a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.i(TAG, "Sending new config to window " + win + ": "
7852e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                                + win.mFrame.width() + "x" + win.mFrame.height()
7853694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                + " / " + mCurConfiguration + " / 0x"
7854694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                                + Integer.toHexString(diff));
7855e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    }
7856694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    win.mConfiguration = mCurConfiguration;
78579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mClient.resized(win.mFrame.width(),
78589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            win.mFrame.height(), win.mLastContentInsets,
7859e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                            win.mLastVisibleInsets, win.mDrawPending,
7860e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                            configChanged ? win.mConfiguration : null);
78619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mContentInsetsChanged = false;
78629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mVisibleInsetsChanged = false;
7863ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn                    win.mSurfaceResized = false;
78649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
78659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mOrientationChanging = false;
78669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
78679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } while (i > 0);
78689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResizingWindows.clear();
78699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
787006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
78719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Destroy the surface of any windows that are no longer visible.
78727341d7a104b47996445d069a695e155a07184606Dianne Hackborn        boolean wallpaperDestroyed = false;
78739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        i = mDestroySurface.size();
78749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (i > 0) {
78759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            do {
78769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
78779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowState win = mDestroySurface.get(i);
78789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mDestroying = false;
78799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mInputMethodWindow == win) {
78809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mInputMethodWindow = null;
78819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
78827341d7a104b47996445d069a695e155a07184606Dianne Hackborn                if (win == mWallpaperTarget) {
78837341d7a104b47996445d069a695e155a07184606Dianne Hackborn                    wallpaperDestroyed = true;
78847341d7a104b47996445d069a695e155a07184606Dianne Hackborn                }
78859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.destroySurfaceLocked();
78869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } while (i > 0);
78879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDestroySurface.clear();
78889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
78899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
78909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Time to remove any exiting tokens?
78919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=mExitingTokens.size()-1; i>=0; i--) {
78929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowToken token = mExitingTokens.get(i);
78939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!token.hasVisible) {
78949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mExitingTokens.remove(i);
78954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                if (token.windowType == TYPE_WALLPAPER) {
78964c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    mWallpaperTokens.remove(token);
78974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
78989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
78999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
79009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
79019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Time to remove any exiting applications?
79029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=mExitingAppTokens.size()-1; i>=0; i--) {
79039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken token = mExitingAppTokens.get(i);
79049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!token.hasVisible && !mClosingApps.contains(token)) {
79059bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                // Make sure there is no animation running on this token,
79069bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                // so any windows associated with it will be removed as
79079bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                // soon as their animations are complete
79089bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                token.animation = null;
79099bfb707597898f54722460b48588007b682f3e2aDianne Hackborn                token.animating = false;
7910f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG,
7911f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn                        "performLayout: App token exiting now removed" + token);
79129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppTokens.remove(token);
79139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mExitingAppTokens.remove(i);
79149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
79159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
79169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7917a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        boolean needRelayout = false;
7918ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
7919a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        if (!animating && mAppTransitionRunning) {
7920a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // We have finished the animation of an app transition.  To do
7921a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // this, we have delayed a lot of operations like showing and
7922a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // hiding apps, moving apps in Z-order, etc.  The app token list
7923a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // reflects the correct Z-order, but the window list may now
7924a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // be out of sync with it.  So here we will just rebuild the
7925a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // entire app window list.  Fun!
7926a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            mAppTransitionRunning = false;
7927a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            needRelayout = true;
7928a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            rebuildAppWindowListLocked();
792916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn            assignLayersLocked();
7930a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            // Clear information about apps that were moving.
7931a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            mToBottomApps.clear();
7932a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        }
7933ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
79349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (focusDisplayed) {
79359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendEmptyMessage(H.REPORT_LOSING_FOCUS);
79369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
79377341d7a104b47996445d069a695e155a07184606Dianne Hackborn        if (wallpaperDestroyed) {
79380586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn            needRelayout = adjustWallpaperWindowsLocked() != 0;
79397341d7a104b47996445d069a695e155a07184606Dianne Hackborn        }
7940a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn        if (needRelayout) {
79417341d7a104b47996445d069a695e155a07184606Dianne Hackborn            requestAnimationLocked(0);
79427341d7a104b47996445d069a695e155a07184606Dianne Hackborn        } else if (animating) {
79439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            requestAnimationLocked(currentTime+(1000/60)-SystemClock.uptimeMillis());
79449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7945eb857f12d605659b385d168ef1ea7d4ba5193585Jeff Brown
79463a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        // Finally update all input windows now that the window changes have stabilized.
79472e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown        mInputMonitor.updateInputWindowsLw(true /*force*/);
7948eb857f12d605659b385d168ef1ea7d4ba5193585Jeff Brown
79498e03b7566c42621fda01186b66b019142eb84fbfJeff Brown        setHoldScreenLocked(holdScreen != null);
7950428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn        if (!mDisplayFrozen) {
7951428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            if (screenBrightness < 0 || screenBrightness > 1.0f) {
7952428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                mPowerManager.setScreenBrightnessOverride(-1);
7953428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            } else {
7954428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                mPowerManager.setScreenBrightnessOverride((int)
7955428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        (screenBrightness * Power.BRIGHTNESS_ON));
7956428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            }
7957428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            if (buttonBrightness < 0 || buttonBrightness > 1.0f) {
7958428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                mPowerManager.setButtonBrightnessOverride(-1);
7959428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            } else {
7960428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                mPowerManager.setButtonBrightnessOverride((int)
7961428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn                        (buttonBrightness * Power.BRIGHTNESS_ON));
7962428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn            }
7963fb73f79340375013225618a5d87f46b958f698efMike Lockwood        }
79649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (holdScreen != mHoldingScreenOn) {
79659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHoldingScreenOn = holdScreen;
79669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Message m = mH.obtainMessage(H.HOLD_SCREEN_CHANGED, holdScreen);
79679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendMessage(m);
79689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7969ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
797093e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        if (mTurnOnScreen) {
7971b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn            if (DEBUG_VISIBILITY) Slog.v(TAG, "Turning screen on after layout!");
797293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn            mPowerManager.userActivity(SystemClock.uptimeMillis(), false,
797393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                    LocalPowerManager.BUTTON_EVENT, true);
797493e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn            mTurnOnScreen = false;
797593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn        }
7976f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn
797750660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn        if (screenRotationFinished && mScreenRotationAnimation != null) {
797850660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn            mScreenRotationAnimation.kill();
797950660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn            mScreenRotationAnimation = null;
798050660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn        }
798150660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn
798289ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        if (updateRotation) {
798389ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation");
798489ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            boolean changed = setRotationUncheckedLocked(
798589ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                    WindowManagerPolicy.USE_LAST_ROTATION, 0, false);
798689ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            if (changed) {
79873e4f9d0452a2592338c15cf1b6d774761b929a28Dianne Hackborn                mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
798889ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            }
798989ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        }
799089ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn
7991f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn        // Check to see if we are now in a state where the screen should
7992f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn        // be enabled, because the window obscured flags have changed.
7993f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn        enableScreenIfNeededLocked();
79949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
799546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
799646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    /**
799746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     * Must be called with the main window manager lock held.
799846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     */
799946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    void setHoldScreenLocked(boolean holding) {
800046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        boolean state = mHoldingScreenWakeLock.isHeld();
800146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        if (holding != state) {
800246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            if (holding) {
800346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                mHoldingScreenWakeLock.acquire();
800446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            } else {
800546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                mPolicy.screenOnStoppedLw();
800646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                mHoldingScreenWakeLock.release();
800746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            }
800846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
800946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
80109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
80119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void requestAnimationLocked(long delay) {
80129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mAnimationPending) {
80139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAnimationPending = true;
80149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendMessageDelayed(mH.obtainMessage(H.ANIMATE), delay);
80159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
80169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
801706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
80189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
80199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Have the surface flinger show a surface, robustly dealing with
80209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * error conditions.  In particular, if there is not enough memory
80219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to show the surface, then we will try to get rid of other surfaces
80229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in order to succeed.
802306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy     *
80249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the surface was successfully shown.
80259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
80269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean showSurfaceRobustlyLocked(WindowState win) {
80279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
80289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.mSurface != null) {
802916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                win.mSurfaceShown = true;
80309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mSurface.show();
803193e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                if (win.mTurnOnScreen) {
8032b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                    if (DEBUG_VISIBILITY) Slog.v(TAG,
8033b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn                            "Show surface turning screen on: " + win);
803493e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                    win.mTurnOnScreen = false;
803593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                    mTurnOnScreen = true;
803693e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn                }
80379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
80389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
80399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
804094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn            Slog.w(TAG, "Failure showing surface " + win.mSurface + " in " + win, e);
80419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
804206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
80439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        reclaimSomeSurfaceMemoryLocked(win, "show");
804406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
80459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
80469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
804706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
80489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void reclaimSomeSurfaceMemoryLocked(WindowState win, String operation) {
80499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Surface surface = win.mSurface;
805006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
8051ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker        EventLog.writeEvent(EventLogTags.WM_NO_SURFACE_MEMORY, win.toString(),
80529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                win.mSession.mPid, operation);
805306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
80549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mForceRemoves == null) {
80559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mForceRemoves = new ArrayList<WindowState>();
80569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
805706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
80589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long callingIdentity = Binder.clearCallingIdentity();
80599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
80609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // There was some problem...   first, do a sanity check of the
80619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // window list to make sure we haven't left any dangling surfaces
80629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // around.
80639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = mWindows.size();
80649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean leakedSurface = false;
80658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.i(TAG, "Out of memory for surface!  Looking for leaks...");
80669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
8067e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState ws = mWindows.get(i);
80689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ws.mSurface != null) {
80699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mSessions.contains(ws.mSession)) {
80708a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "LEAKED SURFACE (session doesn't exist): "
80719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ws + " surface=" + ws.mSurface
80729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " token=" + win.mToken
80739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " pid=" + ws.mSession.mPid
80749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " uid=" + ws.mSession.mUid);
807594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        if (SHOW_TRANSACTIONS) logSurface(ws, "LEAK DESTROY", null);
80760586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                        ws.mSurface.destroy();
807716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                        ws.mSurfaceShown = false;
80789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ws.mSurface = null;
80799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mForceRemoves.add(ws);
80809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        i--;
80819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        N--;
80829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        leakedSurface = true;
808394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    } else if (ws.mAppToken != null && ws.mAppToken.clientHidden) {
80848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        Slog.w(TAG, "LEAKED SURFACE (app token hidden): "
80859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ws + " surface=" + ws.mSurface
80869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " token=" + win.mAppToken);
808794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        if (SHOW_TRANSACTIONS) logSurface(ws, "LEAK DESTROY", null);
80880586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                        ws.mSurface.destroy();
808916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                        ws.mSurfaceShown = false;
80909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ws.mSurface = null;
80919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        leakedSurface = true;
80929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
80939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
80949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
809506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
80969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean killedApps = false;
80979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!leakedSurface) {
80988a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "No leaked surfaces; killing applicatons!");
80999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SparseIntArray pidCandidates = new SparseIntArray();
81009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
8101e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                    WindowState ws = mWindows.get(i);
81029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ws.mSurface != null) {
81039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pidCandidates.append(ws.mSession.mPid, ws.mSession.mPid);
81049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
81059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
81069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pidCandidates.size() > 0) {
81079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int[] pids = new int[pidCandidates.size()];
81089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i=0; i<pids.length; i++) {
81099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pids[i] = pidCandidates.keyAt(i);
81109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
81119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
8112e99bb5f10b90736d10cee9729b56cba156fc0921Suchi Amalapurapu                        if (mActivityManager.killPids(pids, "Free memory")) {
81139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            killedApps = true;
81149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
81159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (RemoteException e) {
81169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
81179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
81189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
811906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
81209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (leakedSurface || killedApps) {
81219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We managed to reclaim some memory, so get rid of the trouble
81229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // surface and ask the app to request another one.
81238a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.w(TAG, "Looks like we have reclaimed some memory, clearing surface for retry.");
81249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (surface != null) {
812594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                    if (SHOW_TRANSACTIONS) logSurface(win, "RECOVER DESTROY", null);
81260586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                    surface.destroy();
812716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn                    win.mSurfaceShown = false;
81289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mSurface = null;
81299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
813006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
81319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
81329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    win.mClient.dispatchGetNewSurface();
81339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
81349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
81359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
81369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
81379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Binder.restoreCallingIdentity(callingIdentity);
81389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
81399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
814006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
81413a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown    private boolean updateFocusedWindowLocked(int mode, boolean updateInputWindows) {
81429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState newFocus = computeFocusedWindowLocked();
81439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mCurrentFocus != newFocus) {
81449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // This check makes sure that we don't already have the focus
81459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // change message pending.
81469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.removeMessages(H.REPORT_FOCUS_CHANGE);
81479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mH.sendEmptyMessage(H.REPORT_FOCUS_CHANGE);
81488a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (localLOGV) Slog.v(
81499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Changing focus from " + mCurrentFocus + " to " + newFocus);
81509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final WindowState oldFocus = mCurrentFocus;
81519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentFocus = newFocus;
81529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLosingFocus.remove(newFocus);
815306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
81549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final WindowState imWindow = mInputMethodWindow;
81559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (newFocus != imWindow && oldFocus != imWindow) {
8156c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                if (moveInputMethodWindowsIfNeededLocked(
81579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mode != UPDATE_FOCUS_WILL_ASSIGN_LAYERS &&
8158c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                        mode != UPDATE_FOCUS_WILL_PLACE_SURFACES)) {
8159c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                    mLayoutNeeded = true;
8160c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                }
81619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mode == UPDATE_FOCUS_PLACING_SURFACES) {
81623a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                    performLayoutLockedInner(true /*initial*/, updateInputWindows);
8163c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                } else if (mode == UPDATE_FOCUS_WILL_PLACE_SURFACES) {
8164c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                    // Client will do the layout, but we need to assign layers
8165c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                    // for handleNewWindowLocked() below.
8166c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project                    assignLayersLocked();
81679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
81689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8169349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
8170349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown            if (mode != UPDATE_FOCUS_WILL_ASSIGN_LAYERS) {
8171349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown                // If we defer assigning layers, then the caller is responsible for
8172349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown                // doing this part.
81733a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown                finishUpdateFocusedWindowAfterAssignLayersLocked(updateInputWindows);
8174c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project            }
81759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
81769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
81779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
81789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8179349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
81803a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown    private void finishUpdateFocusedWindowAfterAssignLayersLocked(boolean updateInputWindows) {
81813a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown        mInputMonitor.setInputFocusLw(mCurrentFocus, updateInputWindows);
8182349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    }
81839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
81849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WindowState computeFocusedWindowLocked() {
81859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState result = null;
81869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowState win;
81879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
81889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i = mWindows.size() - 1;
81899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int nextAppIndex = mAppTokens.size()-1;
81909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowToken nextApp = nextAppIndex >= 0
81919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ? mAppTokens.get(nextAppIndex) : null;
81929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
81939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (i >= 0) {
8194e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown            win = mWindows.get(i);
81959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
81968a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (localLOGV || DEBUG_FOCUS) Slog.v(
81979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TAG, "Looking for focus: " + i
81989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " = " + win
81999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", flags=" + win.mAttrs.flags
82009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", canReceive=" + win.canReceiveKeys());
82019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
82029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AppWindowToken thisApp = win.mAppToken;
820306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
82049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If this window's application has been removed, just skip it.
82059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (thisApp != null && thisApp.removed) {
82069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i--;
82079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
82089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
820906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
82109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If there is a focused app, don't allow focus to go to any
82119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // windows below it.  If this is an application window, step
82129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // through the app tokens until we find its app.
82139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (thisApp != null && nextApp != null && thisApp != nextApp
82149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && win.mAttrs.type != TYPE_APPLICATION_STARTING) {
82159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int origAppIndex = nextAppIndex;
82169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (nextAppIndex > 0) {
82179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (nextApp == mFocusedApp) {
82189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Whoops, we are below the focused app...  no focus
82199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // for you!
82208a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                        if (localLOGV || DEBUG_FOCUS) Slog.v(
82219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            TAG, "Reached focused app: " + mFocusedApp);
82229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return null;
82239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
82249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    nextAppIndex--;
82259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    nextApp = mAppTokens.get(nextAppIndex);
82269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (nextApp == thisApp) {
82279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
82289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
82299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
82309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (thisApp != nextApp) {
82319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Uh oh, the app token doesn't exist!  This shouldn't
82329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // happen, but if it does we can get totally hosed...
82339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // so restart at the original app.
82349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    nextAppIndex = origAppIndex;
82359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    nextApp = mAppTokens.get(nextAppIndex);
82369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
82379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
82389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
82399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Dispatch to this window if it is wants key events.
82409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (win.canReceiveKeys()) {
82418a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                if (DEBUG_FOCUS) Slog.v(
82429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        TAG, "Found focus @ " + i + " = " + win);
82439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = win;
82449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
82459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
82469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
82479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            i--;
82489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
82499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
82509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
82519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
82529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
825394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn    private void startFreezingDisplayLocked(boolean inTransaction) {
82549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDisplayFrozen) {
82559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
82569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
825706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
82589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenFrozenLock.acquire();
825906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
82609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long now = SystemClock.uptimeMillis();
82618a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //Slog.i(TAG, "Freezing, gc pending: " + mFreezeGcPending + ", now " + now);
82629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFreezeGcPending != 0) {
82639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (now > (mFreezeGcPending+1000)) {
82648a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                //Slog.i(TAG, "Gc!  " + now + " > " + (mFreezeGcPending+1000));
82659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mH.removeMessages(H.FORCE_GC);
82669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Runtime.getRuntime().gc();
82679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFreezeGcPending = now;
82689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
82699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
82709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFreezeGcPending = now;
82719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
827206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
82739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDisplayFrozen = true;
8274349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
827500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        mInputMonitor.freezeInputDispatchingLw();
8276349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
8277bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn        if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
8278bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn            mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET;
82793b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            mNextAppTransitionPackage = null;
82809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAppTransitionReady = true;
82819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
828206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
82839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (PROFILE_ORIENTATION) {
82849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            File file = new File("/data/system/frozen");
82859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Debug.startMethodTracing(file.toString(), 8 * 1024 * 1024);
82869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8287a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn
8288a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn        if (CUSTOM_SCREEN_ROTATION) {
8289f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn            if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) {
8290f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                mScreenRotationAnimation.kill();
8291f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                mScreenRotationAnimation = null;
8292f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn            }
8293a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn            if (mScreenRotationAnimation == null) {
8294f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                mScreenRotationAnimation = new ScreenRotationAnimation(mContext,
829594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn                        mDisplay, mFxSession, inTransaction);
8296a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn            }
8297a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn        } else {
8298a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn            Surface.freezeDisplay(0);
8299a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn        }
83009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
830106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
83029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void stopFreezingDisplayLocked() {
83039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mDisplayFrozen) {
83049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
83059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
830606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
8307e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        if (mWaitingForConfig || mAppsFreezingScreen > 0 || mWindowsFreezingScreen) {
8308e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            return;
8309e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        }
8310e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
83119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDisplayFrozen = false;
83129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.removeMessages(H.APP_FREEZE_TIMEOUT);
83139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (PROFILE_ORIENTATION) {
83149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Debug.stopMethodTracing();
83159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8316a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn
831789ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        boolean updateRotation = false;
831889ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn
8319a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn        if (CUSTOM_SCREEN_ROTATION) {
8320a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn            if (mScreenRotationAnimation != null) {
832150660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn                if (mScreenRotationAnimation.dismiss(mFxSession, MAX_ANIMATION_DURATION,
8322f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                        mTransitionAnimationScale)) {
8323f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                    requestAnimationLocked(0);
8324f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                } else {
8325f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                    mScreenRotationAnimation = null;
832689ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                    updateRotation = true;
8327f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn                }
8328a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn            }
8329a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn        } else {
8330a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn            Surface.unfreezeDisplay(0);
8331a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn        }
833206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
833300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        mInputMonitor.thawInputDispatchingLw();
83349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8335420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn        boolean configChanged;
8336420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn
8337b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        // While the display is frozen we don't re-compute the orientation
8338b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        // to avoid inconsistent states.  However, something interesting
8339b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        // could have actually changed during that time so re-evaluate it
8340b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate        // now to catch that.
8341420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn        configChanged = updateOrientationFromAppTokensLocked(false);
8342b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate
83439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // A little kludge: a lot could have happened while the
83449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // display was frozen, so now that we are coming back we
83459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // do a gc so that any remote references the system
83469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // processes holds on others can be released if they are
83479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // no longer needed.
83489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.removeMessages(H.FORCE_GC);
83499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mH.sendMessageDelayed(mH.obtainMessage(H.FORCE_GC),
83509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                2000);
835106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
83529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenFrozenLock.release();
835389ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn
835489ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        if (updateRotation) {
835589ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation");
8356420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn            configChanged |= setRotationUncheckedLocked(
835789ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                    WindowManagerPolicy.USE_LAST_ROTATION, 0, false);
8358420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn        }
8359420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn
8360420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn        if (configChanged) {
8361420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn            mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
836289ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn        }
83639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
836406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
8365b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn    static int getPropertyInt(String[] tokens, int index, int defUnits, int defDps,
8366b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            DisplayMetrics dm) {
8367b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        if (index < tokens.length) {
8368b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            String str = tokens[index];
8369b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            if (str != null && str.length() > 0) {
8370b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                try {
8371b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                    int val = Integer.parseInt(str);
8372b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                    return val;
8373b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                } catch (Exception e) {
8374b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                }
8375b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            }
8376fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
8377fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        if (defUnits == TypedValue.COMPLEX_UNIT_PX) {
8378fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn            return defDps;
8379fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
8380fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        int val = (int)TypedValue.applyDimension(defUnits, defDps, dm);
8381fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        return val;
8382fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn    }
8383fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
8384fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn    void createWatermark() {
8385fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        if (mWatermark != null) {
8386fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn            return;
8387fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
8388fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
8389b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        File file = new File("/system/etc/setup.conf");
8390b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        FileInputStream in = null;
8391b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        try {
8392b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            in = new FileInputStream(file);
8393b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            DataInputStream ind = new DataInputStream(in);
8394b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            String line = ind.readLine();
8395b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            if (line != null) {
8396b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                String[] toks = line.split("%");
8397b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                if (toks != null && toks.length > 0) {
8398ed7bfbf6c87153c3f2f23d6856db4180d4bac429Dianne Hackborn                    mWatermark = new Watermark(mDisplay, mFxSession, toks);
8399b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                }
8400b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            }
8401b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        } catch (FileNotFoundException e) {
8402b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        } catch (IOException e) {
8403b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn        } finally {
8404b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            if (in != null) {
8405b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                try {
8406b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                    in.close();
8407b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                } catch (IOException e) {
8408b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn                }
8409b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn            }
8410fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn        }
8411fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn    }
8412fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn
84139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8414664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    public void statusBarVisibilityChanged(int visibility) {
841505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown        mInputManager.setSystemUiVisibility(visibility);
8416664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        synchronized (mWindowMap) {
8417664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            final int N = mWindows.size();
8418664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            for (int i = 0; i < N; i++) {
8419664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                WindowState ws = mWindows.get(i);
8420664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                try {
8421664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                    if (ws.getAttrs().hasSystemUiListeners) {
8422664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                        ws.mClient.dispatchSystemUiVisibilityChanged(visibility);
8423664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                    }
8424664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                } catch (RemoteException e) {
8425664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                    // so sorry
8426664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato                }
8427664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            }
8428664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        }
8429664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    }
8430664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato
8431664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    @Override
84329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
84339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mContext.checkCallingOrSelfPermission("android.permission.DUMP")
84349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                != PackageManager.PERMISSION_GRANTED) {
84359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println("Permission Denial: can't dump WindowManager from from pid="
84369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + Binder.getCallingPid()
84379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ", uid=" + Binder.getCallingUid());
84389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
84399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
844006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy
844100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        mInputManager.dump(pw);
8442a2e92266b3f768f74ab7fcb42972a22d6c739b39Dianne Hackborn        pw.println(" ");
8443a2e92266b3f768f74ab7fcb42972a22d6c739b39Dianne Hackborn
84449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(mWindowMap) {
84459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println("Current Window Manager state:");
84469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=mWindows.size()-1; i>=0; i--) {
8447e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown                WindowState w = mWindows.get(i);
84481d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print("  Window #"); pw.print(i); pw.print(' ');
84491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        pw.print(w); pw.println(":");
84509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                w.dump(pw, "    ");
84519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
84529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mInputMethodDialogs.size() > 0) {
84539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(" ");
84549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println("  Input method dialogs:");
84559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=mInputMethodDialogs.size()-1; i>=0; i--) {
84569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowState w = mInputMethodDialogs.get(i);
84571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print("  IM Dialog #"); pw.print(i); pw.print(": "); pw.println(w);
84589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
84599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
84609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mPendingRemove.size() > 0) {
84619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(" ");
84629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println("  Remove pending for:");
84639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=mPendingRemove.size()-1; i>=0; i--) {
84649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowState w = mPendingRemove.get(i);
84651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print("  Remove #"); pw.print(i); pw.print(' ');
84661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                            pw.print(w); pw.println(":");
84679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.dump(pw, "    ");
84689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
84699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
84709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mForceRemoves != null && mForceRemoves.size() > 0) {
84719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(" ");
84729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println("  Windows force removing:");
84739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=mForceRemoves.size()-1; i>=0; i--) {
84749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowState w = mForceRemoves.get(i);
84751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print("  Removing #"); pw.print(i); pw.print(' ');
84761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                            pw.print(w); pw.println(":");
84779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.dump(pw, "    ");
84789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
84799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
84809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mDestroySurface.size() > 0) {
84819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(" ");
84829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println("  Windows waiting to destroy their surface:");
84839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=mDestroySurface.size()-1; i>=0; i--) {
84849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowState w = mDestroySurface.get(i);
84851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print("  Destroy #"); pw.print(i); pw.print(' ');
84861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                            pw.print(w); pw.println(":");
84879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.dump(pw, "    ");
84889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
84899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
84909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mLosingFocus.size() > 0) {
84919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(" ");
84929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println("  Windows losing focus:");
84939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=mLosingFocus.size()-1; i>=0; i--) {
84949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowState w = mLosingFocus.get(i);
84951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print("  Losing #"); pw.print(i); pw.print(' ');
84961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                            pw.print(w); pw.println(":");
84979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w.dump(pw, "    ");
84989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
84999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
85000586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn            if (mResizingWindows.size() > 0) {
85010586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                pw.println(" ");
85020586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                pw.println("  Windows waiting to resize:");
85030586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                for (int i=mResizingWindows.size()-1; i>=0; i--) {
85040586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                    WindowState w = mResizingWindows.get(i);
85050586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                    pw.print("  Resizing #"); pw.print(i); pw.print(' ');
85060586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                            pw.print(w); pw.println(":");
85070586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                    w.dump(pw, "    ");
85080586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                }
85090586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn            }
85109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mSessions.size() > 0) {
85119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(" ");
85129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println("  All active sessions:");
85139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Iterator<Session> it = mSessions.iterator();
85149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (it.hasNext()) {
85159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Session s = it.next();
85161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print("  Session "); pw.print(s); pw.println(':');
85179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.dump(pw, "    ");
85189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
85199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
85209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mTokenMap.size() > 0) {
85219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(" ");
85229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println("  All tokens:");
85239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Iterator<WindowToken> it = mTokenMap.values().iterator();
85249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (it.hasNext()) {
85259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowToken token = it.next();
85261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print("  Token "); pw.print(token.token); pw.println(':');
85279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    token.dump(pw, "    ");
85289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
85299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
85304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            if (mWallpaperTokens.size() > 0) {
85314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                pw.println(" ");
85324c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                pw.println("  Wallpaper tokens:");
85334c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                for (int i=mWallpaperTokens.size()-1; i>=0; i--) {
85344c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    WindowToken token = mWallpaperTokens.get(i);
85354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    pw.print("  Wallpaper #"); pw.print(i);
85364c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                            pw.print(' '); pw.print(token); pw.println(':');
85374c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    token.dump(pw, "    ");
85384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                }
85394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            }
85409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mAppTokens.size() > 0) {
85419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(" ");
85429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println("  Application tokens in Z order:");
85439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=mAppTokens.size()-1; i>=0; i--) {
85441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print("  App #"); pw.print(i); pw.print(": ");
85451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                            pw.println(mAppTokens.get(i));
85469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
85479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
85489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mFinishedStarting.size() > 0) {
85499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(" ");
85509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println("  Finishing start of application tokens:");
85519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=mFinishedStarting.size()-1; i>=0; i--) {
85529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowToken token = mFinishedStarting.get(i);
85531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print("  Finished Starting #"); pw.print(i);
85541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                            pw.print(' '); pw.print(token); pw.println(':');
85559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    token.dump(pw, "    ");
85569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
85579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
85589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mExitingTokens.size() > 0) {
85599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(" ");
85609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println("  Exiting tokens:");
85619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=mExitingTokens.size()-1; i>=0; i--) {
85629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowToken token = mExitingTokens.get(i);
85631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print("  Exiting #"); pw.print(i);
85641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                            pw.print(' '); pw.print(token); pw.println(':');
85659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    token.dump(pw, "    ");
85669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
85679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
85689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mExitingAppTokens.size() > 0) {
85699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println(" ");
85709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println("  Exiting application tokens:");
85719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=mExitingAppTokens.size()-1; i>=0; i--) {
85729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowToken token = mExitingAppTokens.get(i);
85731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print("  Exiting App #"); pw.print(i);
85741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                            pw.print(' '); pw.print(token); pw.println(':');
85759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    token.dump(pw, "    ");
85769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
85779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
85789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println(" ");
85791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mCurrentFocus="); pw.println(mCurrentFocus);
85801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mLastFocus="); pw.println(mLastFocus);
85811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mFocusedApp="); pw.println(mFocusedApp);
85821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mInputMethodTarget="); pw.println(mInputMethodTarget);
85831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mInputMethodWindow="); pw.println(mInputMethodWindow);
8584f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn            pw.print("  mWallpaperTarget="); pw.println(mWallpaperTarget);
8585284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            if (mLowerWallpaperTarget != null && mUpperWallpaperTarget != null) {
8586284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                pw.print("  mLowerWallpaperTarget="); pw.println(mLowerWallpaperTarget);
8587284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                pw.print("  mUpperWallpaperTarget="); pw.println(mUpperWallpaperTarget);
8588284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            }
85896c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            if (mWindowDetachedWallpaper != null) {
85906c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn                pw.print("  mWindowDetachedWallpaper="); pw.println(mWindowDetachedWallpaper);
85916c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn            }
8592e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            pw.print("  mCurConfiguration="); pw.println(this.mCurConfiguration);
8593e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            pw.print("  mInTouchMode="); pw.print(mInTouchMode);
8594e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    pw.print(" mLayoutSeq="); pw.println(mLayoutSeq);
85951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mSystemBooted="); pw.print(mSystemBooted);
85961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(" mDisplayEnabled="); pw.println(mDisplayEnabled);
85971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mLayoutNeeded="); pw.print(mLayoutNeeded);
85981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(" mBlurShown="); pw.println(mBlurShown);
85990a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima            if (mDimAnimator != null) {
86000a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima                mDimAnimator.printTo(pw);
86010a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima            } else {
8602a2e92266b3f768f74ab7fcb42972a22d6c739b39Dianne Hackborn                pw.println( "  no DimAnimator ");
86030a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima            }
86041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mInputMethodAnimLayerAdjustment=");
8605759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    pw.print(mInputMethodAnimLayerAdjustment);
8606759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    pw.print("  mWallpaperAnimLayerAdjustment=");
8607759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn                    pw.println(mWallpaperAnimLayerAdjustment);
8608284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn            pw.print("  mLastWallpaperX="); pw.print(mLastWallpaperX);
8609284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn                    pw.print(" mLastWallpaperY="); pw.println(mLastWallpaperY);
86101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mDisplayFrozen="); pw.print(mDisplayFrozen);
86111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(" mWindowsFreezingScreen="); pw.print(mWindowsFreezingScreen);
8612e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    pw.print(" mAppsFreezingScreen="); pw.print(mAppsFreezingScreen);
8613e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    pw.print(" mWaitingForConfig="); pw.println(mWaitingForConfig);
86141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mRotation="); pw.print(mRotation);
86151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(", mForcedAppOrientation="); pw.print(mForcedAppOrientation);
86161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(", mRequestedRotation="); pw.println(mRequestedRotation);
861789ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn            pw.print("  mDeferredRotation="); pw.print(mDeferredRotation);
861889ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn                    pw.print(", mDeferredRotationAnimFlags="); pw.print(mDeferredRotationAnimFlags);
86191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mAnimationPending="); pw.print(mAnimationPending);
86201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(" mWindowAnimationScale="); pw.print(mWindowAnimationScale);
86211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(" mTransitionWindowAnimationScale="); pw.println(mTransitionAnimationScale);
86221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mNextAppTransition=0x");
86231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(Integer.toHexString(mNextAppTransition));
86241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(", mAppTransitionReady="); pw.print(mAppTransitionReady);
8625a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                    pw.print(", mAppTransitionRunning="); pw.print(mAppTransitionRunning);
86261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(", mAppTransitionTimeout="); pw.println( mAppTransitionTimeout);
86273b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            if (mNextAppTransitionPackage != null) {
86283b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                pw.print("  mNextAppTransitionPackage=");
86293b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    pw.print(mNextAppTransitionPackage);
86303b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    pw.print(", mNextAppTransitionEnter=0x");
86313b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    pw.print(Integer.toHexString(mNextAppTransitionEnter));
86323b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    pw.print(", mNextAppTransitionExit=0x");
86333b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn                    pw.print(Integer.toHexString(mNextAppTransitionExit));
86343b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn            }
86351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print("  mStartingIconInTransition="); pw.print(mStartingIconInTransition);
86361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    pw.print(", mSkipAppTransitionAnimation="); pw.println(mSkipAppTransitionAnimation);
86371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (mOpeningApps.size() > 0) {
86381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print("  mOpeningApps="); pw.println(mOpeningApps);
86391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
86401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (mClosingApps.size() > 0) {
86411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pw.print("  mClosingApps="); pw.println(mClosingApps);
86421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
8643a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            if (mToTopApps.size() > 0) {
8644a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                pw.print("  mToTopApps="); pw.println(mToTopApps);
8645a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
8646a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            if (mToBottomApps.size() > 0) {
8647a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn                pw.print("  mToBottomApps="); pw.println(mToBottomApps);
8648a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn            }
864987fc30828209afa25be69ac7053241f4eaeb3378Dianne Hackborn            if (mDisplay != null) {
865087fc30828209afa25be69ac7053241f4eaeb3378Dianne Hackborn                pw.print("  DisplayWidth="); pw.print(mDisplay.getWidth());
865187fc30828209afa25be69ac7053241f4eaeb3378Dianne Hackborn                        pw.print(" DisplayHeight="); pw.println(mDisplay.getHeight());
865287fc30828209afa25be69ac7053241f4eaeb3378Dianne Hackborn            } else {
865387fc30828209afa25be69ac7053241f4eaeb3378Dianne Hackborn                pw.println("  NO DISPLAY");
865487fc30828209afa25be69ac7053241f4eaeb3378Dianne Hackborn            }
8655f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            pw.println("  Policy:");
8656f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn            mPolicy.dump("    ", fd, pw, args);
86579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
86589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
86599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8660349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown    // Called by the heartbeat to ensure locks are not held indefnitely (for deadlock detection).
86619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void monitor() {
86629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mWindowMap) { }
8663983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood        synchronized (mKeyguardTokenWatcher) { }
8664ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    }
8665ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker
86662992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    public interface OnHardKeyboardStatusChangeListener {
86672992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown        public void onHardKeyboardStatusChange(boolean available, boolean enabled);
86682992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown    }
86699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8670