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