WindowManagerService.java revision 48a7651823030ed3c0f4c084b423430044425fea
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackbornpackage com.android.server.wm; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FLAG_BLUR_BEHIND; 225fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackbornimport static android.view.WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; 274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG; 344c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackbornimport static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.app.IBatteryStats; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.policy.PolicyManager; 38b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackbornimport com.android.internal.policy.impl.PhoneWindowManager; 39a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tateimport com.android.internal.view.BaseInputHandler; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.view.IInputContext; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.view.IInputMethodClient; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.view.IInputMethodManager; 43ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackbornimport com.android.internal.view.WindowManagerPolicyThread; 44a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackbornimport com.android.server.AttributeCache; 45a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackbornimport com.android.server.EventLogTags; 46a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackbornimport com.android.server.PowerManagerService; 47a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackbornimport com.android.server.Watchdog; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.server.am.BatteryStatsService; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.Manifest; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.ActivityManagerNative; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.IActivityManager; 53ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onoratoimport android.app.StatusBarManager; 54d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Millerimport android.app.admin.DevicePolicyManager; 55284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Millerimport android.content.BroadcastReceiver; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 57284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Millerimport android.content.Intent; 58284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Millerimport android.content.IntentFilter; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ActivityInfo; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 611ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshimaimport android.content.res.CompatibilityInfo; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Configuration; 630aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackbornimport android.graphics.Bitmap; 64fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackbornimport android.graphics.Canvas; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Matrix; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PixelFormat; 67ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackbornimport android.graphics.Point; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Region; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.BatteryStats; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 727580493b014a2c7ea883cd291255798dc72ebbffDianne Hackbornimport android.os.Bundle; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Debug; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.LocalPowerManager; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Looper; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFileDescriptor; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Power; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PowerManager; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 86ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrickimport android.os.StrictMode; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemProperties; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.TokenWatcher; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Settings; 91723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackbornimport android.util.DisplayMetrics; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.EventLog; 93d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Millerimport android.util.Log; 948a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseIntArray; 96fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackbornimport android.util.TypedValue; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Display; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IApplicationToken; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IOnKeyguardExitResult; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IRotationWatcher; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindow; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindowManager; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindowSession; 10446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport android.view.InputChannel; 105c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brownimport android.view.InputDevice; 106bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brownimport android.view.InputEvent; 107a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tateimport android.view.InputHandler; 108a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tateimport android.view.InputQueue; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Surface; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SurfaceSession; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerImpl; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerPolicy; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager.LayoutParams; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Animation; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.AnimationUtils; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Transformation; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.BufferedWriter; 123b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackbornimport java.io.DataInputStream; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 126b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackbornimport java.io.FileInputStream; 127b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackbornimport java.io.FileNotFoundException; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStream; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStreamWriter; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.StringWriter; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.Socket; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashSet; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** {@hide} */ 141ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackbornpublic class WindowManagerService extends IWindowManager.Stub 14200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown implements Watchdog.Monitor { 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final String TAG = "WindowManager"; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG = false; 145f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn static final boolean DEBUG_ADD_REMOVE = false; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_FOCUS = false; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_ANIM = false; 1489b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn static final boolean DEBUG_LAYOUT = false; 149ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn static final boolean DEBUG_RESIZE = false; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_LAYERS = false; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_INPUT = false; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_INPUT_METHOD = false; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_VISIBILITY = false; 154bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn static final boolean DEBUG_WINDOW_MOVEMENT = false; 155f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn static final boolean DEBUG_TOKEN_MOVEMENT = false; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_ORIENTATION = false; 157bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn static final boolean DEBUG_APP_ORIENTATION = false; 158694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn static final boolean DEBUG_CONFIGURATION = false; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_APP_TRANSITIONS = false; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_STARTING_WINDOW = false; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_REORDER = false; 1627341d7a104b47996445d069a695e155a07184606Dianne Hackborn static final boolean DEBUG_WALLPAPER = false; 163994ef9296a00523de1df424b4b760b4416ead58bChristopher Tate static final boolean DEBUG_DRAG = false; 1645fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn static final boolean SHOW_SURFACE_ALLOC = false; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean SHOW_TRANSACTIONS = false; 1669bfb707597898f54722460b48588007b682f3e2aDianne Hackborn static final boolean HIDE_STACK_CRAWLS = true; 16753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean PROFILE_ORIENTATION = false; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean BLUR = true; 170cfe6524071624b6679e5fa4db847328e8d0317c8Dave Bort static final boolean localLOGV = DEBUG; 17106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** How much to multiply the policy's type layer, to reserve room 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for multiple windows of the same type and Z-ordering adjustment 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with TYPE_LAYER_OFFSET. */ 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int TYPE_LAYER_MULTIPLIER = 10000; 17606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Offset from TYPE_LAYER_MULTIPLIER for moving a group of windows above 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or below others in the same layer. */ 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int TYPE_LAYER_OFFSET = 1000; 18006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** How much to increment the layer for each window, to reserve room 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for effect surfaces between them. 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int WINDOW_LAYER_MULTIPLIER = 5; 18506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 186de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn /** 187de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn * Dim surface layer is immediately below target window. 188de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn */ 189de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn static final int LAYER_OFFSET_DIM = 1; 190de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn 191de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn /** 192de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn * Blur surface layer is immediately below dim layer. 193de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn */ 194de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn static final int LAYER_OFFSET_BLUR = 2; 195de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn 1967916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn /** 1977916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn * Layer at which to put the rotation freeze snapshot. 1987916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn */ 1997916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn static final int FREEZE_LAYER = (TYPE_LAYER_MULTIPLIER * 200) + 1; 2007916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 2017916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn /** 2027916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn * Layer at which to put the mask for emulated screen sizes. 2037916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn */ 2047916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn static final int MASK_LAYER = TYPE_LAYER_MULTIPLIER * 200; 2057916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The maximum length we will accept for a loaded animation duration: 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this is 10 seconds. 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int MAX_ANIMATION_DURATION = 10*1000; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Amount of time (in milliseconds) to animate the dim surface from one 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * value to another, when no window animation is driving it. 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int DEFAULT_DIM_DURATION = 200; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2160a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima /** Amount of time (in milliseconds) to animate the fade-in-out transition for 2170a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima * compatible windows. 2180a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima */ 2190a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima static final int DEFAULT_FADE_IN_OUT_DURATION = 400; 2200a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima 221a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn /** 222a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn * If true, the window manager will do its own custom freezing and general 223a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn * management of the screen during rotation. 224a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn */ 225a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn static final boolean CUSTOM_SCREEN_ROTATION = true; 226a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn 2277fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown // Maximum number of milliseconds to wait for input event injection. 2287fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown // FIXME is this value reasonable? 2297fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown private static final int INJECTION_TIMEOUT_MILLIS = 30 * 1000; 230b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown 231b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown // Maximum number of milliseconds to wait for input devices to be enumerated before 232b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown // proceding with safe mode detection. 233b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown private static final int INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS = 1000; 234349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 235349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // Default input dispatching timeout in nanoseconds. 2366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn static final long DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS = 5000 * 1000000L; 23706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int UPDATE_FOCUS_NORMAL = 0; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int UPDATE_FOCUS_WILL_ASSIGN_LAYERS = 1; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int UPDATE_FOCUS_PLACING_SURFACES = 2; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int UPDATE_FOCUS_WILL_PLACE_SURFACES = 3; 24206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String SYSTEM_SECURE = "ro.secure"; 24406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy private static final String SYSTEM_DEBUGGABLE = "ro.debuggable"; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Condition waited on by {@link #reenableKeyguard} to know the call to 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the window policy has finished. 249983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood * This is set to true only if mKeyguardTokenWatcher.acquired() has 250983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood * actually disabled the keyguard. 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 252983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood private boolean mKeyguardDisabled = false; 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 254284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller private static final int ALLOW_DISABLE_YES = 1; 255284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller private static final int ALLOW_DISABLE_NO = 0; 256284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller private static final int ALLOW_DISABLE_UNKNOWN = -1; // check with DevicePolicyManager 257284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller private int mAllowDisableKeyguard = ALLOW_DISABLE_UNKNOWN; // sync'd by mKeyguardTokenWatcher 258284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller 259983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood final TokenWatcher mKeyguardTokenWatcher = new TokenWatcher( 260983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood new Handler(), "WindowManagerService.mKeyguardTokenWatcher") { 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void acquired() { 262284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller if (shouldAllowDisableKeyguard()) { 263284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mPolicy.enableKeyguard(false); 264284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mKeyguardDisabled = true; 265284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller } else { 266284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller Log.v(TAG, "Not disabling keyguard since device policy is enforced"); 267284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller } 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void released() { 270a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn mPolicy.enableKeyguard(true); 271983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood synchronized (mKeyguardTokenWatcher) { 272983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood mKeyguardDisabled = false; 273983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood mKeyguardTokenWatcher.notifyAll(); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 278284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 279284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller @Override 280284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller public void onReceive(Context context, Intent intent) { 281284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mPolicy.enableKeyguard(true); 282284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller synchronized(mKeyguardTokenWatcher) { 283284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // lazily evaluate this next time we're asked to disable keyguard 284284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mAllowDisableKeyguard = ALLOW_DISABLE_UNKNOWN; 285284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mKeyguardDisabled = false; 286284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller } 287284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller } 288284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller }; 289284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Context mContext; 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean mHaveInputMethods; 29306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean mLimitedAlphaCompositing; 29506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowManagerPolicy mPolicy = PolicyManager.makeNewWindowManager(); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IActivityManager mActivityManager; 29906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IBatteryStats mBatteryStats; 30106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All currently active sessions with clients. 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashSet<Session> mSessions = new HashSet<Session>(); 30606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Mapping from an IWindow IBinder to the server's Window object. 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is also used as the lock for all of our state. 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<IBinder, WindowState> mWindowMap = new HashMap<IBinder, WindowState>(); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Mapping from a token IBinder to a WindowToken object. 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<IBinder, WindowToken> mTokenMap = 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new HashMap<IBinder, WindowToken>(); 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Window tokens that are in the process of exiting, but still 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on screen for animations. 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<WindowToken> mExitingTokens = new ArrayList<WindowToken>(); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Z-ordered (bottom-most first) list of all application tokens, for 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * controlling the ordering of windows in different applications. This 328f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn * contains AppWindowToken objects. 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<AppWindowToken> mAppTokens = new ArrayList<AppWindowToken>(); 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Application tokens that are in the process of exiting, but still 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on screen for animations. 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<AppWindowToken> mExitingAppTokens = new ArrayList<AppWindowToken>(); 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * List of window tokens that have finished starting their application, 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and now need to have the policy remove their windows. 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<AppWindowToken> mFinishedStarting = new ArrayList<AppWindowToken>(); 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Z-ordered (bottom-most first) list of all Window objects. 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 347e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown final ArrayList<WindowState> mWindows = new ArrayList<WindowState>(); 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Windows that are being resized. Used so we can tell the client about 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the resize after closing the transaction in which we resized the 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * underlying surface. 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<WindowState> mResizingWindows = new ArrayList<WindowState>(); 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Windows whose animations have ended and now must be removed. 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<WindowState> mPendingRemove = new ArrayList<WindowState>(); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 362f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn * Used when processing mPendingRemove to avoid working on the original array. 363f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn */ 364f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn WindowState[] mPendingRemoveTmp = new WindowState[20]; 365f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn 366f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn /** 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Windows whose surface should be destroyed. 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<WindowState> mDestroySurface = new ArrayList<WindowState>(); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Windows that have lost input focus and are waiting for the new 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * focus window to be displayed before they are told about this. 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<WindowState> mLosingFocus = new ArrayList<WindowState>(); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is set when we have run out of memory, and will either be an empty 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * list or contain windows that need to be force removed. 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<WindowState> mForceRemoves; 38206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 383f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn /** 384f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn * Used when rebuilding window list to keep track of windows that have 385f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn * been removed. 386f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn */ 387f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn WindowState[] mRebuildTmp = new WindowState[20]; 388f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IInputMethodManager mInputMethodManager; 39006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SurfaceSession mFxSession; 3920a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima private DimAnimator mDimAnimator = null; 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Surface mBlurSurface; 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mBlurShown; 395fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn Watermark mWatermark; 3966804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick StrictModeFlash mStrictModeFlash; 397a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn ScreenRotationAnimation mScreenRotationAnimation; 39806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 3997916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn BlackFrame mBlackFrame; 4007916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mTransactionSequence = 0; 40206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final float[] mTmpFloats = new float[9]; 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mSafeMode; 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mDisplayEnabled = false; 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mSystemBooted = false; 408b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate int mInitialDisplayWidth = 0; 409b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate int mInitialDisplayHeight = 0; 4107916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn int mBaseDisplayWidth = 0; 4117916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn int mBaseDisplayHeight = 0; 412ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn int mCurDisplayWidth = 0; 413ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn int mCurDisplayHeight = 0; 41481e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn int mAppDisplayWidth = 0; 41581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn int mAppDisplayHeight = 0; 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mRotation = 0; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mRequestedRotation = 0; 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mForcedAppOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 41968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn boolean mAltOrientation = false; 420321ae681cad03d00ad1efc6f06f74268e00172a9Dianne Hackborn int mLastRotationFlags; 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<IRotationWatcher> mRotationWatchers 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new ArrayList<IRotationWatcher>(); 42389ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn int mDeferredRotation; 42489ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn int mDeferredRotationAnimFlags; 42506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mLayoutNeeded = true; 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mAnimationPending = false; 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mDisplayFrozen = false; 429e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean mWaitingForConfig = false; 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mWindowsFreezingScreen = false; 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mFreezeGcPending = 0; 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mAppsFreezingScreen = 0; 433bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn int mLastWindowForcedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 435e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn int mLayoutSeq = 0; 436e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 437b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn // State while inside of layoutAndPlaceSurfacesLocked(). 438b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn boolean mFocusMayChange; 439b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn 440e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn Configuration mCurConfiguration = new Configuration(); 441e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This is held as long as we have the screen frozen, to give us time to 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // perform a rotation animation when turning off shows the lock screen which 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // changes the orientation. 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PowerManager.WakeLock mScreenFrozenLock; 44606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // State management of app transitions. When we are preparing for a 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // transition, mNextAppTransition will be the kind of transition to 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // perform or TRANSIT_NONE if we are not waiting. If we are waiting, 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // mOpeningApps and mClosingApps are the lists of tokens that will be 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // made visible or hidden at the next transition. 452bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn int mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET; 4533b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn String mNextAppTransitionPackage; 4543b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn int mNextAppTransitionEnter; 4553b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn int mNextAppTransitionExit; 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mAppTransitionReady = false; 457a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn boolean mAppTransitionRunning = false; 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mAppTransitionTimeout = false; 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mStartingIconInTransition = false; 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mSkipAppTransitionAnimation = false; 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<AppWindowToken> mOpeningApps = new ArrayList<AppWindowToken>(); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<AppWindowToken> mClosingApps = new ArrayList<AppWindowToken>(); 463a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn final ArrayList<AppWindowToken> mToTopApps = new ArrayList<AppWindowToken>(); 464a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn final ArrayList<AppWindowToken> mToBottomApps = new ArrayList<AppWindowToken>(); 46506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Display mDisplay; 46706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4685fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn final DisplayMetrics mDisplayMetrics = new DisplayMetrics(); 46948a7651823030ed3c0f4c084b423430044425feaDianne Hackborn final DisplayMetrics mTmpDisplayMetrics = new DisplayMetrics(); 4705fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn final DisplayMetrics mCompatDisplayMetrics = new DisplayMetrics(); 4715fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project H mH = new H(); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState mCurrentFocus = null; 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState mLastFocus = null; 47606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This just indicates the window the input method is on top of, not 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // necessarily the window its input is going to. 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState mInputMethodTarget = null; 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mInputMethodTargetWaitingAnim; 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mInputMethodAnimLayerAdjustment; 48206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState mInputMethodWindow = null; 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<WindowState> mInputMethodDialogs = new ArrayList<WindowState>(); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4862992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown boolean mHardKeyboardAvailable; 4872992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown boolean mHardKeyboardEnabled; 4882992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown OnHardKeyboardStatusChangeListener mHardKeyboardStatusChangeListener; 4892992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 4904c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>(); 491ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 492759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn // If non-null, this is the currently visible window that is associated 493759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn // with the wallpaper. 494759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn WindowState mWallpaperTarget = null; 4953be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // If non-null, we are in the middle of animating from one wallpaper target 4963be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // to another, and this is the lower one in Z-order. 4973be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn WindowState mLowerWallpaperTarget = null; 4983be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // If non-null, we are in the middle of animating from one wallpaper target 4993be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // to another, and this is the higher one in Z-order. 5003be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn WindowState mUpperWallpaperTarget = null; 5016c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // Window currently running an animation that has requested it be detached 5026c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // from the wallpaper. This means we need to ensure the wallpaper is 5036c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // visible behind it in case it animates in a way that would allow it to be 5046c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // seen. 5056c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn WindowState mWindowDetachedWallpaper = null; 506de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn DimSurface mWindowAnimationBackgroundSurface = null; 507759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn int mWallpaperAnimLayerAdjustment; 50873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn float mLastWallpaperX = -1; 50973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn float mLastWallpaperY = -1; 510bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen float mLastWallpaperXStep = -1; 511bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen float mLastWallpaperYStep = -1; 51219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn // This is set when we are waiting for a wallpaper to tell us it is done 51319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn // changing its scroll position. 51419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn WindowState mWaitingOnWallpaper; 51519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn // The last time we had a timeout when waiting for a wallpaper. 51619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn long mLastWallpaperTimeoutTime; 51719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn // We give a wallpaper up to 150ms to finish scrolling. 51819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn static final long WALLPAPER_TIMEOUT = 150; 51919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn // Time we wait after a timeout before trying to wait again. 52019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn static final long WALLPAPER_TIMEOUT_RECOVERY = 10000; 521ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken mFocusedApp = null; 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PowerManagerService mPowerManager; 52506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float mWindowAnimationScale = 1.0f; 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float mTransitionAnimationScale = 1.0f; 52806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 52946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown final InputManager mInputManager; 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Who is holding the screen on. 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Session mHoldingScreenOn; 53346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown PowerManager.WakeLock mHoldingScreenWakeLock; 53406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 53593e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn boolean mTurnOnScreen; 536ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 537a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate DragState mDragState = null; 5386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final InputHandler mDragInputHandler = new BaseInputHandler() { 539a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate @Override 5403915bb845b032dc184dba5e60970b803390ca3edJeff Brown public void handleMotion(MotionEvent event, InputQueue.FinishedCallback finishedCallback) { 5413915bb845b032dc184dba5e60970b803390ca3edJeff Brown boolean handled = false; 542a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate try { 5433915bb845b032dc184dba5e60970b803390ca3edJeff Brown if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0 5443915bb845b032dc184dba5e60970b803390ca3edJeff Brown && mDragState != null) { 5453915bb845b032dc184dba5e60970b803390ca3edJeff Brown boolean endDrag = false; 5463915bb845b032dc184dba5e60970b803390ca3edJeff Brown final float newX = event.getRawX(); 5473915bb845b032dc184dba5e60970b803390ca3edJeff Brown final float newY = event.getRawY(); 5483915bb845b032dc184dba5e60970b803390ca3edJeff Brown 549a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate switch (event.getAction()) { 550a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate case MotionEvent.ACTION_DOWN: { 551a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (DEBUG_DRAG) { 552a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate Slog.w(TAG, "Unexpected ACTION_DOWN in drag layer"); 553a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 554a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } break; 555a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 556a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate case MotionEvent.ACTION_MOVE: { 557a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate synchronized (mWindowMap) { 5582c095f367779ef32130c72849936a2e3013c8492Christopher Tate // move the surface and tell the involved window(s) where we are 559a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate mDragState.notifyMoveLw(newX, newY); 560a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 561a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } break; 562a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 563a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate case MotionEvent.ACTION_UP: { 564a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (DEBUG_DRAG) Slog.d(TAG, "Got UP on move channel; dropping at " 565a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate + newX + "," + newY); 566a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate synchronized (mWindowMap) { 567d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate endDrag = mDragState.notifyDropLw(newX, newY); 568a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 569a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } break; 570a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 571a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate case MotionEvent.ACTION_CANCEL: { 572a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (DEBUG_DRAG) Slog.d(TAG, "Drag cancelled!"); 573a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate endDrag = true; 574a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } break; 575a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 576a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 577a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (endDrag) { 578a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (DEBUG_DRAG) Slog.d(TAG, "Drag ended; tearing down state"); 579a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate // tell all the windows that the drag has ended 5805994359f3009a3ebfbd37d82bb9a665e9b947851Chris Tate synchronized (mWindowMap) { 581d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate mDragState.endDragLw(); 5825994359f3009a3ebfbd37d82bb9a665e9b947851Chris Tate } 583a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 5843915bb845b032dc184dba5e60970b803390ca3edJeff Brown 5853915bb845b032dc184dba5e60970b803390ca3edJeff Brown handled = true; 586a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 587a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } catch (Exception e) { 588a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate Slog.e(TAG, "Exception caught by drag handleMotion", e); 589a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } finally { 5903915bb845b032dc184dba5e60970b803390ca3edJeff Brown finishedCallback.finished(handled); 591a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 592a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 593a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate }; 594a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 595a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate /** 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether the UI is currently running in touch mode (not showing 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * navigational focus because the user is directly pressing the screen). 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mInTouchMode = false; 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ViewServer mViewServer; 602dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev private ArrayList<WindowChangeListener> mWindowChangeListeners = 603dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev new ArrayList<WindowChangeListener>(); 604dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev private boolean mWindowsChanged = false; 605dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev 606dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev public interface WindowChangeListener { 607dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev public void windowsChanged(); 6086e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev public void focusChanged(); 609dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 611c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn final Configuration mTempConfiguration = new Configuration(); 6121ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima 6132f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn // The desired scaling factor for compatible apps. 614e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn float mCompatibleScreenScale; 6151ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static WindowManagerService main(Context context, 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PowerManagerService pm, boolean haveInputMethods) { 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WMThread thr = new WMThread(context, pm, haveInputMethods); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thr.start(); 62006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (thr) { 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (thr.mService == null) { 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thr.wait(); 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62806e57b5d46c87e9dd7bca1386b63b3a8522f51efJozef BABJAK return thr.mService; 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static class WMThread extends Thread { 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManagerService mService; 63406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Context mContext; 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final PowerManagerService mPM; 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final boolean mHaveInputMethods; 63806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WMThread(Context context, PowerManagerService pm, 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean haveInputMethods) { 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super("WindowManager"); 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPM = pm; 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHaveInputMethods = haveInputMethods; 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Looper.prepare(); 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManagerService s = new WindowManagerService(mContext, mPM, 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHaveInputMethods); 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.os.Process.setThreadPriority( 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.os.Process.THREAD_PRIORITY_DISPLAY); 653160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate android.os.Process.setCanSelfBackground(false); 65406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = s; 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 660ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick // For debug builds, log event loop stalls to dropbox for analysis. 661ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick if (StrictMode.conditionallyEnableDebugLogging()) { 662ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick Slog.i(TAG, "Enabled StrictMode logging for WMThread's Looper"); 663ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick } 664ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Looper.loop(); 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static class PolicyThread extends Thread { 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final WindowManagerPolicy mPolicy; 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final WindowManagerService mService; 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Context mContext; 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final PowerManagerService mPM; 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mRunning = false; 67506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PolicyThread(WindowManagerPolicy policy, 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManagerService service, Context context, 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PowerManagerService pm) { 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super("WindowManagerPolicy"); 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy = policy; 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = service; 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPM = pm; 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Looper.prepare(); 688ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn WindowManagerPolicyThread.set(this, Looper.myLooper()); 689ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Looper.myLooper().setMessageLogging(new LogPrinter( 6918a9b22056b13477f59df934928c00c58b5871c95Joe Onorato // Log.VERBOSE, "WindowManagerPolicy", Log.LOG_ID_SYSTEM)); 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.os.Process.setThreadPriority( 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.os.Process.THREAD_PRIORITY_FOREGROUND); 694160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate android.os.Process.setCanSelfBackground(false); 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.init(mContext, mService, mPM); 69606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunning = true; 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 70106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 702ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick // For debug builds, log event loop stalls to dropbox for analysis. 703ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick if (StrictMode.conditionallyEnableDebugLogging()) { 704ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick Slog.i(TAG, "Enabled StrictMode for PolicyThread's Looper"); 705ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick } 706ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Looper.loop(); 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WindowManagerService(Context context, PowerManagerService pm, 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean haveInputMethods) { 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHaveInputMethods = haveInputMethods; 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLimitedAlphaCompositing = context.getResources().getBoolean( 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.bool.config_sf_limitedAlpha); 71706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPowerManager = pm; 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPowerManager.setPolicy(mPolicy); 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PowerManager pmc = (PowerManager)context.getSystemService(Context.POWER_SERVICE); 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenFrozenLock = pmc.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "SCREEN_FROZEN"); 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenFrozenLock.setReferenceCounted(false); 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityManager = ActivityManagerNative.getDefault(); 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryStats = BatteryStatsService.getService(); 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get persisted window scale setting 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowAnimationScale = Settings.System.getFloat(context.getContentResolver(), 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.System.WINDOW_ANIMATION_SCALE, mWindowAnimationScale); 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTransitionAnimationScale = Settings.System.getFloat(context.getContentResolver(), 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.System.TRANSITION_ANIMATION_SCALE, mTransitionAnimationScale); 73306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 734284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // Track changes to DevicePolicyManager state so we can enable/disable keyguard. 735284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller IntentFilter filter = new IntentFilter(); 736284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED); 737284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mContext.registerReceiver(mBroadcastReceiver, filter); 738284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller 73946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mHoldingScreenWakeLock = pmc.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, 74046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "KEEP_SCREEN_ON_FLAG"); 74146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mHoldingScreenWakeLock.setReferenceCounted(false); 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 743e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown mInputManager = new InputManager(context, this); 74406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PolicyThread thr = new PolicyThread(mPolicy, this, context, pm); 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thr.start(); 74706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (thr) { 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!thr.mRunning) { 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thr.wait(); 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 75606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 75700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputManager.start(); 75806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Add ourself to the Watchdog monitors. 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Watchdog.getInstance().addMonitor(this); 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onTransact(int code, Parcel data, Parcel reply, int flags) 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws RemoteException { 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.onTransact(code, data, reply, flags); 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The window manager only throws security exceptions, so let's 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // log all others. 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!(e instanceof SecurityException)) { 7728a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.e(TAG, "Window Manager Crash", e); 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw e; 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 778e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown private void placeWindowAfter(WindowState pos, WindowState window) { 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int i = mWindows.indexOf(pos); 780f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v( 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Adding window " + window + " at " 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (i+1) + " of " + mWindows.size() + " (after " + pos + ")"); 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.add(i+1, window); 784dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 787e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown private void placeWindowBefore(WindowState pos, WindowState window) { 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int i = mWindows.indexOf(pos); 789f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v( 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Adding window " + window + " at " 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + i + " of " + mWindows.size() + " (before " + pos + ")"); 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.add(i, window); 793dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //This method finds out the index of a window that has the same app token as 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //win. used for z ordering the windows in mWindows 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int findIdxBasedOnAppTokens(WindowState win) { 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //use a local variable to cache mWindows 800e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown ArrayList<WindowState> localmWindows = mWindows; 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int jmax = localmWindows.size(); 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(jmax == 0) { 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int j = (jmax-1); j >= 0; j--) { 806e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState wentry = localmWindows.get(j); 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(wentry.mAppToken == win.mAppToken) { 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return j; 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void addWindowToListInOrderLocked(WindowState win, boolean addToToken) { 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IWindow client = win.mClient; 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowToken token = win.mToken; 817e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown final ArrayList<WindowState> localmWindows = mWindows; 81806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = localmWindows.size(); 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowState attached = win.mAttachedWindow; 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attached == null) { 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int tokenWindowsPos = token.windows.size(); 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token.appWindowToken != null) { 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = tokenWindowsPos-1; 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index >= 0) { 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this application has existing windows, we 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // simply place the new window on top of them... but 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // keep the starting window on top. 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mAttrs.type == TYPE_BASE_APPLICATION) { 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Base windows go behind everything else. 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project placeWindowBefore(token.windows.get(0), win); 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tokenWindowsPos = 0; 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken atoken = win.mAppToken; 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken != null && 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.windows.get(index) == atoken.startingWindow) { 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project placeWindowBefore(token.windows.get(index), win); 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tokenWindowsPos--; 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int newIdx = findIdxBasedOnAppTokens(win); 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(newIdx != -1) { 84306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy //there is a window above this one associated with the same 84406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy //apptoken note that the window could be a floating window 84506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy //that was created later or a window at the top of the list of 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //windows associated with this token. 847f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) { 848f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn Slog.v(TAG, "Adding window " + win + " at " 849f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn + (newIdx+1) + " of " + N); 850f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project localmWindows.add(newIdx+1, win); 852dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 85306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy } 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8578a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v( 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Figuring out where to add app window " 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + client.asBinder() + " (token=" + token + ")"); 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Figure out where the window should go, based on the 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // order of applications. 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NA = mAppTokens.size(); 863e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState pos = null; 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=NA-1; i>=0; i--) { 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken t = mAppTokens.get(i); 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == token) { 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 870ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 871a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // We haven't reached the token yet; if this token 872a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // is not going to the bottom and has windows, we can 873a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // use it as an anchor for when we do reach the token. 874a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (!t.sendingToBottom && t.windows.size() > 0) { 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = t.windows.get(0); 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We now know the index into the apps. If we found 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // an app window above, that gives us the position; else 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we need to look some more. 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos != null) { 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Move behind any windows attached to this one. 883e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowToken atoken = mTokenMap.get(pos.mClient.asBinder()); 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken != null) { 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NC = atoken.windows.size(); 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NC > 0) { 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState bottom = atoken.windows.get(0); 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bottom.mSubLayer < 0) { 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = bottom; 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project placeWindowBefore(pos, win); 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 895a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // Continue looking down until we find the first 896a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // token that has windows. 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i >= 0) { 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken t = mAppTokens.get(i); 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NW = t.windows.size(); 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NW > 0) { 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = t.windows.get(NW-1); 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos != null) { 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Move in front of any windows attached to this 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // one. 909e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowToken atoken = mTokenMap.get(pos.mClient.asBinder()); 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken != null) { 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NC = atoken.windows.size(); 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NC > 0) { 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState top = atoken.windows.get(NC-1); 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (top.mSubLayer >= 0) { 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = top; 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project placeWindowAfter(pos, win); 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Just search for the start of this layer. 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int myLayer = win.mBaseLayer; 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 924e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = localmWindows.get(i); 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mBaseLayer > myLayer) { 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 929f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) { 930f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn Slog.v(TAG, "Adding window " + win + " at " 931f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn + i + " of " + N); 932f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project localmWindows.add(i, win); 934dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Figure out where window should go, based on layer. 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int myLayer = win.mBaseLayer; 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=N-1; i>=0; i--) { 942e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown if (localmWindows.get(i).mBaseLayer <= myLayer) { 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i < 0) i = 0; 948f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v( 9499bfb707597898f54722460b48588007b682f3e2aDianne Hackborn TAG, "Adding window " + win + " at " 9509bfb707597898f54722460b48588007b682f3e2aDianne Hackborn + i + " of " + N); 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project localmWindows.add(i, win); 952dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (addToToken) { 955f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token); 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.windows.add(tokenWindowsPos, win); 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Figure out this window's ordering relative to the window 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it is attached to. 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NA = token.windows.size(); 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int sublayer = win.mSubLayer; 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int largestSublayer = Integer.MIN_VALUE; 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState windowWithLargestSublayer = null; 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<NA; i++) { 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState w = token.windows.get(i); 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int wSublayer = w.mSubLayer; 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wSublayer >= largestSublayer) { 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project largestSublayer = wSublayer; 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project windowWithLargestSublayer = w; 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sublayer < 0) { 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For negative sublayers, we go below all windows 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // in the same sublayer. 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wSublayer >= sublayer) { 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (addToToken) { 978f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token); 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.windows.add(i, win); 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project placeWindowBefore( 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wSublayer >= 0 ? attached : w, win); 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For positive sublayers, we go above all windows 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // in the same sublayer. 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wSublayer > sublayer) { 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (addToToken) { 990f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token); 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.windows.add(i, win); 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project placeWindowBefore(w, win); 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i >= NA) { 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (addToToken) { 1000f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token); 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.windows.add(win); 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sublayer < 0) { 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project placeWindowBefore(attached, win); 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project placeWindowAfter(largestSublayer >= 0 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? windowWithLargestSublayer 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : attached, 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win); 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 101306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mAppToken != null && addToToken) { 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mAppToken.allAppWindows.add(win); 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 101806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static boolean canBeImeTarget(WindowState w) { 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int fl = w.mAttrs.flags 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project & (FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM); 1022e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (fl == 0 || fl == (FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM) 1023e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn || w.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) { 1024e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (DEBUG_INPUT_METHOD) { 1025e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn Slog.i(TAG, "isVisibleOrAdding " + w + ": " + w.isVisibleOrAdding()); 1026e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (!w.isVisibleOrAdding()) { 1027e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn Slog.i(TAG, " mSurface=" + w.mSurface + " reportDestroy=" + w.mReportDestroySurface 1028e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn + " relayoutCalled=" + w.mRelayoutCalled + " viewVis=" + w.mViewVisibility 1029e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn + " policyVis=" + w.mPolicyVisibility + " attachHid=" + w.mAttachedHidden 1030e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn + " exiting=" + w.mExiting + " destroying=" + w.mDestroying); 1031e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (w.mAppToken != null) { 1032e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn Slog.i(TAG, " mAppToken.hiddenRequested=" + w.mAppToken.hiddenRequested); 1033e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn } 1034e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn } 1035e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn } 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return w.isVisibleOrAdding(); 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 104006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int findDesiredInputMethodWindowIndexLocked(boolean willMove) { 1042e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown final ArrayList<WindowState> localmWindows = mWindows; 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = localmWindows.size(); 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState w = null; 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = N; 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i > 0) { 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 1048e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown w = localmWindows.get(i); 104906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 1050e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (DEBUG_INPUT_METHOD && willMove) Slog.i(TAG, "Checking window @" + i 1051e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn + " " + w + " fl=0x" + Integer.toHexString(w.mAttrs.flags)); 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (canBeImeTarget(w)) { 10538a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Putting input method here!"); 105406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Yet more tricksyness! If this window is a "starting" 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // window, we do actually want to be on top of it, but 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it is not -really- where input will go. So if the caller 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // is not actually looking to move the IME, look down below 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // for a real window to target... 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!willMove 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && w.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && i > 0) { 1063e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState wb = localmWindows.get(i-1); 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wb.mAppToken == w.mAppToken && canBeImeTarget(wb)) { 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w = wb; 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 107206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 1073e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (DEBUG_INPUT_METHOD && willMove) Slog.v(TAG, "Proposed new IME target: " + w); 1074e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn 10757eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn // Now, a special case -- if the last target's window is in the 10767eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn // process of exiting, and is above the new target, keep on the 10777eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn // last target to avoid flicker. Consider for example a Dialog with 10787eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn // the IME shown: when the Dialog is dismissed, we want to keep 10797eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn // the IME above it until it is completely gone so it doesn't drop 10807eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn // behind the dialog or its full-screen scrim. 10817eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn if (mInputMethodTarget != null && w != null 10827eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn && mInputMethodTarget.isDisplayedLw() 10837eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn && mInputMethodTarget.mExiting) { 10847eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn if (mInputMethodTarget.mAnimLayer > w.mAnimLayer) { 10857eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn w = mInputMethodTarget; 10867eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn i = localmWindows.indexOf(w); 1087e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Current target higher, switching to: " + w); 10887eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn } 10897eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn } 109006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 10918a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Desired input method target=" 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + w + " willMove=" + willMove); 109306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (willMove && w != null) { 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowState curTarget = mInputMethodTarget; 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (curTarget != null && curTarget.mAppToken != null) { 109706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Now some fun for dealing with window animations that 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // modify the Z order. We need to look at all windows below 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the current target that are in this app, finding the highest 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // visible one in layering. 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken token = curTarget.mAppToken; 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState highestTarget = null; 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int highestPos = 0; 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token.animating || token.animation != null) { 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = 0; 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = localmWindows.indexOf(curTarget); 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (pos >= 0) { 1109e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState win = localmWindows.get(pos); 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mAppToken != token) { 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!win.mRemoved) { 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (highestTarget == null || win.mAnimLayer > 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project highestTarget.mAnimLayer) { 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project highestTarget = win; 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project highestPos = pos; 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos--; 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 112306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (highestTarget != null) { 11258a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_INPUT_METHOD) Slog.v(TAG, "mNextAppTransition=" 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mNextAppTransition + " " + highestTarget 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " animating=" + highestTarget.isAnimating() 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " layer=" + highestTarget.mAnimLayer 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " new layer=" + w.mAnimLayer); 113006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 1131bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are currently setting up for an animation, 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // hold everything until we can find out what will happen. 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodTargetWaitingAnim = true; 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodTarget = highestTarget; 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return highestPos + 1; 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (highestTarget.isAnimating() && 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project highestTarget.mAnimLayer > w.mAnimLayer) { 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the window we are currently targeting is involved 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // with an animation, and it is on top of the next target 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we will be over, then hold off on moving until 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // that is done. 1143e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn mInputMethodTargetWaitingAnim = true; 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodTarget = highestTarget; 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return highestPos + 1; 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 115006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 11518a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Placing input method @" + (i+1)); 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w != null) { 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (willMove) { 1154b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (DEBUG_INPUT_METHOD) { 1155b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn RuntimeException e = null; 1156b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (!HIDE_STACK_CRAWLS) { 1157b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e = new RuntimeException(); 1158b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e.fillInStackTrace(); 1159b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 1160b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn Slog.w(TAG, "Moving IM target from " 1161b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + mInputMethodTarget + " to " + w, e); 1162b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodTarget = w; 1164e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn mInputMethodTargetWaitingAnim = false; 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mAppToken != null) { 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInputMethodAnimLayerAdjustment(w.mAppToken.animLayerAdjustment); 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInputMethodAnimLayerAdjustment(0); 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return i+1; 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (willMove) { 1174b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (DEBUG_INPUT_METHOD) { 1175b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn RuntimeException e = null; 1176b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (!HIDE_STACK_CRAWLS) { 1177b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e = new RuntimeException(); 1178b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e.fillInStackTrace(); 1179b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 1180b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn Slog.w(TAG, "Moving IM target from " 1181b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + mInputMethodTarget + " to null", e); 1182b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodTarget = null; 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInputMethodAnimLayerAdjustment(0); 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 118806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void addInputMethodWindowToListLocked(WindowState win) { 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = findDesiredInputMethodWindowIndexLocked(true); 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos >= 0) { 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mTargetAppToken = mInputMethodTarget.mAppToken; 1193f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v( 11949bfb707597898f54722460b48588007b682f3e2aDianne Hackborn TAG, "Adding input method window " + win + " at " + pos); 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.add(pos, win); 1196dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project moveInputMethodDialogsLocked(pos+1); 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mTargetAppToken = null; 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addWindowToListInOrderLocked(win, true); 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project moveInputMethodDialogsLocked(pos); 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 120406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setInputMethodAnimLayerAdjustment(int adj) { 12068a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYERS) Slog.v(TAG, "Setting im layer adj to " + adj); 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodAnimLayerAdjustment = adj; 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState imw = mInputMethodWindow; 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imw != null) { 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imw.mAnimLayer = imw.mLayer + adj; 12118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + imw 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " anim layer: " + imw.mAnimLayer); 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int wi = imw.mChildWindows.size(); 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (wi > 0) { 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wi--; 1216e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState cw = imw.mChildWindows.get(wi); 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cw.mAnimLayer = cw.mLayer + adj; 12188a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + cw 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " anim layer: " + cw.mAnimLayer); 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int di = mInputMethodDialogs.size(); 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (di > 0) { 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project di --; 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imw = mInputMethodDialogs.get(di); 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imw.mAnimLayer = imw.mLayer + adj; 12278a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + imw 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " anim layer: " + imw.mAnimLayer); 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 123106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int tmpRemoveWindowLocked(int interestingPos, WindowState win) { 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int wpos = mWindows.indexOf(win); 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wpos >= 0) { 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wpos < interestingPos) interestingPos--; 12368a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Temp removing at " + wpos + ": " + win); 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.remove(wpos); 1238dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NC = win.mChildWindows.size(); 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (NC > 0) { 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NC--; 1242e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState cw = win.mChildWindows.get(NC); 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int cpos = mWindows.indexOf(cw); 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cpos >= 0) { 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cpos < interestingPos) interestingPos--; 12468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Temp removing child at " 12479bfb707597898f54722460b48588007b682f3e2aDianne Hackborn + cpos + ": " + cw); 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.remove(cpos); 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return interestingPos; 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 125406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void reAddWindowToListInOrderLocked(WindowState win) { 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addWindowToListInOrderLocked(win, false); 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This is a hack to get all of the child windows added as well 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // at the right position. Child windows should be rare and 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this case should be rare, so it shouldn't be that big a deal. 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int wpos = mWindows.indexOf(win); 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wpos >= 0) { 12628a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "ReAdd removing from " + wpos 12639bfb707597898f54722460b48588007b682f3e2aDianne Hackborn + ": " + win); 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.remove(wpos); 1265dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reAddWindowLocked(wpos, win); 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 126906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void logWindowList(String prefix) { 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = mWindows.size(); 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 12748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, prefix + "#" + N + ": " + mWindows.get(N)); 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 127706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void moveInputMethodDialogsLocked(int pos) { 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<WindowState> dialogs = mInputMethodDialogs; 128006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = dialogs.size(); 12828a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Removing " + N + " dialogs w/pos=" + pos); 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = tmpRemoveWindowLocked(pos, dialogs.get(i)); 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_INPUT_METHOD) { 12878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Window list w/pos=" + pos); 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project logWindowList(" "); 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 129006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos >= 0) { 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken targetAppToken = mInputMethodTarget.mAppToken; 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos < mWindows.size()) { 1294e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState wp = mWindows.get(pos); 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wp == mInputMethodWindow) { 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos++; 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12998a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Adding " + N + " dialogs at pos=" + pos); 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = dialogs.get(i); 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mTargetAppToken = targetAppToken; 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = reAddWindowLocked(pos, win); 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_INPUT_METHOD) { 13068a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Final window list:"); 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project logWindowList(" "); 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = dialogs.get(i); 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mTargetAppToken = null; 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reAddWindowToListInOrderLocked(win); 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_INPUT_METHOD) { 13168a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "No IM target, final list:"); 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project logWindowList(" "); 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 132106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean moveInputMethodWindowsIfNeededLocked(boolean needAssignLayers) { 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowState imWin = mInputMethodWindow; 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int DN = mInputMethodDialogs.size(); 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imWin == null && DN == 0) { 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 132806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int imPos = findDesiredInputMethodWindowIndexLocked(true); 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imPos >= 0) { 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In this case, the input method windows are to be placed 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // immediately above the window they are targeting. 133306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // First check to see if the input method windows are already 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // located here, and contiguous. 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mWindows.size(); 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState firstImWin = imPos < N 1338e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown ? mWindows.get(imPos) : null; 133906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Figure out the actual input method window that should be 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // at the bottom of their stack. 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState baseImWin = imWin != null 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? imWin : mInputMethodDialogs.get(0); 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (baseImWin.mChildWindows.size() > 0) { 1345e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState cw = baseImWin.mChildWindows.get(0); 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cw.mSubLayer < 0) baseImWin = cw; 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 134806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (firstImWin == baseImWin) { 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The windows haven't moved... but are they still contiguous? 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // First find the top IM window. 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = imPos+1; 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (pos < N) { 1354e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown if (!(mWindows.get(pos)).mIsImWindow) { 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos++; 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos++; 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Now there should be no more input method windows above. 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (pos < N) { 1362e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown if ((mWindows.get(pos)).mIsImWindow) { 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos++; 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos >= N) { 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // All is good! 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 137206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imWin != null) { 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_INPUT_METHOD) { 13758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Moving IM from " + imPos); 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project logWindowList(" "); 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imPos = tmpRemoveWindowLocked(imPos, imWin); 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_INPUT_METHOD) { 13807eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn Slog.v(TAG, "List after removing with new pos " + imPos + ":"); 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project logWindowList(" "); 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imWin.mTargetAppToken = mInputMethodTarget.mAppToken; 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reAddWindowLocked(imPos, imWin); 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_INPUT_METHOD) { 13868a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "List after moving IM to " + imPos + ":"); 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project logWindowList(" "); 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DN > 0) moveInputMethodDialogsLocked(imPos+1); 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project moveInputMethodDialogsLocked(imPos); 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 139306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In this case, the input method windows go in a fixed layer, 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // because they aren't currently associated with a focus window. 139706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imWin != null) { 13998a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Moving IM from " + imPos); 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmpRemoveWindowLocked(0, imWin); 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imWin.mTargetAppToken = null; 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reAddWindowToListInOrderLocked(imWin); 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_INPUT_METHOD) { 14048a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "List with no IM target:"); 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project logWindowList(" "); 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DN > 0) moveInputMethodDialogsLocked(-1);; 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project moveInputMethodDialogsLocked(-1);; 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 141106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 141306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needAssignLayers) { 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assignLayersLocked(); 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 141706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 142006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void adjustInputMethodDialogsLocked() { 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project moveInputMethodDialogsLocked(findDesiredInputMethodWindowIndexLocked(true)); 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 142406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 142525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn final boolean isWallpaperVisible(WindowState wallpaperTarget) { 14268a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper vis: target obscured=" 142725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn + (wallpaperTarget != null ? Boolean.toString(wallpaperTarget.mObscured) : "??") 142825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn + " anim=" + ((wallpaperTarget != null && wallpaperTarget.mAppToken != null) 142925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn ? wallpaperTarget.mAppToken.animation : null) 143025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn + " upper=" + mUpperWallpaperTarget 143125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn + " lower=" + mLowerWallpaperTarget); 143225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn return (wallpaperTarget != null 143325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn && (!wallpaperTarget.mObscured || (wallpaperTarget.mAppToken != null 143425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn && wallpaperTarget.mAppToken.animation != null))) 143525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn || mUpperWallpaperTarget != null 143625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn || mLowerWallpaperTarget != null; 143725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn } 1438ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 14390586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn static final int ADJUST_WALLPAPER_LAYERS_CHANGED = 1<<1; 14400586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn static final int ADJUST_WALLPAPER_VISIBILITY_CHANGED = 1<<2; 1441ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 14420586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn int adjustWallpaperWindowsLocked() { 14430586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn int changed = 0; 1444ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 144581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn final int dw = mAppDisplayWidth; 144681e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn final int dh = mAppDisplayHeight; 1447ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 14484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // First find top-most window that has asked to be on top of the 14494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // wallpaper; all wallpapers go behind it. 1450e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown final ArrayList<WindowState> localmWindows = mWindows; 14514c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int N = localmWindows.size(); 14524c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn WindowState w = null; 1453f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn WindowState foundW = null; 1454f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn int foundI = 0; 14553b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn WindowState topCurW = null; 14563b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn int topCurI = 0; 14576c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn int windowDetachedI = -1; 14584c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int i = N; 14594c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn while (i > 0) { 14604c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn i--; 1461e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown w = localmWindows.get(i); 14623b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if ((w.mAttrs.type == WindowManager.LayoutParams.TYPE_WALLPAPER)) { 14633b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (topCurW == null) { 14643b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn topCurW = w; 14653b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn topCurI = i; 14663b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 14673b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn continue; 14683b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 14693b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn topCurW = null; 14706c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (w != mWindowDetachedWallpaper && w.mAppToken != null) { 14713be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // If this window's app token is hidden and not animating, 14723be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // it is of no interest to us. 14733be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (w.mAppToken.hidden && w.mAppToken.animation == null) { 14748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 14756c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn "Skipping not hidden or animating token: " + w); 14763be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn continue; 1477f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 1478f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 14798a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "Win " + w + ": readyfordisplay=" 14803be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn + w.isReadyForDisplay() + " drawpending=" + w.mDrawPending 14813be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn + " commitdrawpending=" + w.mCommitDrawPending); 14827341d7a104b47996445d069a695e155a07184606Dianne Hackborn if ((w.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0 && w.isReadyForDisplay() 14836c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn && (mWallpaperTarget == w 14846c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn || (!w.mDrawPending && !w.mCommitDrawPending))) { 14858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 14863be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn "Found wallpaper activity: #" + i + "=" + w); 1487f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn foundW = w; 1488f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn foundI = i; 14893b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (w == mWallpaperTarget && ((w.mAppToken != null 14903b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn && w.mAppToken.animation != null) 14913b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn || w.mAnimation != null)) { 14923be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // The current wallpaper target is animating, so we'll 14933be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // look behind it for another possible target and figure 14943be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // out what is going on below. 14958a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "Win " + w 14963be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn + ": token animating, looking behind."); 1497f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn continue; 1498f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 14994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn break; 15006c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn } else if (w == mWindowDetachedWallpaper) { 15016c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn windowDetachedI = i; 15024c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 15034c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 15044c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 15056c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (foundW == null && windowDetachedI >= 0) { 15066c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (DEBUG_WALLPAPER) Slog.v(TAG, 15076c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn "Found animating detached wallpaper activity: #" + i + "=" + w); 15086c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn foundW = w; 15096c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn foundI = windowDetachedI; 15106c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn } 15116c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn 1512bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 1513f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // If we are currently waiting for an app transition, and either 1514f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // the current target or the next target are involved with it, 1515f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // then hold off on doing anything with the wallpaper. 1516f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // Note that we are checking here for just whether the target 1517f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // is part of an app token... which is potentially overly aggressive 1518f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // (the app token may not be involved in the transition), but good 1519f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // enough (we'll just wait until whatever transition is pending 1520f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // executes). 1521f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn if (mWallpaperTarget != null && mWallpaperTarget.mAppToken != null) { 15228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 15233be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn "Wallpaper not changing: waiting for app anim in current target"); 15240586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn return 0; 1525f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 1526f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn if (foundW != null && foundW.mAppToken != null) { 15278a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 15283be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn "Wallpaper not changing: waiting for app anim in found target"); 15290586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn return 0; 1530f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 15317341d7a104b47996445d069a695e155a07184606Dianne Hackborn } 1532ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1533f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn if (mWallpaperTarget != foundW) { 1534f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn if (DEBUG_WALLPAPER) { 15358a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "New wallpaper target: " + foundW 15363be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn + " oldTarget: " + mWallpaperTarget); 15373be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 1538ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 15393be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mLowerWallpaperTarget = null; 15403be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mUpperWallpaperTarget = null; 1541ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 15423be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn WindowState oldW = mWallpaperTarget; 15433be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mWallpaperTarget = foundW; 1544ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 15453be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // Now what is happening... if the current and new targets are 15463be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // animating, then we are in our super special mode! 15473b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (foundW != null && oldW != null) { 15483b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn boolean oldAnim = oldW.mAnimation != null 15493b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn || (oldW.mAppToken != null && oldW.mAppToken.animation != null); 15503b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn boolean foundAnim = foundW.mAnimation != null 15513b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn || (foundW.mAppToken != null && foundW.mAppToken.animation != null); 15523be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (DEBUG_WALLPAPER) { 15538a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "New animation: " + foundAnim 15543b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn + " old animation: " + oldAnim); 15553be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 15563b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (foundAnim && oldAnim) { 15573be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn int oldI = localmWindows.indexOf(oldW); 15583be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (DEBUG_WALLPAPER) { 15598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "New i: " + foundI + " old i: " + oldI); 15603be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 15613be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (oldI >= 0) { 15623be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (DEBUG_WALLPAPER) { 15638a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Animating wallpapers: old#" + oldI 15643be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn + "=" + oldW + "; new#" + foundI 15653be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn + "=" + foundW); 15663be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 1567ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 15683be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // Set the new target correctly. 15693b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (foundW.mAppToken != null && foundW.mAppToken.hiddenRequested) { 15703be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (DEBUG_WALLPAPER) { 15718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Old wallpaper still the target."); 15723be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 15733be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mWallpaperTarget = oldW; 15743be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 1575ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 15763be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // Now set the upper and lower wallpaper targets 15773be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // correctly, and make sure that we are positioning 15783be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // the wallpaper below the lower. 15793be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (foundI > oldI) { 15803be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // The new target is on top of the old one. 15813be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (DEBUG_WALLPAPER) { 15828a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Found target above old target."); 15833be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 15843be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mUpperWallpaperTarget = foundW; 15853be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mLowerWallpaperTarget = oldW; 15863be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn foundW = oldW; 15873be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn foundI = oldI; 15883be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } else { 15893be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // The new target is below the old one. 15903be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (DEBUG_WALLPAPER) { 15918a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Found target below old target."); 15923be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 15933be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mUpperWallpaperTarget = oldW; 15943be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mLowerWallpaperTarget = foundW; 15953be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 15963be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 15973be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 15983be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 1599ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 16006b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn } else if (mLowerWallpaperTarget != null) { 16013be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // Is it time to stop animating? 16026b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn boolean lowerAnimating = mLowerWallpaperTarget.mAnimation != null 16036b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn || (mLowerWallpaperTarget.mAppToken != null 16046b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn && mLowerWallpaperTarget.mAppToken.animation != null); 16056b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn boolean upperAnimating = mUpperWallpaperTarget.mAnimation != null 16066b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn || (mUpperWallpaperTarget.mAppToken != null 16076b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn && mUpperWallpaperTarget.mAppToken.animation != null); 16086b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn if (!lowerAnimating || !upperAnimating) { 16093be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (DEBUG_WALLPAPER) { 16108a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "No longer animating wallpaper targets!"); 16113be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 16123be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mLowerWallpaperTarget = null; 16133be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mUpperWallpaperTarget = null; 1614f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 1615f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 1616ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1617f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn boolean visible = foundW != null; 1618759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn if (visible) { 16197341d7a104b47996445d069a695e155a07184606Dianne Hackborn // The window is visible to the compositor... but is it visible 16207341d7a104b47996445d069a695e155a07184606Dianne Hackborn // to the user? That is what the wallpaper cares about. 162125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn visible = isWallpaperVisible(foundW); 16228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper visibility: " + visible); 1623ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 16247341d7a104b47996445d069a695e155a07184606Dianne Hackborn // If the wallpaper target is animating, we may need to copy 1625f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // its layer adjustment. Only do this if we are not transfering 1626f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // between two wallpaper targets. 1627f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn mWallpaperAnimLayerAdjustment = 16283be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn (mLowerWallpaperTarget == null && foundW.mAppToken != null) 1629f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn ? foundW.mAppToken.animLayerAdjustment : 0; 1630ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 16316136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn final int maxLayer = mPolicy.getMaxWallpaperLayer() 16326136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn * TYPE_LAYER_MULTIPLIER 16336136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn + TYPE_LAYER_OFFSET; 1634ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 16354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // Now w is the window we are supposed to be behind... but we 16364c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // need to be sure to also be behind any of its attached windows, 16376136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn // AND any starting window associated with it, AND below the 16386136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn // maximum layer the policy allows for wallpapers. 1639f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn while (foundI > 0) { 1640e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState wb = localmWindows.get(foundI-1); 16416136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn if (wb.mBaseLayer < maxLayer && 16426136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn wb.mAttachedWindow != foundW && 1643428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn (foundW.mAttachedWindow == null || 1644428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn wb.mAttachedWindow != foundW.mAttachedWindow) && 16454c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn (wb.mAttrs.type != TYPE_APPLICATION_STARTING || 1646428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn foundW.mToken == null || wb.mToken != foundW.mToken)) { 16474c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // This window is not related to the previous one in any 16484c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // interesting way, so stop here. 16494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn break; 16504c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1651f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn foundW = wb; 1652f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn foundI--; 16534c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 165425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn } else { 16558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "No wallpaper target"); 16564c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1657ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 16583b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (foundW == null && topCurW != null) { 16593b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // There is no wallpaper target, so it goes at the bottom. 16603b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // We will assume it is the same place as last time, if known. 16613b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn foundW = topCurW; 16623b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn foundI = topCurI+1; 16633b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else { 16643b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // Okay i is the position immediately above the wallpaper. Look at 16653b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // what is below it for later. 1666e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown foundW = foundI > 0 ? localmWindows.get(foundI-1) : null; 16673b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 1668ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1669284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (visible) { 167073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn if (mWallpaperTarget.mWallpaperX >= 0) { 167173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn mLastWallpaperX = mWallpaperTarget.mWallpaperX; 1672bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen mLastWallpaperXStep = mWallpaperTarget.mWallpaperXStep; 167373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } 167473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn if (mWallpaperTarget.mWallpaperY >= 0) { 167573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn mLastWallpaperY = mWallpaperTarget.mWallpaperY; 1676bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen mLastWallpaperYStep = mWallpaperTarget.mWallpaperYStep; 167773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } 1678284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 1679ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 16804c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // Start stepping backwards from here, ensuring that our wallpaper windows 16814c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // are correctly placed. 16824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int curTokenIndex = mWallpaperTokens.size(); 16834c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn while (curTokenIndex > 0) { 16844c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn curTokenIndex--; 16854c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn WindowToken token = mWallpaperTokens.get(curTokenIndex); 16860586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn if (token.hidden == visible) { 16870586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn changed |= ADJUST_WALLPAPER_VISIBILITY_CHANGED; 16880586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn token.hidden = !visible; 16890586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // Need to do a layout to ensure the wallpaper now has the 16900586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // correct size. 16910586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn mLayoutNeeded = true; 16920586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn } 1693ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 16944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int curWallpaperIndex = token.windows.size(); 16954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn while (curWallpaperIndex > 0) { 16964c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn curWallpaperIndex--; 16974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn WindowState wallpaper = token.windows.get(curWallpaperIndex); 1698ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 169972c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn if (visible) { 170019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn updateWallpaperOffsetLocked(wallpaper, dw, dh, false); 170172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn } 1702ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1703759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn // First, make sure the client has the current visibility 1704759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn // state. 1705759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn if (wallpaper.mWallpaperVisible != visible) { 1706759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn wallpaper.mWallpaperVisible = visible; 1707759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn try { 17088a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY || DEBUG_WALLPAPER) Slog.v(TAG, 1709759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn "Setting visibility of wallpaper " + wallpaper 1710759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn + ": " + visible); 1711759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn wallpaper.mClient.dispatchAppVisibility(visible); 1712759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } catch (RemoteException e) { 1713759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 1714759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 1715ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1716759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn wallpaper.mAnimLayer = wallpaper.mLayer + mWallpaperAnimLayerAdjustment; 17178a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper win " 17187341d7a104b47996445d069a695e155a07184606Dianne Hackborn + wallpaper + " anim layer: " + wallpaper.mAnimLayer); 1719ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 17204c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // First, if this window is at the current index, then all 17214c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // is well. 1722f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn if (wallpaper == foundW) { 1723f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn foundI--; 1724f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn foundW = foundI > 0 1725e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown ? localmWindows.get(foundI-1) : null; 17264c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn continue; 17274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1728ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 17294c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // The window didn't match... the current wallpaper window, 17304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // wherever it is, is in the wrong place, so make sure it is 17314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // not in the list. 17324c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int oldIndex = localmWindows.indexOf(wallpaper); 17334c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (oldIndex >= 0) { 17348a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Wallpaper removing at " 17359bfb707597898f54722460b48588007b682f3e2aDianne Hackborn + oldIndex + ": " + wallpaper); 17364c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn localmWindows.remove(oldIndex); 1737dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 1738f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn if (oldIndex < foundI) { 1739f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn foundI--; 17404c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 17414c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1742ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 17434c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // Now stick it in. 1744f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_WALLPAPER || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) { 1745f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn Slog.v(TAG, "Moving wallpaper " + wallpaper 1746f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn + " from " + oldIndex + " to " + foundI); 1747f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 1748ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1749f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn localmWindows.add(foundI, wallpaper); 1750dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 17510586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn changed |= ADJUST_WALLPAPER_LAYERS_CHANGED; 17524c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 17534c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1754ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 17554c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return changed; 17564c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 17574c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 1758c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn void setWallpaperAnimLayerAdjustmentLocked(int adj) { 17598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG, 17607341d7a104b47996445d069a695e155a07184606Dianne Hackborn "Setting wallpaper layer adj to " + adj); 1761759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn mWallpaperAnimLayerAdjustment = adj; 1762759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn int curTokenIndex = mWallpaperTokens.size(); 1763759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn while (curTokenIndex > 0) { 1764759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn curTokenIndex--; 1765759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn WindowToken token = mWallpaperTokens.get(curTokenIndex); 1766759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn int curWallpaperIndex = token.windows.size(); 1767759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn while (curWallpaperIndex > 0) { 1768759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn curWallpaperIndex--; 1769759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn WindowState wallpaper = token.windows.get(curWallpaperIndex); 1770759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn wallpaper.mAnimLayer = wallpaper.mLayer + adj; 17718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper win " 17727341d7a104b47996445d069a695e155a07184606Dianne Hackborn + wallpaper + " anim layer: " + wallpaper.mAnimLayer); 1773759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 1774759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 1775759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 1776759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn 177719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn boolean updateWallpaperOffsetLocked(WindowState wallpaperWin, int dw, int dh, 177819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn boolean sync) { 177972c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn boolean changed = false; 17807341d7a104b47996445d069a695e155a07184606Dianne Hackborn boolean rawChanged = false; 178173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn float wpx = mLastWallpaperX >= 0 ? mLastWallpaperX : 0.5f; 1782bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen float wpxs = mLastWallpaperXStep >= 0 ? mLastWallpaperXStep : -1.0f; 1783ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn int availw = wallpaperWin.mFrame.right-wallpaperWin.mFrame.left-dw; 178473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn int offset = availw > 0 ? -(int)(availw*wpx+.5f) : 0; 178573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn changed = wallpaperWin.mXOffset != offset; 178673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn if (changed) { 17878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "Update wallpaper " 178873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn + wallpaperWin + " x: " + offset); 178973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn wallpaperWin.mXOffset = offset; 179073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } 1791bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen if (wallpaperWin.mWallpaperX != wpx || wallpaperWin.mWallpaperXStep != wpxs) { 179273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn wallpaperWin.mWallpaperX = wpx; 1793bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen wallpaperWin.mWallpaperXStep = wpxs; 179473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn rawChanged = true; 1795c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 1796ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 179773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn float wpy = mLastWallpaperY >= 0 ? mLastWallpaperY : 0.5f; 1798bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen float wpys = mLastWallpaperYStep >= 0 ? mLastWallpaperYStep : -1.0f; 179973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn int availh = wallpaperWin.mFrame.bottom-wallpaperWin.mFrame.top-dh; 180073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn offset = availh > 0 ? -(int)(availh*wpy+.5f) : 0; 180173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn if (wallpaperWin.mYOffset != offset) { 18028a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "Update wallpaper " 180373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn + wallpaperWin + " y: " + offset); 180473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn changed = true; 180573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn wallpaperWin.mYOffset = offset; 180673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } 1807bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen if (wallpaperWin.mWallpaperY != wpy || wallpaperWin.mWallpaperYStep != wpys) { 180873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn wallpaperWin.mWallpaperY = wpy; 1809bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen wallpaperWin.mWallpaperYStep = wpys; 181073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn rawChanged = true; 181172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn } 1812ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 18137341d7a104b47996445d069a695e155a07184606Dianne Hackborn if (rawChanged) { 181472c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn try { 18158a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "Report new wp offset " 1816e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn + wallpaperWin + " x=" + wallpaperWin.mWallpaperX 1817e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn + " y=" + wallpaperWin.mWallpaperY); 181819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn if (sync) { 18197580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mWaitingOnWallpaper = wallpaperWin; 182019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 182172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn wallpaperWin.mClient.dispatchWallpaperOffsets( 1822bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen wallpaperWin.mWallpaperX, wallpaperWin.mWallpaperY, 1823bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen wallpaperWin.mWallpaperXStep, wallpaperWin.mWallpaperYStep, sync); 182419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn if (sync) { 18257580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn if (mWaitingOnWallpaper != null) { 18267580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn long start = SystemClock.uptimeMillis(); 18277580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn if ((mLastWallpaperTimeoutTime+WALLPAPER_TIMEOUT_RECOVERY) 18287580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn < start) { 18297580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn try { 18308a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 18317580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn "Waiting for offset complete..."); 18327580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mWindowMap.wait(WALLPAPER_TIMEOUT); 18337580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } catch (InterruptedException e) { 18347580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 18358a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "Offset complete!"); 18367580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn if ((start+WALLPAPER_TIMEOUT) 18377580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn < SystemClock.uptimeMillis()) { 18388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, "Timeout waiting for wallpaper to offset: " 18397580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn + wallpaperWin); 18407580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mLastWallpaperTimeoutTime = start; 184119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 184219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 18437580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mWaitingOnWallpaper = null; 184419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 184519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 184672c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn } catch (RemoteException e) { 184772c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn } 1848c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 1849ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1850c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn return changed; 1851c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 1852ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 185319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn void wallpaperOffsetsComplete(IBinder window) { 18547580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn synchronized (mWindowMap) { 185519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn if (mWaitingOnWallpaper != null && 185619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn mWaitingOnWallpaper.mClient.asBinder() == window) { 185719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn mWaitingOnWallpaper = null; 18587580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mWindowMap.notifyAll(); 185919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 186019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 186119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 1862ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 186373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn boolean updateWallpaperOffsetLocked(WindowState changingTarget, boolean sync) { 186481e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn final int dw = mAppDisplayWidth; 186581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn final int dh = mAppDisplayHeight; 1866ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1867c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn boolean changed = false; 1868ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1869c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn WindowState target = mWallpaperTarget; 1870c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn if (target != null) { 187173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn if (target.mWallpaperX >= 0) { 187273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn mLastWallpaperX = target.mWallpaperX; 187373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } else if (changingTarget.mWallpaperX >= 0) { 187473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn mLastWallpaperX = changingTarget.mWallpaperX; 187573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } 187673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn if (target.mWallpaperY >= 0) { 187773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn mLastWallpaperY = target.mWallpaperY; 187873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } else if (changingTarget.mWallpaperY >= 0) { 187973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn mLastWallpaperY = changingTarget.mWallpaperY; 188073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } 188173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } 1882ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 188373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn int curTokenIndex = mWallpaperTokens.size(); 188473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn while (curTokenIndex > 0) { 188573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn curTokenIndex--; 188673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn WindowToken token = mWallpaperTokens.get(curTokenIndex); 188773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn int curWallpaperIndex = token.windows.size(); 188873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn while (curWallpaperIndex > 0) { 188973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn curWallpaperIndex--; 189073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn WindowState wallpaper = token.windows.get(curWallpaperIndex); 189173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn if (updateWallpaperOffsetLocked(wallpaper, dw, dh, sync)) { 189273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn wallpaper.computeShownFrameLocked(); 189373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn changed = true; 189473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn // We only want to be synchronous with one wallpaper. 189573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn sync = false; 1896c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 1897c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 1898c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 1899ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1900c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn return changed; 1901c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 1902ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1903e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn void updateWallpaperVisibilityLocked() { 190425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn final boolean visible = isWallpaperVisible(mWallpaperTarget); 190581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn final int dw = mAppDisplayWidth; 190681e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn final int dh = mAppDisplayHeight; 1907ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1908e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn int curTokenIndex = mWallpaperTokens.size(); 1909e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn while (curTokenIndex > 0) { 1910e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn curTokenIndex--; 1911e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn WindowToken token = mWallpaperTokens.get(curTokenIndex); 19120586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn if (token.hidden == visible) { 19130586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn token.hidden = !visible; 19140586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // Need to do a layout to ensure the wallpaper now has the 19150586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // correct size. 19160586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn mLayoutNeeded = true; 19170586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn } 1918ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1919e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn int curWallpaperIndex = token.windows.size(); 1920e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn while (curWallpaperIndex > 0) { 1921e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn curWallpaperIndex--; 1922e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn WindowState wallpaper = token.windows.get(curWallpaperIndex); 1923e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn if (visible) { 192419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn updateWallpaperOffsetLocked(wallpaper, dw, dh, false); 1925e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 1926ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1927e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn if (wallpaper.mWallpaperVisible != visible) { 1928e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn wallpaper.mWallpaperVisible = visible; 1929e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn try { 19308a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY || DEBUG_WALLPAPER) Slog.v(TAG, 193125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn "Updating visibility of wallpaper " + wallpaper 1932e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn + ": " + visible); 1933e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn wallpaper.mClient.dispatchAppVisibility(visible); 1934e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } catch (RemoteException e) { 1935e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 1936e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 1937e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 1938e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 1939e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 194090d2db3d21d07c2a4b4cbbc558f5ec59d20098c3Dianne Hackborn 19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int addWindow(Session session, IWindow client, 19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams attrs, int viewVisibility, 194346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown Rect outContentInsets, InputChannel outInputChannel) { 19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int res = mPolicy.checkAddPermission(attrs); 19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != WindowManagerImpl.ADD_OKAY) { 19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 194806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean reportNewConfig = false; 19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState attachedWindow = null; 19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = null; 19525132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn long origId; 195306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDisplay == null) { 19565132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn throw new IllegalStateException("Display has not been initialialized"); 19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 195806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mWindowMap.containsKey(client.asBinder())) { 19608a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Window " + client + " is already added"); 19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_DUPLICATE_ADD; 19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attrs.type >= FIRST_SUB_WINDOW && attrs.type <= LAST_SUB_WINDOW) { 1965e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn attachedWindow = windowForClientLocked(null, attrs.token, false); 19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attachedWindow == null) { 19678a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add window with token that is not a window: " 19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + attrs.token + ". Aborting."); 19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN; 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attachedWindow.mAttrs.type >= FIRST_SUB_WINDOW 19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && attachedWindow.mAttrs.type <= LAST_SUB_WINDOW) { 19738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add window with token that is a sub-window: " 19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + attrs.token + ". Aborting."); 19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN; 19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean addToken = false; 19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken token = mTokenMap.get(attrs.token); 19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token == null) { 19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attrs.type >= FIRST_APPLICATION_WINDOW 19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && attrs.type <= LAST_APPLICATION_WINDOW) { 19848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add application window with unknown token " 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + attrs.token + ". Aborting."); 19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_BAD_APP_TOKEN; 19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attrs.type == TYPE_INPUT_METHOD) { 19898a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add input method window with unknown token " 19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + attrs.token + ". Aborting."); 19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_BAD_APP_TOKEN; 19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19934c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (attrs.type == TYPE_WALLPAPER) { 19948a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add wallpaper window with unknown token " 19954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn + attrs.token + ". Aborting."); 19964c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return WindowManagerImpl.ADD_BAD_APP_TOKEN; 19974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 19986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn token = new WindowToken(this, attrs.token, -1, false); 19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addToken = true; 20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (attrs.type >= FIRST_APPLICATION_WINDOW 20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && attrs.type <= LAST_APPLICATION_WINDOW) { 20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken atoken = token.appWindowToken; 20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken == null) { 20048a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add window with non-application token " 20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + token + ". Aborting."); 20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_NOT_APP_TOKEN; 20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (atoken.removed) { 20088a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add window with exiting application token " 20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + token + ". Aborting."); 20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_APP_EXITING; 20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attrs.type == TYPE_APPLICATION_STARTING && atoken.firstWindowDrawn) { 20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // No need for this guy! 20148a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v( 20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "**** NO NEED TO START: " + attrs.getTitle()); 20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_STARTING_NOT_NEEDED; 20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (attrs.type == TYPE_INPUT_METHOD) { 20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token.windowType != TYPE_INPUT_METHOD) { 20208a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add input method window with bad token " 20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + attrs.token + ". Aborting."); 20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_BAD_APP_TOKEN; 20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20244c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } else if (attrs.type == TYPE_WALLPAPER) { 20254c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (token.windowType != TYPE_WALLPAPER) { 20268a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add wallpaper window with bad token " 20274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn + attrs.token + ". Aborting."); 20284c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return WindowManagerImpl.ADD_BAD_APP_TOKEN; 20294c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn win = new WindowState(this, session, client, token, 20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attachedWindow, attrs, viewVisibility); 20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mDeathRecipient == null) { 20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Client has apparently died, so there is no reason to 20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // continue. 20378a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Adding window client " + client.asBinder() 20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " that is dead, aborting."); 20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_APP_EXITING; 20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.adjustWindowParamsLw(win.mAttrs); 204306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = mPolicy.prepareAddWindowLw(win, attrs); 20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != WindowManagerImpl.ADD_OKAY) { 20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 204846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 204900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown if (outInputChannel != null) { 205000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown String name = win.makeInputChannelName(); 205100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown InputChannel[] inputChannels = InputChannel.openInputChannelPair(name); 205200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown win.mInputChannel = inputChannels[0]; 205300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown inputChannels[1].transferToBinderOutParameter(outInputChannel); 205400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 2055928e054931d357326613c78e62f4d850b7c442ffJeff Brown mInputManager.registerInputChannel(win.mInputChannel, win.mInputWindowHandle); 205646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // From now on, no exceptions or errors allowed! 20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = WindowManagerImpl.ADD_OKAY; 206106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 20625132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn origId = Binder.clearCallingIdentity(); 206306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (addToken) { 20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTokenMap.put(attrs.token, token); 20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.attach(); 20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowMap.put(client.asBinder(), win); 20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attrs.type == TYPE_APPLICATION_STARTING && 20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.appWindowToken != null) { 20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.appWindowToken.startingWindow = win; 20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean imMayMove = true; 207606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attrs.type == TYPE_INPUT_METHOD) { 20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodWindow = win; 20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addInputMethodWindowToListLocked(win); 20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imMayMove = false; 20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (attrs.type == TYPE_INPUT_METHOD_DIALOG) { 20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodDialogs.add(win); 20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addWindowToListInOrderLocked(win, true); 20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project adjustInputMethodDialogsLocked(); 20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imMayMove = false; 20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addWindowToListInOrderLocked(win, true); 208819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn if (attrs.type == TYPE_WALLPAPER) { 208919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn mLastWallpaperTimeoutTime = 0; 209019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn adjustWallpaperWindowsLocked(); 209119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } else if ((attrs.flags&FLAG_SHOW_WALLPAPER) != 0) { 20924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn adjustWallpaperWindowsLocked(); 20934c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 209506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mEnterAnimationPending = true; 209706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.getContentInsetHintLw(attrs, outContentInsets); 209906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInTouchMode) { 21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res |= WindowManagerImpl.ADD_FLAG_IN_TOUCH_MODE; 21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win == null || win.mAppToken == null || !win.mAppToken.clientHidden) { 21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res |= WindowManagerImpl.ADD_FLAG_APP_VISIBLE; 21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 210606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21072e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.setUpdateInputWindowsNeededLw(); 21082e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown 2109c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project boolean focusChanged = false; 21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.canReceiveKeys()) { 21113a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown focusChanged = updateFocusedWindowLocked(UPDATE_FOCUS_WILL_ASSIGN_LAYERS, 21123a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/); 2113349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown if (focusChanged) { 21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imMayMove = false; 21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 211706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imMayMove) { 211906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy moveInputMethodWindowsIfNeededLocked(false); 21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 212106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assignLayersLocked(); 21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Don't do layout here, the window must call 21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // relayout to be displayed, so we'll do it there. 212506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //dump(); 21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2128c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project if (focusChanged) { 21293a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown finishUpdateFocusedWindowAfterAssignLayersLocked(false /*updateInputWindows*/); 2130c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project } 21312e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(false /*force*/); 21323a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown 21338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v( 21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "New client " + client.asBinder() 21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": window=" + win); 2136e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 213794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (win.isVisibleOrAdding() && updateOrientationFromAppTokensLocked(false)) { 2138e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn reportNewConfig = true; 2139e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (reportNewConfig) { 21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendNewConfiguration(); 21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21455132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn 21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 214706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 215006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeWindow(Session session, IWindow client) { 21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 2153e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn WindowState win = windowForClientLocked(session, client, false); 21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win == null) { 21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeWindowLocked(session, win); 21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 216006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeWindowLocked(Session session, WindowState win) { 21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21638a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV || DEBUG_FOCUS) Slog.v( 21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Remove " + win + " client=" 21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode( 21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mClient.asBinder())) 21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", surface=" + win.mSurface); 21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 2170c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 2171c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown win.disposeInputChannel(); 217206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v( 21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Remove " + win + ": mSurface=" + win.mSurface 21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mExiting=" + win.mExiting 21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " isAnimating=" + win.isAnimating() 21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " app-animation=" 21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (win.mAppToken != null ? win.mAppToken.animation : null) 21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " inPendingTransaction=" 21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (win.mAppToken != null ? win.mAppToken.inPendingTransaction : false) 21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mDisplayFrozen=" + mDisplayFrozen); 21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Visibility of the removed window. Will be used later to update orientation later on. 21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean wasVisible = false; 21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // First, see if we need to run an animation. If we do, we have 21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to hold off on removing the window until the animation is done. 21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the display is frozen, just remove immediately, since the 21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // animation wouldn't be seen. 2188de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn if (win.mSurface != null && !mDisplayFrozen && mPolicy.isScreenOn()) { 21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are not currently running the exit animation, we 21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // need to see about starting one. 21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wasVisible=win.isWinVisibleLw()) { 219206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int transit = WindowManagerPolicy.TRANSIT_EXIT; 21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.getAttrs().type == TYPE_APPLICATION_STARTING) { 21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project transit = WindowManagerPolicy.TRANSIT_PREVIEW_DONE; 21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Try starting an animation. 21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (applyAnimationLocked(win, transit, false)) { 21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mExiting = true; 22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mExiting || win.isAnimating()) { 22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The exit animation is running... wait for it! 22048a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "*** Running exit animation..."); 22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mExiting = true; 22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mRemoveOnExit = true; 22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 22083a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, 22093a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/); 22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 22112e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(false /*force*/); 22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mAppToken != null) { 22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mAppToken.updateReportedVisibilityLocked(); 22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //dump(); 22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeWindowInnerLocked(session, win); 22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Removing a visible window will effect the computed orientation 22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // So just update orientation if needed. 2224c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project if (wasVisible && computeForcedAppOrientationLocked() 2225e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn != mForcedAppOrientation 222694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn && updateOrientationFromAppTokensLocked(false)) { 2227e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION); 22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22293a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/); 22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 223206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void removeWindowInnerLocked(Session session, WindowState win) { 2234f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (win.mRemoved) { 2235f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn // Nothing to do. 2236f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn return; 2237f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 2238f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn 2239f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn for (int i=win.mChildWindows.size()-1; i>=0; i--) { 2240f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn WindowState cwin = win.mChildWindows.get(i); 2241f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn Slog.w(TAG, "Force-removing child win " + cwin + " from container " 2242f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn + win); 2243f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn removeWindowInnerLocked(cwin.mSession, cwin); 2244f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 2245f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn 22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mRemoved = true; 224706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInputMethodTarget == win) { 22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project moveInputMethodWindowsIfNeededLocked(false); 22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 225106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 2252bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn if (false) { 2253bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn RuntimeException e = new RuntimeException("here"); 2254bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn e.fillInStackTrace(); 22558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Removing window " + win, e); 2256bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn } 2257ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.removeWindowLw(win); 22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.removeLocked(); 22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2261f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE) Slog.v(TAG, "removeWindowInnerLocked: " + win); 22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowMap.remove(win.mClient.asBinder()); 22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.remove(win); 2264f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn mPendingRemove.remove(win); 2265dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 22668a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Final remove of window: " + win); 22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInputMethodWindow == win) { 22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodWindow = null; 22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (win.mAttrs.type == TYPE_INPUT_METHOD_DIALOG) { 22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodDialogs.remove(win); 22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 227306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowToken token = win.mToken; 22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken atoken = win.mAppToken; 2276f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Removing " + win + " from " + token); 22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.windows.remove(win); 22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken != null) { 22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.allAppWindows.remove(win); 22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22818a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v( 22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "**** Removing window " + win + ": count=" 22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + token.windows.size()); 22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token.windows.size() == 0) { 22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!token.explicit) { 22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTokenMap.remove(token.token); 22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (atoken != null) { 22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.firstWindowDrawn = false; 22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken != null) { 22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken.startingWindow == win) { 22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.startingWindow = null; 22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (atoken.allAppWindows.size() == 0 && atoken.startingData != null) { 22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this is the last window and we had requested a starting 22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // transition window, well there is no point now. 22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.startingData = null; 22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (atoken.allAppWindows.size() == 1 && atoken.startingView != null) { 23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this is the last window except for a starting transition 23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // window, we need to get rid of the starting transition. 23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_STARTING_WINDOW) { 23038a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Schedule remove starting " + token 23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": no more real windows"); 23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = mH.obtainMessage(H.REMOVE_STARTING, atoken); 23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessage(m); 23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 231006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 231119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn if (win.mAttrs.type == TYPE_WALLPAPER) { 231219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn mLastWallpaperTimeoutTime = 0; 231319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn adjustWallpaperWindowsLocked(); 231419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } else if ((win.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0) { 2315e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn adjustWallpaperWindowsLocked(); 2316e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 2317ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mInLayout) { 23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assignLayersLocked(); 23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mAppToken != null) { 23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mAppToken.updateReportedVisibilityLocked(); 23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2326c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 23272e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(true /*force*/); 23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn static void logSurface(WindowState w, String msg, RuntimeException where) { 2331b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn String str = " SURFACE " + Integer.toHexString(w.hashCode()) 2332b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + ": " + msg + " / " + w.mAttrs.getTitle(); 2333b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (where != null) { 2334b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn Slog.i(TAG, str, where); 2335b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } else { 2336b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn Slog.i(TAG, str); 2337b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 2338b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 2339b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 23406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn void setTransparentRegionWindow(Session session, IWindow client, Region region) { 23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long origId = Binder.clearCallingIdentity(); 23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 2344e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn WindowState w = windowForClientLocked(session, client, false); 23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((w != null) && (w.mSurface != null)) { 234694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, 234794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn ">>> OPEN TRANSACTION setTransparentRegion"); 23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Surface.openTransaction(); 23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2350b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (SHOW_TRANSACTIONS) logSurface(w, 2351b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn "transparentRegionHint=" + region, null); 23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mSurface.setTransparentRegionHint(region); 23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Surface.closeTransaction(); 235594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, 235694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn "<<< CLOSE TRANSACTION setTransparentRegion"); 23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setInsetsWindow(Session session, IWindow client, 236606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy int touchableInsets, Rect contentInsets, 2367fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown Rect visibleInsets, Region touchableRegion) { 23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long origId = Binder.clearCallingIdentity(); 23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 2371e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn WindowState w = windowForClientLocked(session, client, false); 23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w != null) { 23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mGivenInsetsPending = false; 23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mGivenContentInsets.set(contentInsets); 23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mGivenVisibleInsets.set(visibleInsets); 2376fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown w.mGivenTouchableRegion.set(touchableRegion); 23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mTouchableInsets = touchableInsets; 2378ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn if (w.mGlobalScale != 1) { 2379ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn w.mGivenContentInsets.scale(w.mGlobalScale); 2380ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn w.mGivenVisibleInsets.scale(w.mGlobalScale); 2381ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn w.mGivenTouchableRegion.scale(w.mGlobalScale); 2382ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn } 23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 239106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void getWindowDisplayFrame(Session session, IWindow client, 23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect outDisplayFrame) { 23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 2395e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn WindowState win = windowForClientLocked(session, client, false); 23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win == null) { 23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outDisplayFrame.setEmpty(); 23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outDisplayFrame.set(win.mDisplayFrame); 24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2404bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen public void setWindowWallpaperPositionLocked(WindowState window, float x, float y, 2405bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen float xStep, float yStep) { 2406c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn if (window.mWallpaperX != x || window.mWallpaperY != y) { 2407c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn window.mWallpaperX = x; 2408c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn window.mWallpaperY = y; 2409bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen window.mWallpaperXStep = xStep; 2410bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen window.mWallpaperYStep = yStep; 241173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn if (updateWallpaperOffsetLocked(window, true)) { 241273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn performLayoutAndPlaceSurfacesLocked(); 2413c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 2414c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 2415c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 2416ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 24177580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn void wallpaperCommandComplete(IBinder window, Bundle result) { 24187580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn synchronized (mWindowMap) { 24197580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn if (mWaitingOnWallpaper != null && 24207580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mWaitingOnWallpaper.mClient.asBinder() == window) { 24217580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mWaitingOnWallpaper = null; 24227580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mWindowMap.notifyAll(); 24237580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 24247580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 24257580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 2426ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 24277580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn public Bundle sendWindowWallpaperCommandLocked(WindowState window, 24287580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn String action, int x, int y, int z, Bundle extras, boolean sync) { 24297580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn if (window == mWallpaperTarget || window == mLowerWallpaperTarget 24307580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn || window == mUpperWallpaperTarget) { 24317580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn boolean doWait = sync; 24327580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn int curTokenIndex = mWallpaperTokens.size(); 24337580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn while (curTokenIndex > 0) { 24347580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn curTokenIndex--; 24357580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn WindowToken token = mWallpaperTokens.get(curTokenIndex); 24367580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn int curWallpaperIndex = token.windows.size(); 24377580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn while (curWallpaperIndex > 0) { 24387580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn curWallpaperIndex--; 24397580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn WindowState wallpaper = token.windows.get(curWallpaperIndex); 24407580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn try { 24417580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn wallpaper.mClient.dispatchWallpaperCommand(action, 24427580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn x, y, z, extras, sync); 24437580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn // We only want to be synchronous with one wallpaper. 24447580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn sync = false; 24457580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } catch (RemoteException e) { 24467580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 24477580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 24487580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 2449ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 24507580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn if (doWait) { 24517580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn // XXX Need to wait for result. 24527580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 24537580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 2454ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 24557580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn return null; 24567580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 2457ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int relayoutWindow(Session session, IWindow client, 24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams attrs, int requestedWidth, 24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int requestedHeight, int viewVisibility, boolean insetsPending, 24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect outFrame, Rect outContentInsets, Rect outVisibleInsets, 2462694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn Configuration outConfig, Surface outSurface) { 24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean displayed = false; 24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean inTouchMode; 2465e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean configChanged; 2466ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato 2467ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato // if they don't have this permission, mask out the status bar bits 2468ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato if (attrs != null) { 2469ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR) 2470ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato != PackageManager.PERMISSION_GRANTED) { 2471ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato attrs.systemUiVisibility &= ~StatusBarManager.DISABLE_MASK; 2472ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato attrs.subtreeSystemUiVisibility &= ~StatusBarManager.DISABLE_MASK; 2473ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato } 2474ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato } 24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long origId = Binder.clearCallingIdentity(); 247606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 2478e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn WindowState win = windowForClientLocked(session, client, false); 24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win == null) { 24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mRequestedWidth = requestedWidth; 24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mRequestedHeight = requestedHeight; 24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attrs != null) { 24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.adjustWindowParamsLw(attrs); 24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 248806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int attrChanges = 0; 24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flagChanges = 0; 24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attrs != null) { 24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flagChanges = win.mAttrs.flags ^= attrs.flags; 24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attrChanges = win.mAttrs.copyFrom(attrs); 24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24968a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYOUT) Slog.v(TAG, "Relayout " + win + ": " + win.mAttrs); 24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24985fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn win.mEnforceSizeCompat = (win.mAttrs.flags & FLAG_COMPATIBLE_WINDOW) != 0; 24995fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn 25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((attrChanges & WindowManager.LayoutParams.ALPHA_CHANGED) != 0) { 25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mAlpha = attrs.alpha; 25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean scaledWindow = 25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((win.mAttrs.flags & WindowManager.LayoutParams.FLAG_SCALED) != 0); 25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scaledWindow) { 25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // requested{Width|Height} Surface's physical size 25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // attrs.{width|height} Size on screen 25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mHScale = (attrs.width != requestedWidth) ? 25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (attrs.width / (float)requestedWidth) : 1.0f; 25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mVScale = (attrs.height != requestedHeight) ? 25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (attrs.height / (float)requestedHeight) : 1.0f; 25149b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn } else { 25159b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn win.mHScale = win.mVScale = 1; 25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean imMayMove = (flagChanges&( 25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM | 25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)) != 0; 252106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean focusMayChange = win.mViewVisibility != viewVisibility 25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || ((flagChanges&WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) != 0) 25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (!win.mRelayoutCalled); 252506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 25264c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn boolean wallpaperMayMove = win.mViewVisibility != viewVisibility 25274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn && (win.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0; 2528ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mRelayoutCalled = true; 25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int oldVisibility = win.mViewVisibility; 25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mViewVisibility = viewVisibility; 25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (viewVisibility == View.VISIBLE && 25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (win.mAppToken == null || !win.mAppToken.clientHidden)) { 25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayed = !win.isVisibleLw(); 25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mExiting) { 25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mExiting = false; 25373fe3851753e3623d3c7c468efa6ee17f17f9aa74Brad Fitzpatrick if (win.mAnimation != null) { 25383fe3851753e3623d3c7c468efa6ee17f17f9aa74Brad Fitzpatrick win.mAnimation.cancel(); 25393fe3851753e3623d3c7c468efa6ee17f17f9aa74Brad Fitzpatrick win.mAnimation = null; 25403fe3851753e3623d3c7c468efa6ee17f17f9aa74Brad Fitzpatrick } 25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mDestroying) { 25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mDestroying = false; 25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDestroySurface.remove(win); 25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldVisibility == View.GONE) { 25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mEnterAnimationPending = true; 25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2549694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn if (displayed) { 2550694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn if (win.mSurface != null && !win.mDrawPending 2551694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn && !win.mCommitDrawPending && !mDisplayFrozen 2552694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn && mPolicy.isScreenOn()) { 2553694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn applyEnterAnimationLocked(win); 2554694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn } 2555694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn if ((win.mAttrs.flags 2556694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn & WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON) != 0) { 2557694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn if (DEBUG_VISIBILITY) Slog.v(TAG, 2558694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn "Relayout window turning screen on: " + win); 2559694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn win.mTurnOnScreen = true; 2560694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn } 2561694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn int diff = 0; 2562694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn if (win.mConfiguration != mCurConfiguration 2563694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn && (win.mConfiguration == null 2564694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn || (diff=mCurConfiguration.diff(win.mConfiguration)) != 0)) { 2565694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn win.mConfiguration = mCurConfiguration; 2566694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn if (DEBUG_CONFIGURATION) { 2567694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn Slog.i(TAG, "Window " + win + " visible with new config: " 2568694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn + win.mConfiguration + " / 0x" 2569694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn + Integer.toHexString(diff)); 2570694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn } 2571694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn outConfig.setTo(mCurConfiguration); 2572694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn } 257393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn } 25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((attrChanges&WindowManager.LayoutParams.FORMAT_CHANGED) != 0) { 25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // To change the format, we need to re-build the surface. 25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.destroySurfaceLocked(); 25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayed = true; 25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Surface surface = win.createSurfaceLocked(); 25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (surface != null) { 25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outSurface.copyFrom(surface); 25833b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn win.mReportDestroySurface = false; 25843b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn win.mSurfacePendingDestroy = false; 25858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (SHOW_TRANSACTIONS) Slog.i(TAG, 25860586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn " OUT SURFACE " + outSurface + ": copied"); 25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 25880586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // For some reason there isn't a surface. Clear the 25890586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // caller's object so they see the same state. 25900586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn outSurface.release(); 25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 25932e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(true /*force*/); 2594e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown 25958a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Exception thrown when creating surface for client " 25960586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn + client + " (" + win.mAttrs.getTitle() + ")", 25970586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn e); 25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (displayed) { 26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project focusMayChange = true; 26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mAttrs.type == TYPE_INPUT_METHOD 26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && mInputMethodWindow == null) { 26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodWindow = win; 26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imMayMove = true; 26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2609558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn if (win.mAttrs.type == TYPE_BASE_APPLICATION 2610558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn && win.mAppToken != null 2611558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn && win.mAppToken.startingWindow != null) { 2612558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn // Special handling of starting window over the base 2613558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn // window of the app: propagate lock screen flags to it, 2614558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn // to provide the correct semantics while starting. 2615558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn final int mask = 2616558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 2617ef73162887943e16587b8e737b19e59348338e8cMike Lockwood | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 2618ef73162887943e16587b8e737b19e59348338e8cMike Lockwood | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON; 2619558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn WindowManager.LayoutParams sa = win.mAppToken.startingWindow.mAttrs; 2620558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn sa.flags = (sa.flags&~mask) | (win.mAttrs.flags&mask); 2621558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn } 26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mEnterAnimationPending = false; 26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mSurface != null) { 26258a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY) Slog.i(TAG, "Relayout invis " + win 26263b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn + ": mExiting=" + win.mExiting 26273b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn + " mSurfacePendingDestroy=" + win.mSurfacePendingDestroy); 26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are not currently running the exit animation, we 26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // need to see about starting one. 26303b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (!win.mExiting || win.mSurfacePendingDestroy) { 26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Try starting an animation; if there isn't one, we 26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // can destroy the surface right away. 26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int transit = WindowManagerPolicy.TRANSIT_EXIT; 26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.getAttrs().type == TYPE_APPLICATION_STARTING) { 26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project transit = WindowManagerPolicy.TRANSIT_PREVIEW_DONE; 26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26373b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (!win.mSurfacePendingDestroy && win.isWinVisibleLw() && 26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applyAnimationLocked(win, transit, false)) { 26393b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn focusMayChange = true; 26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mExiting = true; 26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (win.isAnimating()) { 26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Currently in a hide animation... turn this into 26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // an exit. 26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mExiting = true; 26456136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn } else if (win == mWallpaperTarget) { 26466136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn // If the wallpaper is currently behind this 26476136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn // window, we need to change both of them inside 26486136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn // of a transaction to avoid artifacts. 26496136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn win.mExiting = true; 26506136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn win.mAnimating = true; 26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInputMethodWindow == win) { 26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodWindow = null; 26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.destroySurfaceLocked(); 26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2659ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 26603b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (win.mSurface == null || (win.getAttrs().flags 26613b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn & WindowManager.LayoutParams.FLAG_KEEP_SURFACE_WHILE_ANIMATING) == 0 26623b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn || win.mSurfacePendingDestroy) { 26633b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // We are being called from a local process, which 26643b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // means outSurface holds its current surface. Ensure the 26653b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // surface object is cleared, but we don't want it actually 26663b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // destroyed at this point. 26673b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn win.mSurfacePendingDestroy = false; 26683b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn outSurface.release(); 26698a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY) Slog.i(TAG, "Releasing surface in: " + win); 26703b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else if (win.mSurface != null) { 26718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY) Slog.i(TAG, 26723b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn "Keeping surface, will report destroy: " + win); 26733b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn win.mReportDestroySurface = true; 26743b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn outSurface.copyFrom(win.mSurface); 26753b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (focusMayChange) { 26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //System.out.println("Focus may change: " + win.mAttrs.getTitle()); 26803a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown if (updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, 26813a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/)) { 26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imMayMove = false; 26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //System.out.println("Relayout " + win + ": focus=" + mCurrentFocus); 26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 268606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 2687c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project // updateFocusedWindowLocked() already assigned layers so we only need to 2688c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project // reassign them at this point if the IM window state gets shuffled 2689c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project boolean assignLayers = false; 269006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imMayMove) { 26928abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn if (moveInputMethodWindowsIfNeededLocked(false) || displayed) { 26938abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn // Little hack here -- we -should- be able to rely on the 26948abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn // function to return true if the IME has moved and needs 26958abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn // its layer recomputed. However, if the IME was hidden 26968abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn // and isn't actually moved in the list, its layer may be 26978abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn // out of data so we make sure to recompute it. 26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assignLayers = true; 26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27014c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (wallpaperMayMove) { 27020586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn if ((adjustWallpaperWindowsLocked()&ADJUST_WALLPAPER_LAYERS_CHANGED) != 0) { 27034c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn assignLayers = true; 27044c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 27054c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 270606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 27079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mGivenInsetsPending = insetsPending; 27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (assignLayers) { 27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assignLayersLocked(); 27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 271294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn configChanged = updateOrientationFromAppTokensLocked(false); 27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 2714284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (displayed && win.mIsWallpaper) { 271581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn updateWallpaperOffsetLocked(win, mAppDisplayWidth, mAppDisplayHeight, false); 2716284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mAppToken != null) { 27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mAppToken.updateReportedVisibilityLocked(); 27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2720ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn outFrame.set(win.mCompatFrame); 27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outContentInsets.set(win.mContentInsets); 27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outVisibleInsets.set(win.mVisibleInsets); 27238a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v( 27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Relayout given client " + client.asBinder() 272506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy + ", requestedWidth=" + requestedWidth 27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", requestedHeight=" + requestedHeight 27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", viewVisibility=" + viewVisibility 27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "\nRelayout returning frame=" + outFrame 27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", surface=" + outSurface); 27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27318a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV || DEBUG_FOCUS) Slog.v( 27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Relayout of " + win + ": focusMayChange=" + focusMayChange); 27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inTouchMode = mInTouchMode; 2735e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown 27362e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(true /*force*/); 27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2739e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (configChanged) { 27409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendNewConfiguration(); 27419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 274206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 274406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (inTouchMode ? WindowManagerImpl.RELAYOUT_IN_TOUCH_MODE : 0) 27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | (displayed ? WindowManagerImpl.RELAYOUT_FIRST_TIME : 0); 27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2749648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn public boolean outOfMemoryWindow(Session session, IWindow client) { 2750648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn long origId = Binder.clearCallingIdentity(); 2751648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn 2752648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn try { 2753648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn synchronized(mWindowMap) { 2754648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn WindowState win = windowForClientLocked(session, client, false); 2755648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn if (win == null) { 2756648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn return false; 2757648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn } 2758648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn return reclaimSomeSurfaceMemoryLocked(win, "from-client", false); 2759648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn } 2760648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn } finally { 2761648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn Binder.restoreCallingIdentity(origId); 2762648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn } 2763648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn } 2764648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn 27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void finishDrawingWindow(Session session, IWindow client) { 27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 2768e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn WindowState win = windowForClientLocked(session, client, false); 27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win != null && win.finishDrawingLocked()) { 2770759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn if ((win.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0) { 2771759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn adjustWallpaperWindowsLocked(); 2772759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 27739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 27759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private AttributeCache.Entry getCachedAnimations(WindowManager.LayoutParams lp) { 278108121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: layout params pkg=" 27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (lp != null ? lp.packageName : null) 27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " resId=0x" + (lp != null ? Integer.toHexString(lp.windowAnimations) : null)); 27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lp != null && lp.windowAnimations != 0) { 27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this is a system resource, don't try to load it from the 27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // application resources. It is nice to avoid loading application 27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // resources if we can. 27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String packageName = lp.packageName != null ? lp.packageName : "android"; 27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int resId = lp.windowAnimations; 27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((resId&0xFF000000) == 0x01000000) { 27919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project packageName = "android"; 27929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27938a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: picked package=" 27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + packageName); 27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AttributeCache.instance().get(packageName, resId, 27969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.WindowAnimation); 27979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 280006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 28013b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn private AttributeCache.Entry getCachedAnimations(String packageName, int resId) { 280208121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: package=" 28033b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn + packageName + " resId=0x" + Integer.toHexString(resId)); 28043b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (packageName != null) { 28053b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if ((resId&0xFF000000) == 0x01000000) { 28063b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn packageName = "android"; 28073b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 28088a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: picked package=" 28093b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn + packageName); 28103b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn return AttributeCache.instance().get(packageName, resId, 28113b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn com.android.internal.R.styleable.WindowAnimation); 28123b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 28133b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn return null; 28143b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 28153b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn 28166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn void applyEnterAnimationLocked(WindowState win) { 28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int transit = WindowManagerPolicy.TRANSIT_SHOW; 28189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mEnterAnimationPending) { 28199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mEnterAnimationPending = false; 28209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project transit = WindowManagerPolicy.TRANSIT_ENTER; 28219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applyAnimationLocked(win, transit, true); 28249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean applyAnimationLocked(WindowState win, 28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int transit, boolean isEntrance) { 28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mLocalAnimating && win.mAnimationIsEntrance == isEntrance) { 28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are trying to apply an animation, but already running 28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // an animation of the same type, then just leave that one alone. 28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 283306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Only apply an animation if the display isn't frozen. If it is 28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // frozen, there is no reason to animate and it can cause strange 28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // artifacts when we unfreeze the display if some different animation 28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // is running. 2838de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn if (!mDisplayFrozen && mPolicy.isScreenOn()) { 28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int anim = mPolicy.selectAnimationLw(win, transit); 28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int attr = -1; 28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Animation a = null; 28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (anim != 0) { 28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a = AnimationUtils.loadAnimation(mContext, anim); 28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (transit) { 28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WindowManagerPolicy.TRANSIT_ENTER: 28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr = com.android.internal.R.styleable.WindowAnimation_windowEnterAnimation; 28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WindowManagerPolicy.TRANSIT_EXIT: 28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr = com.android.internal.R.styleable.WindowAnimation_windowExitAnimation; 28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WindowManagerPolicy.TRANSIT_SHOW: 28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr = com.android.internal.R.styleable.WindowAnimation_windowShowAnimation; 28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WindowManagerPolicy.TRANSIT_HIDE: 28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr = com.android.internal.R.styleable.WindowAnimation_windowHideAnimation; 28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attr >= 0) { 28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a = loadAnimation(win.mAttrs, attr); 28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28638a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ANIM) Slog.v(TAG, "applyAnimation: win=" + win 28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " anim=" + anim + " attr=0x" + Integer.toHexString(attr) 28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAnimation=" + win.mAnimation 28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " isEntrance=" + isEntrance); 28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a != null) { 28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_ANIM) { 2869b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn RuntimeException e = null; 2870b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (!HIDE_STACK_CRAWLS) { 2871b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e = new RuntimeException(); 2872b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e.fillInStackTrace(); 2873b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 28748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Loaded animation " + a + " for " + win, e); 28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.setAnimation(a); 28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mAnimationIsEntrance = isEntrance; 28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.clearAnimation(); 28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return win.mAnimation != null; 28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Animation loadAnimation(WindowManager.LayoutParams lp, int animAttr) { 28879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int anim = 0; 28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context context = mContext; 28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (animAttr >= 0) { 28909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeCache.Entry ent = getCachedAnimations(lp); 28919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ent != null) { 28929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project context = ent.context; 28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project anim = ent.array.getResourceId(animAttr, 0); 28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (anim != 0) { 28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AnimationUtils.loadAnimation(context, anim); 28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 290106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 29023b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn private Animation loadAnimation(String packageName, int resId) { 29033b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn int anim = 0; 29043b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn Context context = mContext; 29053b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (resId >= 0) { 29063b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn AttributeCache.Entry ent = getCachedAnimations(packageName, resId); 29073b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (ent != null) { 29083b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn context = ent.context; 29093b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn anim = resId; 29103b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 29113b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 29123b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (anim != 0) { 29133b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn return AnimationUtils.loadAnimation(context, anim); 29143b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 29153b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn return null; 29163b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 29173b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn 29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean applyAnimationLocked(AppWindowToken wtoken, 2919ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn WindowManager.LayoutParams lp, int transit, boolean enter) { 29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Only apply an animation if the display isn't frozen. If it is 29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // frozen, there is no reason to animate and it can cause strange 29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // artifacts when we unfreeze the display if some different animation 29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // is running. 2924de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn if (!mDisplayFrozen && mPolicy.isScreenOn()) { 29250a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima Animation a; 2926ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn if (mNextAppTransitionPackage != null) { 29273b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn a = loadAnimation(mNextAppTransitionPackage, enter ? 29283b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn mNextAppTransitionEnter : mNextAppTransitionExit); 29290a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima } else { 29300a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima int animAttr = 0; 29310a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima switch (transit) { 29320a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN: 29330a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima animAttr = enter 29340a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima ? com.android.internal.R.styleable.WindowAnimation_activityOpenEnterAnimation 29350a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima : com.android.internal.R.styleable.WindowAnimation_activityOpenExitAnimation; 29360a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima break; 29370a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima case WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE: 29380a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima animAttr = enter 29390a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima ? com.android.internal.R.styleable.WindowAnimation_activityCloseEnterAnimation 29400a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima : com.android.internal.R.styleable.WindowAnimation_activityCloseExitAnimation; 29410a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima break; 29420a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima case WindowManagerPolicy.TRANSIT_TASK_OPEN: 29430a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima animAttr = enter 29440a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima ? com.android.internal.R.styleable.WindowAnimation_taskOpenEnterAnimation 29450a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima : com.android.internal.R.styleable.WindowAnimation_taskOpenExitAnimation; 29460a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima break; 29470a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima case WindowManagerPolicy.TRANSIT_TASK_CLOSE: 29480a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima animAttr = enter 29490a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima ? com.android.internal.R.styleable.WindowAnimation_taskCloseEnterAnimation 29500a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima : com.android.internal.R.styleable.WindowAnimation_taskCloseExitAnimation; 29510a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima break; 29520a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima case WindowManagerPolicy.TRANSIT_TASK_TO_FRONT: 29530a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima animAttr = enter 29540a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima ? com.android.internal.R.styleable.WindowAnimation_taskToFrontEnterAnimation 29550a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima : com.android.internal.R.styleable.WindowAnimation_taskToFrontExitAnimation; 29560a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima break; 29570a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima case WindowManagerPolicy.TRANSIT_TASK_TO_BACK: 29580a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima animAttr = enter 29595a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima ? com.android.internal.R.styleable.WindowAnimation_taskToBackEnterAnimation 29600a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima : com.android.internal.R.styleable.WindowAnimation_taskToBackExitAnimation; 29610a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima break; 296225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_WALLPAPER_OPEN: 296325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn animAttr = enter 296425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn ? com.android.internal.R.styleable.WindowAnimation_wallpaperOpenEnterAnimation 296525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn : com.android.internal.R.styleable.WindowAnimation_wallpaperOpenExitAnimation; 296625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn break; 296725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_WALLPAPER_CLOSE: 296825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn animAttr = enter 296925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn ? com.android.internal.R.styleable.WindowAnimation_wallpaperCloseEnterAnimation 297025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn : com.android.internal.R.styleable.WindowAnimation_wallpaperCloseExitAnimation; 297125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn break; 297225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_OPEN: 2973f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn animAttr = enter 297425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenEnterAnimation 297525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenExitAnimation; 2976f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn break; 297725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_CLOSE: 2978f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn animAttr = enter 297925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseEnterAnimation 298025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseExitAnimation; 2981f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn break; 29820a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima } 2983bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn a = animAttr != 0 ? loadAnimation(lp, animAttr) : null; 29848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ANIM) Slog.v(TAG, "applyAnimation: wtoken=" + wtoken 29850a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima + " anim=" + a 29860a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima + " animAttr=0x" + Integer.toHexString(animAttr) 29870a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima + " transit=" + transit); 29889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a != null) { 29909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_ANIM) { 2991b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn RuntimeException e = null; 2992b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (!HIDE_STACK_CRAWLS) { 2993b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e = new RuntimeException(); 2994b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e.fillInStackTrace(); 2995b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 29968a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Loaded animation " + a + " for " + wtoken, e); 29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.setAnimation(a); 29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.clearAnimation(); 30029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return wtoken.animation != null; 30059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 30089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Application Window Tokens 30099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void validateAppTokens(List tokens) { 30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int v = tokens.size()-1; 30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int m = mAppTokens.size()-1; 30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (v >= 0 && m >= 0) { 30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = mAppTokens.get(m); 30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.removed) { 30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m--; 30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tokens.get(v) != wtoken.token) { 30218a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Tokens out of sync: external is " + tokens.get(v) 30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " @ " + v + ", internal is " + wtoken.token + " @ " + m); 30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v--; 30259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m--; 30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (v >= 0) { 30288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "External token not found: " + tokens.get(v) + " @ " + v); 30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v--; 30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (m >= 0) { 30329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = mAppTokens.get(m); 30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!wtoken.removed) { 30348a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Invalid internal token: " + wtoken.token + " @ " + m); 30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m--; 30379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean checkCallingPermission(String permission, String func) { 30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Quick check: if the calling permission is me, it's all okay. 30429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Binder.getCallingPid() == Process.myPid()) { 30439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 30449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 304506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 30469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mContext.checkCallingPermission(permission) 30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project == PackageManager.PERMISSION_GRANTED) { 30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String msg = "Permission Denial: " + func + " from pid=" 30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Binder.getCallingPid() 30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", uid=" + Binder.getCallingUid() 30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " requires " + permission; 30548a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, msg); 30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 305706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken findAppWindowToken(IBinder token) { 30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken wtoken = mTokenMap.get(token); 30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null) { 30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return wtoken.appWindowToken; 30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 306506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addWindowToken(IBinder token, int type) { 30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "addWindowToken()")) { 3069cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 307106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken wtoken = mTokenMap.get(token); 30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken != null) { 30758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add existing input method token: " + token); 30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 30779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn wtoken = new WindowToken(this, token, type, true); 30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTokenMap.put(token, wtoken); 30804c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (type == TYPE_WALLPAPER) { 30814c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mWallpaperTokens.add(wtoken); 30824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 30839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 308506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeWindowToken(IBinder token) { 30879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "removeWindowToken()")) { 3089cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken wtoken = mTokenMap.remove(token); 30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken != null) { 30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean delayed = false; 30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!wtoken.hidden) { 30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.hidden = true; 309906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = wtoken.windows.size(); 31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed = false; 310206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = wtoken.windows.get(i); 31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.isAnimating()) { 31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delayed = true; 31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 310906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.isVisibleNow()) { 31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applyAnimationLocked(win, 31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManagerPolicy.TRANSIT_EXIT, false); 31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = true; 31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (changed) { 31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 31203a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, 31213a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/); 31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 312306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delayed) { 31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExitingTokens.add(wtoken); 31264c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } else if (wtoken.windowType == TYPE_WALLPAPER) { 31274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mWallpaperTokens.remove(wtoken); 31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 313006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 31312e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(true /*force*/); 31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 31338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to remove non-existing token: " + token); 31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addAppToken(int addPos, IApplicationToken token, 31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int groupId, int requestedOrientation, boolean fullscreen) { 31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 31429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "addAppToken()")) { 3143cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3145349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 3146349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // Get the dispatching timeout here while we are not holding any locks so that it 3147349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // can be cached by the AppWindowToken. The timeout value is used later by the 3148349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // input dispatcher in code that does hold locks. If we did not cache the value 3149349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // here we would run the chance of introducing a deadlock between the window manager 3150349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // (which holds locks while updating the input dispatcher state) and the activity manager 3151349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // (which holds locks while querying the application token). 3152349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown long inputDispatchingTimeoutNanos; 3153349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown try { 3154349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown inputDispatchingTimeoutNanos = token.getKeyDispatchingTimeout() * 1000000L; 3155349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown } catch (RemoteException ex) { 3156349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown Slog.w(TAG, "Could not get dispatching timeout.", ex); 3157349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown inputDispatchingTimeoutNanos = DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS; 3158349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown } 315906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = findAppWindowToken(token.asBinder()); 31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken != null) { 31638a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add existing app token: " + token); 31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn wtoken = new AppWindowToken(this, token); 3167349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown wtoken.inputDispatchingTimeoutNanos = inputDispatchingTimeoutNanos; 31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.groupId = groupId; 31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.appFullscreen = fullscreen; 31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.requestedOrientation = requestedOrientation; 3171f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_TOKEN_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG, "addAppToken: " + wtoken); 31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTokens.add(addPos, wtoken); 31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTokenMap.put(token.asBinder(), wtoken); 317406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 31759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Application tokens start out hidden. 31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.hidden = true; 31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.hiddenRequested = true; 317806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //dump(); 31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 318206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 31839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAppGroupId(IBinder token, int groupId) { 31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAppStartingIcon()")) { 3186cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 31909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = findAppWindowToken(token); 31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null) { 31928a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to set group id of non-existing app token: " + token); 31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.groupId = groupId; 31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 319806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getOrientationFromWindowsLocked() { 3200bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn if (mDisplayFrozen || mOpeningApps.size() > 0 || mClosingApps.size() > 0) { 3201bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn // If the display is frozen, some activities may be in the middle 3202bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn // of restarting, and thus have removed their old window. If the 3203bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn // window has the flag to hide the lock screen, then the lock screen 3204bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn // can re-appear and inflict its own orientation on us. Keep the 3205bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn // orientation stable until this all settles down. 3206bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn return mLastWindowForcedOrientation; 3207bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn } 3208bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn 32099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = mWindows.size() - 1; 32109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (pos >= 0) { 3211e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState wtoken = mWindows.get(pos); 32129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos--; 32139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.mAppToken != null) { 32149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We hit an application window. so the orientation will be determined by the 32159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // app window. No point in continuing further. 3216bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn return (mLastWindowForcedOrientation=ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 32179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3218b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate if (!wtoken.isVisibleLw() || !wtoken.mPolicyVisibilityAfterAnim) { 32199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 32209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int req = wtoken.mAttrs.screenOrientation; 32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if((req == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) || 32239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (req == ActivityInfo.SCREEN_ORIENTATION_BEHIND)){ 32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3226bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn return (mLastWindowForcedOrientation=req); 32279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3229bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn return (mLastWindowForcedOrientation=ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 323106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getOrientationFromAppTokensLocked() { 3233e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn int pos = mAppTokens.size() - 1; 3234e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn int curGroup = 0; 3235e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn int lastOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 3236e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean findingBehind = false; 3237e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean haveGroup = false; 3238e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean lastFullscreen = false; 3239e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn while (pos >= 0) { 3240e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn AppWindowToken wtoken = mAppTokens.get(pos); 3241e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn pos--; 3242bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn 3243bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn if (DEBUG_APP_ORIENTATION) Slog.v(TAG, "Checking app orientation: " + wtoken); 3244bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn 3245e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // if we're about to tear down this window and not seek for 3246e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // the behind activity, don't use it for orientation 3247e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (!findingBehind 3248e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn && (!wtoken.hidden && wtoken.hiddenRequested)) { 3249bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn if (DEBUG_ORIENTATION) Slog.v(TAG, "Skipping " + wtoken 3250bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn + " -- going to hide"); 3251e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn continue; 3252e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3253e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 3254e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (!haveGroup) { 3255e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // We ignore any hidden applications on the top. 3256e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (wtoken.hiddenRequested || wtoken.willBeHidden) { 3257bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn if (DEBUG_ORIENTATION) Slog.v(TAG, "Skipping " + wtoken 3258bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn + " -- hidden on top"); 3259105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project continue; 3260105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 3261e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn haveGroup = true; 3262e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn curGroup = wtoken.groupId; 3263e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn lastOrientation = wtoken.requestedOrientation; 3264e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } else if (curGroup != wtoken.groupId) { 3265e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // If we have hit a new application group, and the bottom 3266e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // of the previous group didn't explicitly say to use 3267e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // the orientation behind it, and the last app was 3268e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // full screen, then we'll stick with the 3269e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // user's orientation. 3270e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (lastOrientation != ActivityInfo.SCREEN_ORIENTATION_BEHIND 3271e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn && lastFullscreen) { 3272bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn if (DEBUG_ORIENTATION) Slog.v(TAG, "Done at " + wtoken 3273bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn + " -- end of group, return " + lastOrientation); 3274e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return lastOrientation; 3275e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3276e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3277e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn int or = wtoken.requestedOrientation; 3278e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // If this application is fullscreen, and didn't explicitly say 3279e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // to use the orientation behind it, then just take whatever 3280e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // orientation it has and ignores whatever is under it. 3281e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn lastFullscreen = wtoken.appFullscreen; 3282e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (lastFullscreen 3283e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn && or != ActivityInfo.SCREEN_ORIENTATION_BEHIND) { 3284bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn if (DEBUG_ORIENTATION) Slog.v(TAG, "Done at " + wtoken 3285bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn + " -- full screen, return " + or); 3286e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return or; 3287e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3288e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // If this application has requested an explicit orientation, 3289e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // then use it. 3290e5439f228f603f60febe058f633d91d5af2fff76Dianne Hackborn if (or != ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED 3291e5439f228f603f60febe058f633d91d5af2fff76Dianne Hackborn && or != ActivityInfo.SCREEN_ORIENTATION_BEHIND) { 3292bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn if (DEBUG_ORIENTATION) Slog.v(TAG, "Done at " + wtoken 3293bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn + " -- explicitly set, return " + or); 3294e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return or; 3295e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3296e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn findingBehind |= (or == ActivityInfo.SCREEN_ORIENTATION_BEHIND); 3297e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3298bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn if (DEBUG_ORIENTATION) Slog.v(TAG, "No app is requesting an orientation"); 3299e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 33009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 330106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 33029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Configuration updateOrientationFromAppTokens( 3303105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project Configuration currentConfig, IBinder freezeThisOneIfNeeded) { 3304cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 3305cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn "updateOrientationFromAppTokens()")) { 3306cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 3307cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn } 3308ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 3309e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn Configuration config = null; 33109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long ident = Binder.clearCallingIdentity(); 3311e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 33129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 33137916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn config = updateOrientationFromAppTokensLocked(currentConfig, 33147916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn freezeThisOneIfNeeded); 33157916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 33167916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 33177916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn Binder.restoreCallingIdentity(ident); 33187916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn return config; 33197916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 33207916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 33217916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn private Configuration updateOrientationFromAppTokensLocked( 33227916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn Configuration currentConfig, IBinder freezeThisOneIfNeeded) { 33237916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn Configuration config = null; 33247916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 33257916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (updateOrientationFromAppTokensLocked(false)) { 33267916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (freezeThisOneIfNeeded != null) { 33277916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn AppWindowToken wtoken = findAppWindowToken( 33287916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn freezeThisOneIfNeeded); 33297916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (wtoken != null) { 33307916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn startAppFreezingScreenLocked(wtoken, 33317916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn ActivityInfo.CONFIG_ORIENTATION); 33327916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 33337916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 33347916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn config = computeNewConfigurationLocked(); 33357916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 33367916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } else if (currentConfig != null) { 33377916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn // No obvious action we need to take, but if our current 33387916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn // state mismatches the activity manager's, update it, 33397916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn // disregarding font scale, which should remain set to 33407916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn // the value of the previous configuration. 33417916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mTempConfiguration.setToDefaults(); 33427916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mTempConfiguration.fontScale = currentConfig.fontScale; 33437916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (computeNewConfigurationLocked(mTempConfiguration)) { 33447916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (currentConfig.diff(mTempConfiguration) != 0) { 33457916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mWaitingForConfig = true; 33467916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mLayoutNeeded = true; 33477916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn startFreezingDisplayLocked(false); 33487916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn config = new Configuration(mTempConfiguration); 3349e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3350bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn } 33519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3352e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 33539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return config; 33549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 335506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 33569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 3357e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * Determine the new desired orientation of the display, returning 3358e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * a non-null new Configuration if it has changed from the current 3359e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * orientation. IF TRUE IS RETURNED SOMEONE MUST CALL 3360e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * setNewConfiguration() TO TELL THE WINDOW MANAGER IT CAN UNFREEZE THE 3361e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * SCREEN. This will typically be done for you if you call 3362e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * sendNewConfiguration(). 3363e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * 33649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The orientation is computed from non-application windows first. If none of 33659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the non-application windows specify orientation, the orientation is computed from 336606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * application tokens. 33679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.view.IWindowManager#updateOrientationFromAppTokens( 33689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android.os.IBinder) 33699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 337094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn boolean updateOrientationFromAppTokensLocked(boolean inTransaction) { 33719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed = false; 33729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long ident = Binder.clearCallingIdentity(); 33739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3374c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project int req = computeForcedAppOrientationLocked(); 337506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 33769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (req != mForcedAppOrientation) { 33779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForcedAppOrientation = req; 33789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //send a message to Policy indicating orientation change to take 33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //action like disabling/enabling sensors etc., 3380c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project mPolicy.setCurrentOrientationLw(req); 3381e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (setRotationUncheckedLocked(WindowManagerPolicy.USE_LAST_ROTATION, 338294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn mLastRotationFlags | Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE, 338394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn inTransaction)) { 3384e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn changed = true; 33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3387105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 3388e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return changed; 33899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 33909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(ident); 33919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 339306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 3394c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project int computeForcedAppOrientationLocked() { 3395c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project int req = getOrientationFromWindowsLocked(); 3396c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project if (req == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) { 3397c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project req = getOrientationFromAppTokensLocked(); 3398c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 3399c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project return req; 3400c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 340106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 3402e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn public void setNewConfiguration(Configuration config) { 3403e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 3404e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn "setNewConfiguration()")) { 3405e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 3406e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3407e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 3408e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn synchronized(mWindowMap) { 3409e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn mCurConfiguration = new Configuration(config); 3410e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn mWaitingForConfig = false; 3411e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn performLayoutAndPlaceSurfacesLocked(); 3412e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3413e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3414e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 34159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAppOrientation(IApplicationToken token, int requestedOrientation) { 34169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 34179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAppOrientation()")) { 3418cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 34199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 342006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 34219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 34229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = findAppWindowToken(token.asBinder()); 34239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null) { 34248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to set orientation of non-existing app token: " + token); 34259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 34269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 342706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 34289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.requestedOrientation = requestedOrientation; 34299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 343106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 34329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getAppOrientation(IApplicationToken token) { 34339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 34349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = findAppWindowToken(token.asBinder()); 34359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null) { 34369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 34379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 343806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 34399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return wtoken.requestedOrientation; 34409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 344206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 34439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFocusedApp(IBinder token, boolean moveFocusNow) { 34449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 34459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setFocusedApp()")) { 3446cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 34479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 34509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed = false; 34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token == null) { 34528a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_FOCUS) Slog.v(TAG, "Clearing focused app, was " + mFocusedApp); 34539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = mFocusedApp != null; 34549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFocusedApp = null; 345500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown if (changed) { 345600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputMonitor.setFocusedAppLw(null); 3457349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown } 34589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 34599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken newFocus = findAppWindowToken(token); 34609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newFocus == null) { 34618a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to set focus to non-existing app token: " + token); 34629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 34639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = mFocusedApp != newFocus; 34659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFocusedApp = newFocus; 34668a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_FOCUS) Slog.v(TAG, "Set focused app to: " + mFocusedApp); 346700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown if (changed) { 346800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputMonitor.setFocusedAppLw(newFocus); 3469349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown } 34709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (moveFocusNow && changed) { 34739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 34743a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/); 34759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 34769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34807da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn public void prepareAppTransition(int transit, boolean alwaysKeepCurrent) { 34819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 34829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "prepareAppTransition()")) { 3483cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 34849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 348506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 34869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 34878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v( 34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Prepare app transition: transit=" + transit 34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mNextAppTransition=" + mNextAppTransition); 3490b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn if (!mDisplayFrozen && mPolicy.isScreenOn()) { 3491bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET 3492bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn || mNextAppTransition == WindowManagerPolicy.TRANSIT_NONE) { 34939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextAppTransition = transit; 34947da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn } else if (!alwaysKeepCurrent) { 34957da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn if (transit == WindowManagerPolicy.TRANSIT_TASK_OPEN 34967da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn && mNextAppTransition == WindowManagerPolicy.TRANSIT_TASK_CLOSE) { 34977da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn // Opening a new task always supersedes a close for the anim. 34987da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mNextAppTransition = transit; 34997da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn } else if (transit == WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN 35007da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn && mNextAppTransition == WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE) { 35017da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn // Opening a new activity always supersedes a close for the anim. 35027da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mNextAppTransition = transit; 35037da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn } 35049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTransitionReady = false; 35069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTransitionTimeout = false; 35079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartingIconInTransition = false; 35089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSkipAppTransitionAnimation = false; 35099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.removeMessages(H.APP_TRANSITION_TIMEOUT); 35109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessageDelayed(mH.obtainMessage(H.APP_TRANSITION_TIMEOUT), 35119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5000); 35129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getPendingAppTransition() { 35179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNextAppTransition; 35189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 351906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 35203b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn public void overridePendingAppTransition(String packageName, 35213b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn int enterAnim, int exitAnim) { 35228b571a817cc953ce96750f440645f104c7f55157Dianne Hackborn if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 35233b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn mNextAppTransitionPackage = packageName; 35243b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn mNextAppTransitionEnter = enterAnim; 35253b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn mNextAppTransitionExit = exitAnim; 35263b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 35273b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 3528ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 35299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void executeAppTransition() { 35309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 35319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "executeAppTransition()")) { 3532cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 35339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 353406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 35359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 35363b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (DEBUG_APP_TRANSITIONS) { 35373b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn RuntimeException e = new RuntimeException("here"); 35383b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn e.fillInStackTrace(); 35398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Execute app transition: mNextAppTransition=" 35403b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn + mNextAppTransition, e); 35413b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 3542bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTransitionReady = true; 35449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAppStartingWindow(IBinder token, String pkg, 35522f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn int theme, CompatibilityInfo compatInfo, 35532f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn CharSequence nonLocalizedLabel, int labelRes, int icon, 35547eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn int windowFlags, IBinder transferFrom, boolean createIfNeeded) { 35559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 35569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAppStartingIcon()")) { 3557cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 35618a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW) Slog.v( 35629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "setAppStartingIcon: token=" + token + " pkg=" + pkg 35639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " transferFrom=" + transferFrom); 356406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 35659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = findAppWindowToken(token); 35669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null) { 35678a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to set icon of non-existing app token: " + token); 35689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 35699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the display is frozen, we won't do anything until the 35729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // actual window is displayed so there is no reason to put in 35739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the starting window. 3574de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn if (mDisplayFrozen || !mPolicy.isScreenOn()) { 35759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 35769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 357706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 35789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.startingData != null) { 35799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 358106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 35829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (transferFrom != null) { 35839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken ttoken = findAppWindowToken(transferFrom); 35849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ttoken != null) { 35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState startingWindow = ttoken.startingWindow; 35869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (startingWindow != null) { 35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mStartingIconInTransition) { 35889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In this case, the starting icon has already 35899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // been displayed, so start letting windows get 35909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // shown immediately without any more transitions. 35919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSkipAppTransitionAnimation = true; 35929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35938a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW) Slog.v(TAG, 35949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Moving existing starting from " + ttoken 35959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " to " + wtoken); 35969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 359706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 35989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Transfer the starting window over to the new 35999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // token. 36009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingData = ttoken.startingData; 36019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingView = ttoken.startingView; 36029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingWindow = startingWindow; 36039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.startingData = null; 36049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.startingView = null; 36059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.startingWindow = null; 36069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.startingMoved = true; 36079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startingWindow.mToken = wtoken; 3608ef49c57bdcdb6c808870570c205434b002431c37Dianne Hackborn startingWindow.mRootToken = wtoken; 36099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startingWindow.mAppToken = wtoken; 3610f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG, 36119bfb707597898f54722460b48588007b682f3e2aDianne Hackborn "Removing starting window: " + startingWindow); 36129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.remove(startingWindow); 3613dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 3614f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Removing starting " + startingWindow 3615f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn + " from " + ttoken); 36169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.windows.remove(startingWindow); 36179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.allAppWindows.remove(startingWindow); 36189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addWindowToListInOrderLocked(startingWindow, true); 361906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 36209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Propagate other interesting state between the 36219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // tokens. If the old token is displayed, we should 36229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // immediately force the new one to be displayed. If 36239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it is animating, we need to move that animation to 36249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the new one. 36259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ttoken.allDrawn) { 36269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.allDrawn = true; 36279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ttoken.firstWindowDrawn) { 36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.firstWindowDrawn = true; 36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!ttoken.hidden) { 36329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.hidden = false; 36339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.hiddenRequested = false; 36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.willBeHidden = false; 36359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.clientHidden != ttoken.clientHidden) { 36379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.clientHidden = ttoken.clientHidden; 36389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.sendAppVisibilityToClients(); 36399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ttoken.animation != null) { 36419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.animation = ttoken.animation; 36429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.animating = ttoken.animating; 36439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.animLayerAdjustment = ttoken.animLayerAdjustment; 36449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.animation = null; 36459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.animLayerAdjustment = 0; 36469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.updateLayers(); 36479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.updateLayers(); 36489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 364906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 36503a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, 36513a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown true /*updateInputWindows*/); 36529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 36539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 36549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 36559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 36569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (ttoken.startingData != null) { 36579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The previous app was getting ready to show a 36589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // starting window, but hasn't yet done so. Steal it! 36598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW) Slog.v(TAG, 36609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Moving pending starting from " + ttoken 36619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " to " + wtoken); 36629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingData = ttoken.startingData; 36639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.startingData = null; 36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.startingMoved = true; 36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = mH.obtainMessage(H.ADD_STARTING, wtoken); 36669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Note: we really want to do sendMessageAtFrontOfQueue() because we 36679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // want to process the message ASAP, before any other queued 36689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // messages. 36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessageAtFrontOfQueue(m); 36709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 36719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // There is no existing starting window, and the caller doesn't 36769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // want us to create one, so that's it! 36779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!createIfNeeded) { 36789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 36799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 368006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 3681284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn // If this is a translucent or wallpaper window, then don't 3682284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn // show a starting window -- the current effect (a full-screen 3683284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn // opaque starting window that fades away to the real contents 3684284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn // when it is ready) does not work for this. 3685284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (theme != 0) { 3686284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn AttributeCache.Entry ent = AttributeCache.instance().get(pkg, theme, 3687284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn com.android.internal.R.styleable.Window); 3688284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (ent.array.getBoolean( 3689284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn com.android.internal.R.styleable.Window_windowIsTranslucent, false)) { 3690284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn return; 3691284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 3692284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (ent.array.getBoolean( 36936136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn com.android.internal.R.styleable.Window_windowIsFloating, false)) { 36946136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn return; 36956136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn } 36966136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn if (ent.array.getBoolean( 3697284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn com.android.internal.R.styleable.Window_windowShowWallpaper, false)) { 3698284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn return; 3699284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 3700284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 3701ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 37029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartingIconInTransition = true; 37032f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn wtoken.startingData = new StartingData(pkg, theme, compatInfo, nonLocalizedLabel, 37047eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn labelRes, icon, windowFlags); 37059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = mH.obtainMessage(H.ADD_STARTING, wtoken); 37069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Note: we really want to do sendMessageAtFrontOfQueue() because we 37079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // want to process the message ASAP, before any other queued 37089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // messages. 37099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessageAtFrontOfQueue(m); 37109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAppWillBeHidden(IBinder token) { 37149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAppWillBeHidden()")) { 3716cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken; 37209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken = findAppWindowToken(token); 37239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null) { 37248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to set will be hidden of non-existing app token: " + token); 37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 37269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.willBeHidden = true; 37289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 373006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 37319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean setTokenVisibilityLocked(AppWindowToken wtoken, WindowManager.LayoutParams lp, 3732ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn boolean visible, int transit, boolean performLayout) { 37339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean delayed = false; 37349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.clientHidden == visible) { 37369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.clientHidden = !visible; 37379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.sendAppVisibilityToClients(); 37389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 373906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 37409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.willBeHidden = false; 37419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.hidden == visible) { 37429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = wtoken.allAppWindows.size(); 37439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed = false; 37448a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v( 37459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Changing app " + wtoken + " hidden=" + wtoken.hidden 37469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " performLayout=" + performLayout); 374706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 37489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean runningAppAnimation = false; 374906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 3750bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (transit != WindowManagerPolicy.TRANSIT_UNSET) { 37519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.animation == sDummyAnimation) { 37529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.animation = null; 37539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3754ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn applyAnimationLocked(wtoken, lp, transit, visible); 37559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = true; 37569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.animation != null) { 37579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delayed = runningAppAnimation = true; 37589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 376006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 37619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 37629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = wtoken.allAppWindows.get(i); 37639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win == wtoken.startingWindow) { 37649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 37659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.isAnimating()) { 37689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delayed = true; 37699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 377006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 37718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Window " + win + ": vis=" + win.isVisible()); 37729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //win.dump(" "); 37739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (visible) { 37749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!win.isVisibleNow()) { 37759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!runningAppAnimation) { 37769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applyAnimationLocked(win, 37779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManagerPolicy.TRANSIT_ENTER, true); 37789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = true; 37809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (win.isVisibleNow()) { 37829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!runningAppAnimation) { 37839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applyAnimationLocked(win, 37849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManagerPolicy.TRANSIT_EXIT, false); 37859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = true; 37879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.hidden = wtoken.hiddenRequested = !visible; 37919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!visible) { 37929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsetAppFreezingScreenLocked(wtoken, true, true); 37939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 37949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are being set visible, and the starting window is 37959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // not yet displayed, then make sure it doesn't get displayed. 37969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState swin = wtoken.startingWindow; 37979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (swin != null && (swin.mDrawPending 37989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || swin.mCommitDrawPending)) { 37999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project swin.mPolicyVisibility = false; 38009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project swin.mPolicyVisibilityAfterAnim = false; 38019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 380306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 38048a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "setTokenVisibilityLocked: " + wtoken 38059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": hidden=" + wtoken.hidden + " hiddenRequested=" 38069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken.hiddenRequested); 380706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 38089b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn if (changed) { 38099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 38103a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown mInputMonitor.setUpdateInputWindowsNeededLw(); 38119b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn if (performLayout) { 38123a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, 38133a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/); 38149b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn performLayoutAndPlaceSurfacesLocked(); 38159b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn } 38162e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(false /*force*/); 38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.animation != null) { 38219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delayed = true; 38229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 382306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 38249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return delayed; 38259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAppVisibility(IBinder token, boolean visible) { 38289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 38299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAppVisibility()")) { 3830cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 38319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken; 38349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 38369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken = findAppWindowToken(token); 38379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null) { 38388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to set visibility of non-existing app token: " + token); 38399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 38409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_APP_TRANSITIONS || DEBUG_ORIENTATION) { 3843b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn RuntimeException e = null; 3844b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (!HIDE_STACK_CRAWLS) { 3845b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e = new RuntimeException(); 3846b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e.fillInStackTrace(); 3847b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 38488a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "setAppVisibility(" + token + ", " + visible 38499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "): mNextAppTransition=" + mNextAppTransition 38509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " hidden=" + wtoken.hidden 38519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " hiddenRequested=" + wtoken.hiddenRequested, e); 38529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 385306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 38549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are preparing an app transition, then delay changing 38559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the visibility of this token until we execute that transition. 3856b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn if (!mDisplayFrozen && mPolicy.isScreenOn() 3857b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn && mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 38589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Already in requested state, don't do anything more. 38599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.hiddenRequested != visible) { 38609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 38619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.hiddenRequested = !visible; 386306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 38648a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v( 38659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Setting dummy animation on: " + wtoken); 38669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.setDummyAnimation(); 38679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOpeningApps.remove(wtoken); 38689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClosingApps.remove(wtoken); 3869a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wtoken.waitingToShow = wtoken.waitingToHide = false; 38709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.inPendingTransaction = true; 38719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (visible) { 38729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOpeningApps.add(wtoken); 38739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingDisplayed = false; 38749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingMoved = false; 3875ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 3876195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // If the token is currently hidden (should be the 3877195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // common case), then we need to set up to wait for 3878195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // its windows to be ready. 3879195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn if (wtoken.hidden) { 3880195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn wtoken.allDrawn = false; 3881195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn wtoken.waitingToShow = true; 3882ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 3883195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn if (wtoken.clientHidden) { 3884195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // In the case where we are making an app visible 3885195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // but holding off for a transition, we still need 3886195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // to tell the client to make its windows visible so 3887195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // they get drawn. Otherwise, we will wait on 3888195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // performing the transition until all windows have 3889195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // been drawn, they never will be, and we are sad. 3890195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn wtoken.clientHidden = false; 3891195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn wtoken.sendAppVisibilityToClients(); 3892195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn } 38939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 38959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClosingApps.add(wtoken); 3896ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 3897195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // If the token is currently visible (should be the 3898195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // common case), then set up to wait for it to be hidden. 3899195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn if (!wtoken.hidden) { 3900195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn wtoken.waitingToHide = true; 3901195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn } 39029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 39049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 390506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 39069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 3907e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn setTokenVisibilityLocked(wtoken, null, visible, WindowManagerPolicy.TRANSIT_UNSET, 3908ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn true); 39099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.updateReportedVisibilityLocked(); 39109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 39119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void unsetAppFreezingScreenLocked(AppWindowToken wtoken, 39159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean unfreezeSurfaceNow, boolean force) { 39169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.freezingScreen) { 39178a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, "Clear freezing of " + wtoken 39189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " force=" + force); 39199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = wtoken.allAppWindows.size(); 39209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean unfrozeWindows = false; 39219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 39229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState w = wtoken.allAppWindows.get(i); 39239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mAppFreezing) { 39249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mAppFreezing = false; 39259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mSurface != null && !w.mOrientationChanging) { 39269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mOrientationChanging = true; 39279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unfrozeWindows = true; 39299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (force || unfrozeWindows) { 39328a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, "No longer freezing: " + wtoken); 39339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.freezingScreen = false; 39349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppsFreezingScreen--; 39359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (unfreezeSurfaceNow) { 39379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (unfrozeWindows) { 39389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 39399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 39409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3941e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn stopFreezingDisplayLocked(); 39429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 394506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 39469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startAppFreezingScreenLocked(AppWindowToken wtoken, 39479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int configChanges) { 39489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_ORIENTATION) { 3949b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn RuntimeException e = null; 3950b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (!HIDE_STACK_CRAWLS) { 3951b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e = new RuntimeException(); 3952b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e.fillInStackTrace(); 3953b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 39548a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, "Set freezing of " + wtoken.appToken 39559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": hidden=" + wtoken.hidden + " freezing=" 39569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken.freezingScreen, e); 39579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!wtoken.hiddenRequested) { 39599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!wtoken.freezingScreen) { 39609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.freezingScreen = true; 39619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppsFreezingScreen++; 39629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAppsFreezingScreen == 1) { 396394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn startFreezingDisplayLocked(false); 39649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.removeMessages(H.APP_FREEZE_TIMEOUT); 39659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessageDelayed(mH.obtainMessage(H.APP_FREEZE_TIMEOUT), 39669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5000); 39679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = wtoken.allAppWindows.size(); 39709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 39719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState w = wtoken.allAppWindows.get(i); 39729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mAppFreezing = true; 39739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 397606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 39779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startAppFreezingScreen(IBinder token, int configChanges) { 39789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 39799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAppFreezingScreen()")) { 3980cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 39819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 3984b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn if (configChanges == 0 && !mDisplayFrozen && mPolicy.isScreenOn()) { 39858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, "Skipping set freeze of " + token); 39869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 39879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 398806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 39899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = findAppWindowToken(token); 39909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null || wtoken.appToken == null) { 39918a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to freeze screen with non-existing app token: " + wtoken); 39929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 39939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 39959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startAppFreezingScreenLocked(wtoken, configChanges); 39969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 39979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 399906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 40009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void stopAppFreezingScreen(IBinder token, boolean force) { 40019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 40029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAppFreezingScreen()")) { 4003cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 40049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 40079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = findAppWindowToken(token); 40089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null || wtoken.appToken == null) { 40099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 40109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 40128a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, "Clear freezing of " + token 40139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": hidden=" + wtoken.hidden + " freezing=" + wtoken.freezingScreen); 40149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsetAppFreezingScreenLocked(wtoken, true, force); 40159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 40169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 401806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 40199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeAppToken(IBinder token) { 40209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 40219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "removeAppToken()")) { 4022cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 40239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = null; 40269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken startingToken = null; 40279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean delayed = false; 40289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 40309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 40319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken basewtoken = mTokenMap.remove(token); 40329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (basewtoken != null && (wtoken=basewtoken.appWindowToken) != null) { 40338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Removing app token: " + wtoken); 4034e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn delayed = setTokenVisibilityLocked(wtoken, null, false, 4035ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn WindowManagerPolicy.TRANSIT_UNSET, true); 40369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.inPendingTransaction = false; 40379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOpeningApps.remove(wtoken); 4038a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wtoken.waitingToShow = false; 40399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mClosingApps.contains(wtoken)) { 40409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delayed = true; 4041bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn } else if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 40429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClosingApps.add(wtoken); 4043a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wtoken.waitingToHide = true; 40449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delayed = true; 40459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v( 40479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Removing app " + wtoken + " delayed=" + delayed 40489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " animation=" + wtoken.animation 40499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " animating=" + wtoken.animating); 40509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delayed) { 40519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // set the token aside because it has an active animation to be finished 4052f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, 4053f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn "removeAppToken make exiting: " + wtoken); 40549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExitingAppTokens.add(wtoken); 40559bfb707597898f54722460b48588007b682f3e2aDianne Hackborn } else { 40569bfb707597898f54722460b48588007b682f3e2aDianne Hackborn // Make sure there is no animation running on this token, 40579bfb707597898f54722460b48588007b682f3e2aDianne Hackborn // so any windows associated with it will be removed as 40589bfb707597898f54722460b48588007b682f3e2aDianne Hackborn // soon as their animations are complete 40599bfb707597898f54722460b48588007b682f3e2aDianne Hackborn wtoken.animation = null; 40609bfb707597898f54722460b48588007b682f3e2aDianne Hackborn wtoken.animating = false; 40619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4062f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, 4063f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn "removeAppToken: " + wtoken); 40649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTokens.remove(wtoken); 40659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.removed = true; 40669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.startingData != null) { 40679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startingToken = wtoken; 40689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsetAppFreezingScreenLocked(wtoken, true, true); 40709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFocusedApp == wtoken) { 40718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_FOCUS) Slog.v(TAG, "Removing focused app token:" + wtoken); 40729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFocusedApp = null; 40733a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/); 407400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputMonitor.setFocusedAppLw(null); 40759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 40778a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to remove non-existing app token: " + token); 40789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 407906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 40809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!delayed && wtoken != null) { 40819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.updateReportedVisibilityLocked(); 40829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 40859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (startingToken != null) { 40878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Schedule remove starting " 40889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + startingToken + ": app token removed"); 40899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = mH.obtainMessage(H.REMOVE_STARTING, startingToken); 40909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessage(m); 40919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean tmpRemoveAppWindowsLocked(WindowToken token) { 40959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NW = token.windows.size(); 40969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<NW; i++) { 40979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = token.windows.get(i); 40988a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Tmp removing app window " + win); 40999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.remove(win); 4100dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 41019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int j = win.mChildWindows.size(); 41029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (j > 0) { 41039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project j--; 4104e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState cwin = win.mChildWindows.get(j); 41058a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, 4106bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn "Tmp removing child window " + cwin); 4107bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn mWindows.remove(cwin); 41089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NW > 0; 41119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dumpAppTokensLocked() { 41149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=mAppTokens.size()-1; i>=0; i--) { 41158a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, " #" + i + ": " + mAppTokens.get(i).token); 41169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 411806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 41199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dumpWindowsLocked() { 41209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=mWindows.size()-1; i>=0; i--) { 41218a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, " #" + i + ": " + mWindows.get(i)); 41229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 412406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 41259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int findWindowOffsetLocked(int tokenPos) { 41269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NW = mWindows.size(); 41279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tokenPos >= mAppTokens.size()) { 41299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = NW; 41309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i > 0) { 41319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 4132e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState win = mWindows.get(i); 41339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.getAppToken() != null) { 41349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return i+1; 41359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (tokenPos > 0) { 41409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Find the first app token below the new position that has 41419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // a window displayed. 41429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken wtoken = mAppTokens.get(tokenPos-1); 41438a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, "Looking for lower windows @ " 41449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + tokenPos + " -- " + wtoken.token); 4145a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (wtoken.sendingToBottom) { 41468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, 4147a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn "Skipping token -- currently sending to bottom"); 4148a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn tokenPos--; 4149a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn continue; 4150a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 41519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = wtoken.windows.size(); 41529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i > 0) { 41539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 41549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = wtoken.windows.get(i); 41559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int j = win.mChildWindows.size(); 41569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (j > 0) { 41579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project j--; 4158e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState cwin = win.mChildWindows.get(j); 4159a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (cwin.mSubLayer >= 0) { 41609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int pos=NW-1; pos>=0; pos--) { 41619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mWindows.get(pos) == cwin) { 41628a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, 41639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Found child win @" + (pos+1)); 41649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pos+1; 41659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int pos=NW-1; pos>=0; pos--) { 41709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mWindows.get(pos) == win) { 41718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, "Found win @" + (pos+1)); 41729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pos+1; 41739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tokenPos--; 41779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 41809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final int reAddWindowLocked(int index, WindowState win) { 41839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NCW = win.mChildWindows.size(); 41849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean added = false; 41859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j=0; j<NCW; j++) { 4186e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState cwin = win.mChildWindows.get(j); 41879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!added && cwin.mSubLayer >= 0) { 41888a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding child window at " 4189bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn + index + ": " + cwin); 4190f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn win.mRebuilding = false; 41919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.add(index, win); 41929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 41939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project added = true; 41949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41958a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding window at " 4196bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn + index + ": " + cwin); 4197f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn cwin.mRebuilding = false; 41989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.add(index, cwin); 41999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 42009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!added) { 42028a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding window at " 4203bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn + index + ": " + win); 4204f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn win.mRebuilding = false; 42059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.add(index, win); 42069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 42079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4208dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 42099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return index; 42109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 421106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 42129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final int reAddAppWindowsLocked(int index, WindowToken token) { 42139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NW = token.windows.size(); 42149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<NW; i++) { 42159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = reAddWindowLocked(index, token.windows.get(i)); 42169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return index; 42189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void moveAppToken(int index, IBinder token) { 42219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 42229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "moveAppToken()")) { 4223cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 42249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 42278a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, "Initial app tokens:"); 42289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_REORDER) dumpAppTokensLocked(); 42299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken wtoken = findAppWindowToken(token); 4230f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_TOKEN_MOVEMENT || DEBUG_REORDER) Slog.v(TAG, 4231f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn "Start moving token " + wtoken + " initially at " 4232f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn + mAppTokens.indexOf(wtoken)); 42339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null || !mAppTokens.remove(wtoken)) { 42348a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempting to reorder token that doesn't exist: " 42359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + token + " (" + wtoken + ")"); 42369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 42379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTokens.add(index, wtoken); 42398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, "Moved " + token + " to " + index + ":"); 4240f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn else if (DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, "Moved " + token + " to " + index); 42419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_REORDER) dumpAppTokensLocked(); 424206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 42439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 42448a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, "Removing windows in " + token + ":"); 42459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_REORDER) dumpWindowsLocked(); 42469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tmpRemoveAppWindowsLocked(wtoken)) { 42478a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, "Adding windows back in:"); 42489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_REORDER) dumpWindowsLocked(); 42499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reAddAppWindowsLocked(findWindowOffsetLocked(index), wtoken); 42508a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, "Final window list:"); 42519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_REORDER) dumpWindowsLocked(); 42523a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, 42533a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/); 42549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 42552e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.setUpdateInputWindowsNeededLw(); 42569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 42572e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(false /*force*/); 42589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 42609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void removeAppTokensLocked(List<IBinder> tokens) { 42649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XXX This should be done more efficiently! 42659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // (take advantage of the fact that both lists should be 42669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ordered in the same way.) 42679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = tokens.size(); 42689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 42699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder token = tokens.get(i); 42709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken wtoken = findAppWindowToken(token); 4271f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_REORDER || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, 4272f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn "Temporarily removing " + wtoken + " from " + mAppTokens.indexOf(wtoken)); 42739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mAppTokens.remove(wtoken)) { 42748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempting to reorder token that doesn't exist: " 42759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + token + " (" + wtoken + ")"); 42769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 42779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 42789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4282a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn private void moveAppWindowsLocked(AppWindowToken wtoken, int tokenPos, 4283a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn boolean updateFocusAndLayout) { 4284a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // First remove all of the windows from the list. 4285a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn tmpRemoveAppWindowsLocked(wtoken); 4286a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn 4287a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // Where to start adding? 4288a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn int pos = findWindowOffsetLocked(tokenPos); 4289a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn 4290a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // And now add them back at the correct place. 4291a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn pos = reAddAppWindowsLocked(pos, wtoken); 4292a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn 4293a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (updateFocusAndLayout) { 42942e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.setUpdateInputWindowsNeededLw(); 42953a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, 42963a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/)) { 4297a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn assignLayersLocked(); 4298a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 4299a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mLayoutNeeded = true; 4300a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn performLayoutAndPlaceSurfacesLocked(); 43012e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(false /*force*/); 4302a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 4303a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 4304a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn 43059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void moveAppWindowsLocked(List<IBinder> tokens, int tokenPos) { 43069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // First remove all of the windows from the list. 43079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = tokens.size(); 43089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 43099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 43109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken token = mTokenMap.get(tokens.get(i)); 43119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token != null) { 43129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmpRemoveAppWindowsLocked(token); 43139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Where to start adding? 43179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = findWindowOffsetLocked(tokenPos); 43189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // And now add them back at the correct place. 43209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 43219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken token = mTokenMap.get(tokens.get(i)); 43229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token != null) { 43239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = reAddAppWindowsLocked(pos, token); 43249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43272e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.setUpdateInputWindowsNeededLw(); 43283a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, 43293a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/)) { 4330a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn assignLayersLocked(); 4331a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 43329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 43339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 43342e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(false /*force*/); 43359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //dump(); 43379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void moveAppTokensToTop(List<IBinder> tokens) { 43409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 43419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "moveAppTokensToTop()")) { 4342cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 43439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 43469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 43479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeAppTokensLocked(tokens); 43489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = tokens.size(); 43499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 43509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wt = findAppWindowToken(tokens.get(i)); 43519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wt != null) { 4352f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_TOKEN_MOVEMENT || DEBUG_REORDER) Slog.v(TAG, 4353f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn "Adding next to top: " + wt); 43549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTokens.add(wt); 4355bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 4356a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToTopApps.remove(wt); 4357a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToBottomApps.remove(wt); 4358a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToTopApps.add(wt); 4359a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wt.sendingToBottom = false; 4360a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wt.sendingToTop = true; 4361a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 43629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4364ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 4365bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET) { 4366a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn moveAppWindowsLocked(tokens, mAppTokens.size()); 4367a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 43689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 43709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void moveAppTokensToBottom(List<IBinder> tokens) { 43739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 43749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "moveAppTokensToBottom()")) { 4375cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 43769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 43799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 43809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeAppTokensLocked(tokens); 43819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = tokens.size(); 43829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = 0; 43839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 43849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wt = findAppWindowToken(tokens.get(i)); 43859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wt != null) { 4386f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, 4387f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn "Adding next to bottom: " + wt + " at " + pos); 43889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTokens.add(pos, wt); 4389bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 4390a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToTopApps.remove(wt); 4391a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToBottomApps.remove(wt); 4392a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToBottomApps.add(i, wt); 4393a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wt.sendingToTop = false; 4394a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wt.sendingToBottom = true; 4395a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 43969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos++; 43979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4399ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 4400bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET) { 4401a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn moveAppWindowsLocked(tokens, 0); 4402a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 44039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 44059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 44089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Misc IWindowSession methods 44099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 441006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4411284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller private boolean shouldAllowDisableKeyguard() 4412d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller { 4413284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // We fail safe and prevent disabling keyguard in the unlikely event this gets 4414284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // called before DevicePolicyManagerService has started. 4415284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller if (mAllowDisableKeyguard == ALLOW_DISABLE_UNKNOWN) { 4416284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService( 4417284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller Context.DEVICE_POLICY_SERVICE); 4418284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller if (dpm != null) { 4419284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mAllowDisableKeyguard = dpm.getPasswordQuality(null) 4420284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED ? 4421284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller ALLOW_DISABLE_YES : ALLOW_DISABLE_NO; 4422284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller } 4423284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller } 4424284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller return mAllowDisableKeyguard == ALLOW_DISABLE_YES; 4425d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller } 4426d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller 44279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void disableKeyguard(IBinder token, String tag) { 4428733fdf34b6a8a8e3983ff7663828a928d3c19944Mike Lockwood if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD) 44299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project != PackageManager.PERMISSION_GRANTED) { 44309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException("Requires DISABLE_KEYGUARD permission"); 44319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4432d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller 4433284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller synchronized (mKeyguardTokenWatcher) { 4434284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mKeyguardTokenWatcher.acquire(token, tag); 4435dd8846886aa21980ecdca7ba42deac4f7ecd8ff0Mike Lockwood } 44369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void reenableKeyguard(IBinder token) { 4439733fdf34b6a8a8e3983ff7663828a928d3c19944Mike Lockwood if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD) 44409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project != PackageManager.PERMISSION_GRANTED) { 44419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException("Requires DISABLE_KEYGUARD permission"); 44429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4443d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller 4444284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller synchronized (mKeyguardTokenWatcher) { 4445284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mKeyguardTokenWatcher.release(token); 4446284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller 4447284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller if (!mKeyguardTokenWatcher.isAcquired()) { 4448284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // If we are the last one to reenable the keyguard wait until 4449284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // we have actually finished reenabling until returning. 4450284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // It is possible that reenableKeyguard() can be called before 4451284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // the previous disableKeyguard() is handled, in which case 4452284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // neither mKeyguardTokenWatcher.acquired() or released() would 4453284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // be called. In that case mKeyguardDisabled will be false here 4454284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // and we have nothing to wait for. 4455284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller while (mKeyguardDisabled) { 4456284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller try { 4457284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mKeyguardTokenWatcher.wait(); 4458284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller } catch (InterruptedException e) { 4459284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller Thread.currentThread().interrupt(); 44609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 44679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.app.KeyguardManager#exitKeyguardSecurely 44689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 44699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void exitKeyguardSecurely(final IOnKeyguardExitResult callback) { 4470733fdf34b6a8a8e3983ff7663828a928d3c19944Mike Lockwood if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD) 44719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project != PackageManager.PERMISSION_GRANTED) { 44729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException("Requires DISABLE_KEYGUARD permission"); 44739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.exitKeyguardSecurely(new WindowManagerPolicy.OnKeyguardExitResult() { 44759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onKeyguardExitResult(boolean success) { 44769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 44779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callback.onKeyguardExitResult(success); 44789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 44799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Client has died, we don't care. 44809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }); 44839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean inKeyguardRestrictedInputMode() { 44869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPolicy.inKeyguardRestrictedKeyInputMode(); 44879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 448806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4489520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood public boolean isKeyguardLocked() { 4490520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood return mPolicy.isKeyguardLocked(); 4491520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood } 4492520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood 4493520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood public boolean isKeyguardSecure() { 4494520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood return mPolicy.isKeyguardSecure(); 4495520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood } 4496520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood 4497ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn public void closeSystemDialogs(String reason) { 4498ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn synchronized(mWindowMap) { 4499ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn for (int i=mWindows.size()-1; i>=0; i--) { 4500e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 4501ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn if (w.mSurface != null) { 4502ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn try { 4503ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn w.mClient.closeSystemDialogs(reason); 4504ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn } catch (RemoteException e) { 4505ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn } 4506ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn } 4507ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn } 4508ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn } 4509ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn } 4510ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 45119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static float fixScale(float scale) { 45129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scale < 0) scale = 0; 45139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (scale > 20) scale = 20; 45149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Math.abs(scale); 45159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 451606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 45179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAnimationScale(int which, float scale) { 45189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.SET_ANIMATION_SCALE, 45199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAnimationScale()")) { 4520cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires SET_ANIMATION_SCALE permission"); 45219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 45239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scale < 0) scale = 0; 45249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (scale > 20) scale = 20; 45259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scale = Math.abs(scale); 45269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 45279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 0: mWindowAnimationScale = fixScale(scale); break; 45289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 1: mTransitionAnimationScale = fixScale(scale); break; 45299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 453006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 45319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Persist setting 45329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.obtainMessage(H.PERSIST_ANIMATION_SCALE).sendToTarget(); 45339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 453406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 45359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAnimationScales(float[] scales) { 45369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.SET_ANIMATION_SCALE, 45379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAnimationScale()")) { 4538cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires SET_ANIMATION_SCALE permission"); 45399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 45419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scales != null) { 45429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scales.length >= 1) { 45439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowAnimationScale = fixScale(scales[0]); 45449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scales.length >= 2) { 45469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTransitionAnimationScale = fixScale(scales[1]); 45479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 454906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 45509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Persist setting 45519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.obtainMessage(H.PERSIST_ANIMATION_SCALE).sendToTarget(); 45529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 455306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 45549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float getAnimationScale(int which) { 45559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 45569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 0: return mWindowAnimationScale; 45579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 1: return mTransitionAnimationScale; 45589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 45609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 456106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 45629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float[] getAnimationScales() { 45639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new float[] { mWindowAnimationScale, mTransitionAnimationScale }; 45649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 456506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 45669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getSwitchState(int sw) { 45679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 45689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "getSwitchState()")) { 4569cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 45709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45716d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getSwitchState(-1, InputDevice.SOURCE_ANY, sw); 45729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 457306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 45749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getSwitchStateForDevice(int devid, int sw) { 45759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 45769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "getSwitchStateForDevice()")) { 4577cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 45789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45796d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getSwitchState(devid, InputDevice.SOURCE_ANY, sw); 45809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 458106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 45829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getScancodeState(int sw) { 45839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 45849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "getScancodeState()")) { 4585cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 45869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45876d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getScanCodeState(-1, InputDevice.SOURCE_ANY, sw); 45889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 458906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 45909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getScancodeStateForDevice(int devid, int sw) { 45919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 45929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "getScancodeStateForDevice()")) { 4593cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 45949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45956d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getScanCodeState(devid, InputDevice.SOURCE_ANY, sw); 45969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 459706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 45981d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn public int getTrackballScancodeState(int sw) { 45991d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 46001d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn "getTrackballScancodeState()")) { 46011d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 46021d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn } 46036d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getScanCodeState(-1, InputDevice.SOURCE_TRACKBALL, sw); 46041d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn } 46051d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn 46061d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn public int getDPadScancodeState(int sw) { 46071d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 46081d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn "getDPadScancodeState()")) { 46091d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 46101d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn } 46116d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getScanCodeState(-1, InputDevice.SOURCE_DPAD, sw); 46121d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn } 46131d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn 46149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getKeycodeState(int sw) { 46159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 46169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "getKeycodeState()")) { 4617cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 46189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46196d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_ANY, sw); 46209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 462106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 46229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getKeycodeStateForDevice(int devid, int sw) { 46239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 46249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "getKeycodeStateForDevice()")) { 4625cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 46269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46276d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getKeyCodeState(devid, InputDevice.SOURCE_ANY, sw); 46289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 462906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 46301d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn public int getTrackballKeycodeState(int sw) { 46311d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 46321d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn "getTrackballKeycodeState()")) { 46331d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 46341d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn } 46356d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_TRACKBALL, sw); 46361d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn } 46371d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn 46381d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn public int getDPadKeycodeState(int sw) { 46391d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 46401d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn "getDPadKeycodeState()")) { 46411d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 46421d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn } 46436d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_DPAD, sw); 46441d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn } 4645a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown 46469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasKeys(int[] keycodes, boolean[] keyExists) { 46476d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.hasKeys(-1, InputDevice.SOURCE_ANY, keycodes, keyExists); 46489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 464906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4650a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown public InputChannel monitorInput(String inputChannelName) { 4651a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 4652a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown "monitorInput()")) { 4653a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown throw new SecurityException("Requires READ_INPUT_STATE permission"); 4654a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown } 4655a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown return mInputManager.monitorInput(inputChannelName); 4656a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown } 4657a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown 46588d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown public InputDevice getInputDevice(int deviceId) { 46598d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown return mInputManager.getInputDevice(deviceId); 46608d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown } 46618d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 46628d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown public int[] getInputDeviceIds() { 46638d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown return mInputManager.getInputDeviceIds(); 46648d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown } 46658d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 46669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enableScreenAfterBoot() { 46679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 46689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSystemBooted) { 46699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 46709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSystemBooted = true; 46729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 467306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 46749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performEnableScreen(); 46759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 467606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 46779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enableScreenIfNeededLocked() { 46789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDisplayEnabled) { 46799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 46809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mSystemBooted) { 46829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 46839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessage(mH.obtainMessage(H.ENABLE_SCREEN)); 46859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 468606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 46879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void performEnableScreen() { 46889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 46899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDisplayEnabled) { 46909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 46919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mSystemBooted) { 46939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 46949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 469506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 46969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Don't enable the screen until all existing windows 46979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // have been drawn. 46989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mWindows.size(); 46999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 4700e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 4701f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn if (w.isVisibleLw() && !w.mObscured && !w.isDrawnLw()) { 47029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 47039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 470506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 47069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDisplayEnabled = true; 47079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 47088a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, "ENABLING SCREEN!"); 47099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringWriter sw = new StringWriter(); 47109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PrintWriter pw = new PrintWriter(sw); 47119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.dump(null, pw, null); 47128a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, sw.toString()); 47139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 47159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder surfaceFlinger = ServiceManager.getService("SurfaceFlinger"); 47169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (surfaceFlinger != null) { 47178a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "******* TELLING SURFACE FLINGER WE ARE BOOTED!"); 47189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data = Parcel.obtain(); 47199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken("android.ui.ISurfaceComposer"); 47209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project surfaceFlinger.transact(IBinder.FIRST_CALL_TRANSACTION, 47219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data, null, 0); 47229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.recycle(); 47239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 47258a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.e(TAG, "Boot completed: SurfaceFlinger is dead!"); 47269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 472806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 47299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.enableScreenAfterBoot(); 473006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 47319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make sure the last requested orientation has been applied. 4732321ae681cad03d00ad1efc6f06f74268e00172a9Dianne Hackborn setRotationUnchecked(WindowManagerPolicy.USE_LAST_ROTATION, false, 4733321ae681cad03d00ad1efc6f06f74268e00172a9Dianne Hackborn mLastRotationFlags | Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE); 47349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 473506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 47369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setInTouchMode(boolean mode) { 47379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 47389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInTouchMode = mode; 47399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47426804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick // TODO: more accounting of which pid(s) turned it on, keep count, 47436804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick // only allow disables from pids which have count on, etc. 47446804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick public void showStrictModeViolation(boolean on) { 47456804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick int pid = Binder.getCallingPid(); 47466804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick synchronized(mWindowMap) { 47476804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick // Ignoring requests to enable the red border from clients 47486804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick // which aren't on screen. (e.g. Broadcast Receivers in 47496804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick // the background..) 47506804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick if (on) { 47516804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick boolean isVisible = false; 47526804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick for (WindowState ws : mWindows) { 47536804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick if (ws.mSession.mPid == pid && ws.isVisibleLw()) { 47546804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick isVisible = true; 47556804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick break; 47566804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick } 47576804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick } 47586804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick if (!isVisible) { 47596804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick return; 47606804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick } 47616804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick } 47626804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick 476394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION showStrictModeViolation"); 47646804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick Surface.openTransaction(); 476594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn try { 476694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (mStrictModeFlash == null) { 476794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn mStrictModeFlash = new StrictModeFlash(mDisplay, mFxSession); 476894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn } 476994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn mStrictModeFlash.setVisibility(on); 477094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn } finally { 477194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn Surface.closeTransaction(); 477294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION showStrictModeViolation"); 47736804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick } 47746804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick } 47756804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick } 47766804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick 4777c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick public void setStrictModeVisualIndicatorPreference(String value) { 4778c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick SystemProperties.set(StrictMode.VISUAL_PROPERTY, value); 4779c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick } 4780c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick 4781e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller /** 4782e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller * Takes a snapshot of the screen. In landscape mode this grabs the whole screen. 4783e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller * In portrait mode, it grabs the upper region of the screen based on the vertical dimension 4784e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller * of the target image. 4785e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller * 4786e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller * @param width the width of the target bitmap 4787e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller * @param height the height of the target bitmap 4788e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller */ 4789e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller public Bitmap screenshotApplications(IBinder appToken, int width, int height) { 47900aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn if (!checkCallingPermission(android.Manifest.permission.READ_FRAME_BUFFER, 47910aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn "screenshotApplications()")) { 47920aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn throw new SecurityException("Requires READ_FRAME_BUFFER permission"); 47930aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 47940aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 47950aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn Bitmap rawss; 47960aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 4797d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn int maxLayer = 0; 47980aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn final Rect frame = new Rect(); 47990aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 48000aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn float scale; 4801e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller int dw, dh; 48020aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int rot; 48030aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 48040aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn synchronized(mWindowMap) { 48050aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn long ident = Binder.clearCallingIdentity(); 48060aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 480781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn dw = mAppDisplayWidth; 480881e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn dh = mAppDisplayHeight; 4809428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn 48100aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int aboveAppLayer = mPolicy.windowTypeToLayerLw( 48110aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn WindowManager.LayoutParams.TYPE_APPLICATION) * TYPE_LAYER_MULTIPLIER 48120aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn + TYPE_LAYER_OFFSET; 48130aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn aboveAppLayer += TYPE_LAYER_MULTIPLIER; 48140aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 4815428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn boolean isImeTarget = mInputMethodTarget != null 4816428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn && mInputMethodTarget.mAppToken != null 4817428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn && mInputMethodTarget.mAppToken.appToken != null 4818428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn && mInputMethodTarget.mAppToken.appToken.asBinder() == appToken; 4819428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn 48200aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn // Figure out the part of the screen that is actually the app. 4821428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn boolean including = false; 4822428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn for (int i=mWindows.size()-1; i>=0; i--) { 48230aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn WindowState ws = mWindows.get(i); 48240aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn if (ws.mSurface == null) { 48250aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn continue; 48260aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 48270aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn if (ws.mLayer >= aboveAppLayer) { 4828d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn continue; 4829d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn } 4830428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // When we will skip windows: when we are not including 4831428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // ones behind a window we didn't skip, and we are actually 4832428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // taking a screenshot of a specific app. 4833428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn if (!including && appToken != null) { 4834428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // Also, we can possibly skip this window if it is not 4835428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // an IME target or the application for the screenshot 4836428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // is not the current IME target. 4837428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn if (!ws.mIsImWindow || !isImeTarget) { 4838428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // And finally, this window is of no interest if it 4839428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // is not associated with the screenshot app. 4840428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn if (ws.mAppToken == null || ws.mAppToken.token != appToken) { 4841428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn continue; 4842428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn } 4843428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn } 4844428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn } 4845428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn 4846428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // We keep on including windows until we go past a full-screen 4847428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // window. 4848428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn including = !ws.mIsImWindow && !ws.isFullscreen(dw, dh); 4849428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn 4850d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn if (maxLayer < ws.mAnimLayer) { 4851d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn maxLayer = ws.mAnimLayer; 4852d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn } 48532aded18b0ef9f189771f70f05091493a44ec46aeJim Miller 48542aded18b0ef9f189771f70f05091493a44ec46aeJim Miller // Don't include wallpaper in bounds calculation 48552aded18b0ef9f189771f70f05091493a44ec46aeJim Miller if (!ws.mIsWallpaper) { 4856ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn final Rect wf = ws.mFrame; 48572aded18b0ef9f189771f70f05091493a44ec46aeJim Miller final Rect cr = ws.mContentInsets; 48582aded18b0ef9f189771f70f05091493a44ec46aeJim Miller int left = wf.left + cr.left; 48592aded18b0ef9f189771f70f05091493a44ec46aeJim Miller int top = wf.top + cr.top; 48602aded18b0ef9f189771f70f05091493a44ec46aeJim Miller int right = wf.right - cr.right; 48612aded18b0ef9f189771f70f05091493a44ec46aeJim Miller int bottom = wf.bottom - cr.bottom; 48622aded18b0ef9f189771f70f05091493a44ec46aeJim Miller frame.union(left, top, right, bottom); 48632aded18b0ef9f189771f70f05091493a44ec46aeJim Miller } 48640aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 48650aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn Binder.restoreCallingIdentity(ident); 48660aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 4867dd962ee1633b1e479bca5eae83744262fb69867fDianne Hackborn // Constrain frame to the screen size. 4868dd962ee1633b1e479bca5eae83744262fb69867fDianne Hackborn frame.intersect(0, 0, dw, dh); 4869e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller 4870cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn if (frame.isEmpty() || maxLayer == 0) { 48710aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn return null; 48720aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 48730aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 48740aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn // The screenshot API does not apply the current screen rotation. 48750aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn rot = mDisplay.getRotation(); 48760aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int fw = frame.width(); 48770aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int fh = frame.height(); 48780aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 48790aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn // First try reducing to fit in x dimension. 4880e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller scale = width/(float)fw; 48810aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 48820aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn // The screen shot will contain the entire screen. 4883428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn dw = (int)(dw*scale); 4884428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn dh = (int)(dh*scale); 48850aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn if (rot == Surface.ROTATION_90 || rot == Surface.ROTATION_270) { 48860aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int tmp = dw; 48870aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn dw = dh; 48880aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn dh = tmp; 48890aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn rot = (rot == Surface.ROTATION_90) ? Surface.ROTATION_270 : Surface.ROTATION_90; 48900aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 4891d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn rawss = Surface.screenshot(dw, dh, 0, maxLayer); 48920aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 48930aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 4894cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn if (rawss == null) { 489588b03bd2e12c10c73e455a7eccf7d1aa324049d7Dianne Hackborn Log.w(TAG, "Failure taking screenshot for (" + dw + "x" + dh 489688b03bd2e12c10c73e455a7eccf7d1aa324049d7Dianne Hackborn + ") to layer " + maxLayer); 4897cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn return null; 4898cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn } 4899e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller 4900e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller Bitmap bm = Bitmap.createBitmap(width, height, rawss.getConfig()); 49010aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn Matrix matrix = new Matrix(); 49020aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn ScreenRotationAnimation.createRotationMatrix(rot, dw, dh, matrix); 49030aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn matrix.postTranslate(-(int)(frame.left*scale), -(int)(frame.top*scale)); 49040aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn Canvas canvas = new Canvas(bm); 49050aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn canvas.drawBitmap(rawss, matrix, null); 49060aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 49070aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn rawss.recycle(); 49080aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn return bm; 49090aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 49100aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 4911b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler public void freezeRotation() { 4912b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION, 49132ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler "freezeRotation()")) { 4914b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler throw new SecurityException("Requires SET_ORIENTATION permission"); 4915b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler } 4916b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler 49172ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler if (DEBUG_ORIENTATION) Slog.v(TAG, "freezeRotation: mRotation=" + mRotation); 49182ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler 4919b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler mPolicy.setUserRotationMode(WindowManagerPolicy.USER_ROTATION_LOCKED, mRotation); 4920b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler setRotationUnchecked(WindowManagerPolicy.USE_LAST_ROTATION, false, 0); 4921b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler } 4922b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler 4923b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler public void thawRotation() { 4924b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION, 49252ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler "thawRotation()")) { 4926b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler throw new SecurityException("Requires SET_ORIENTATION permission"); 4927b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler } 4928b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler 49292ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler if (DEBUG_ORIENTATION) Slog.v(TAG, "thawRotation: mRotation=" + mRotation); 49302ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler 49312ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler mPolicy.setUserRotationMode(WindowManagerPolicy.USER_ROTATION_FREE, 777); // rot not used 4932b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler setRotationUnchecked(WindowManagerPolicy.USE_LAST_ROTATION, false, 0); 4933b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler } 4934b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler 493506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy public void setRotation(int rotation, 49361e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn boolean alwaysSendConfiguration, int animFlags) { 49379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION, 49381e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn "setRotation()")) { 4939cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires SET_ORIENTATION permission"); 49409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49421e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn setRotationUnchecked(rotation, alwaysSendConfiguration, animFlags); 49439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 494406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 49451e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn public void setRotationUnchecked(int rotation, 49461e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn boolean alwaysSendConfiguration, int animFlags) { 49478a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if(DEBUG_ORIENTATION) Slog.v(TAG, 4948910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner "setRotationUnchecked(rotation=" + rotation + 4949910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner " alwaysSendConfiguration=" + alwaysSendConfiguration + 4950910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner " animFlags=" + animFlags); 495106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 49529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long origId = Binder.clearCallingIdentity(); 49539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed; 49549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 495594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn changed = setRotationUncheckedLocked(rotation, animFlags, false); 49569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 495706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4958e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (changed || alwaysSendConfiguration) { 49599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendNewConfiguration(); 49609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 496106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 49629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 49639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 496406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4965e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn /** 4966e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * Apply a new rotation to the screen, respecting the requests of 4967e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * applications. Use WindowManagerPolicy.USE_LAST_ROTATION to simply 4968e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * re-evaluate the desired rotation. 4969e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * 4970e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * Returns null if the rotation has been changed. In this case YOU 4971e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * MUST CALL setNewConfiguration() TO UNFREEZE THE SCREEN. 4972e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn */ 497394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn public boolean setRotationUncheckedLocked(int rotation, int animFlags, boolean inTransaction) { 497489ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn if (mDragState != null || mScreenRotationAnimation != null) { 4975ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate // Potential rotation during a drag. Don't do the rotation now, but make 4976ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate // a note to perform the rotation later. 497789ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn if (DEBUG_ORIENTATION) Slog.v(TAG, "Deferring rotation."); 497889ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn if (rotation != WindowManagerPolicy.USE_LAST_ROTATION) { 497989ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn mDeferredRotation = rotation; 498089ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn mDeferredRotationAnimFlags = animFlags; 498189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn } 4982ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate return false; 4983ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate } 4984ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate 49859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed; 49869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rotation == WindowManagerPolicy.USE_LAST_ROTATION) { 498789ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn if (mDeferredRotation != WindowManagerPolicy.USE_LAST_ROTATION) { 498889ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn rotation = mDeferredRotation; 498989ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn mRequestedRotation = rotation; 499089ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn mLastRotationFlags = mDeferredRotationAnimFlags; 499189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn } 49929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rotation = mRequestedRotation; 49939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 49949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRequestedRotation = rotation; 4995321ae681cad03d00ad1efc6f06f74268e00172a9Dianne Hackborn mLastRotationFlags = animFlags; 49969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 499789ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn mDeferredRotation = WindowManagerPolicy.USE_LAST_ROTATION; 49988a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, "Overwriting rotation value from " + rotation); 4999c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project rotation = mPolicy.rotationForOrientationLw(mForcedAppOrientation, 50009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRotation, mDisplayEnabled); 50018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, "new rotation is set to " + rotation); 500268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn 500368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn int desiredRotation = rotation; 500468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn int lockedRotation = mPolicy.getLockedRotationLw(); 500568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn if (lockedRotation >= 0 && rotation != lockedRotation) { 500668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // We are locked in a rotation but something is requesting 500768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // a different rotation... we will either keep the locked 500868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // rotation if it results in the same orientation, or have to 500968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // switch into an emulated orientation mode. 501068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn 501168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // First, we know that our rotation is actually going to be 501268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // the locked rotation. 501368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn rotation = lockedRotation; 501468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn 501568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // Now the difference between the desired and lockedRotation 501668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // may mean that the orientation is different... if that is 501768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // not the case, we can just make the desired rotation be the 501868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // same as the new locked rotation. 501968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn switch (lockedRotation) { 502068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn case Surface.ROTATION_0: 502168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn if (rotation == Surface.ROTATION_180) { 502268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn desiredRotation = lockedRotation; 502368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn } 502468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn break; 502568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn case Surface.ROTATION_90: 502668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn if (rotation == Surface.ROTATION_270) { 502768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn desiredRotation = lockedRotation; 502868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn } 502968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn break; 503068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn case Surface.ROTATION_180: 503168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn if (rotation == Surface.ROTATION_0) { 503268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn desiredRotation = lockedRotation; 503368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn } 503468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn break; 503568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn case Surface.ROTATION_270: 503668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn if (rotation == Surface.ROTATION_90) { 503768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn desiredRotation = lockedRotation; 503868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn } 503968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn break; 504068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn } 504168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn } 504268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn 50439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = mDisplayEnabled && mRotation != rotation; 504468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn if (mAltOrientation != (rotation != desiredRotation)) { 504568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn changed = true; 504668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn mAltOrientation = rotation != desiredRotation; 504768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn } 504806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 50499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (changed) { 50508a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, 50519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Rotation changed to " + rotation 50529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " from " + mRotation 50539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " (forceApp=" + mForcedAppOrientation 50549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", req=" + mRequestedRotation + ")"); 50559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRotation = rotation; 50569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowsFreezingScreen = true; 50579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT); 50589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessageDelayed(mH.obtainMessage(H.WINDOW_FREEZE_TIMEOUT), 50599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2000); 5060e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn mWaitingForConfig = true; 5061e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn mLayoutNeeded = true; 506294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn startFreezingDisplayLocked(inTransaction); 50635fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn //Slog.i(TAG, "Setting rotation to " + rotation + ", animFlags=" + animFlags); 506400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputManager.setDisplayOrientation(0, rotation); 50659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDisplayEnabled) { 5066910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner // NOTE: We disable the rotation in the emulator because 5067910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner // it doesn't support hardware OpenGL emulation yet. 5068de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (CUSTOM_SCREEN_ROTATION && mScreenRotationAnimation != null 5069de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn && mScreenRotationAnimation.hasScreenshot()) { 5070a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn Surface.freezeDisplay(0); 507194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (!inTransaction) { 507294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, 507394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn ">>> OPEN TRANSACTION setRotationUnchecked"); 507494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn Surface.openTransaction(); 507594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn } 507694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn try { 507794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (mScreenRotationAnimation != null) { 507894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn mScreenRotationAnimation.setRotation(rotation); 507994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn } 508094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn } finally { 508194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (!inTransaction) { 508294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn Surface.closeTransaction(); 508394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, 508494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn "<<< CLOSE TRANSACTION setRotationUnchecked"); 508594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn } 5086a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn } 5087a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn Surface.setOrientation(0, rotation, animFlags); 5088a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn Surface.unfreezeDisplay(0); 5089a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn } else { 5090a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn Surface.setOrientation(0, rotation, animFlags); 5091a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn } 50927916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn rebuildBlackFrame(inTransaction); 50939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 509468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn 50959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=mWindows.size()-1; i>=0; i--) { 5096e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 50979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mSurface != null) { 50989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mOrientationChanging = true; 50999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=mRotationWatchers.size()-1; i>=0; i--) { 51029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 51039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRotationWatchers.get(i).onRotationChanged(rotation); 51049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 51059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } //end if changed 510806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 51099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return changed; 51109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 511106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 51129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getRotation() { 51139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mRotation; 51149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int watchRotation(IRotationWatcher watcher) { 51179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IBinder watcherBinder = watcher.asBinder(); 51189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder.DeathRecipient dr = new IBinder.DeathRecipient() { 51199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void binderDied() { 51209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 51219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<mRotationWatchers.size(); i++) { 51229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (watcherBinder == mRotationWatchers.get(i).asBinder()) { 5123fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu IRotationWatcher removed = mRotationWatchers.remove(i); 5124fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu if (removed != null) { 5125fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu removed.asBinder().unlinkToDeath(this, 0); 5126fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu } 51279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 51289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 513306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 51349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 51359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 51369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project watcher.asBinder().linkToDeath(dr, 0); 51379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRotationWatchers.add(watcher); 51389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 51399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Client died, no cleanup needed. 51409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 514106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 51429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mRotation; 51439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 51479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Starts the view server on the specified port. 51489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 51499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param port The port to listener to. 51509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 51519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if the server was successfully started, false otherwise. 51529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5153a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn * @see com.android.server.wm.ViewServer 5154a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn * @see com.android.server.wm.ViewServer#VIEW_SERVER_DEFAULT_PORT 51559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 51569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean startViewServer(int port) { 515706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy if (isSystemSecure()) { 51589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 51599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(Manifest.permission.DUMP, "startViewServer")) { 51629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 51639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (port < 1024) { 51669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 51679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mViewServer != null) { 51709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mViewServer.isRunning()) { 51719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 51729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mViewServer.start(); 51739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 51748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "View server did not start"); 51759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 51789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 51819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mViewServer = new ViewServer(this, port); 51829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mViewServer.start(); 51839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 51848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "View server did not start"); 51859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 51879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 518906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy private boolean isSystemSecure() { 519006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy return "1".equals(SystemProperties.get(SYSTEM_SECURE, "1")) && 519106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy "0".equals(SystemProperties.get(SYSTEM_DEBUGGABLE, "0")); 519206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy } 519306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 51949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 51959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Stops the view server if it exists. 51969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 51979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if the server stopped, false if it wasn't started or 51989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * couldn't be stopped. 51999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5200a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn * @see com.android.server.wm.ViewServer 52019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 52029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean stopViewServer() { 520306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy if (isSystemSecure()) { 52049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 52059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(Manifest.permission.DUMP, "stopViewServer")) { 52089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 52099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mViewServer != null) { 52129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mViewServer.stop(); 52139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 52159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 52189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates whether the view server is running. 52199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 52209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if the server is running, false otherwise. 52219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5222a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn * @see com.android.server.wm.ViewServer 52239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 52249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isViewServerRunning() { 522506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy if (isSystemSecure()) { 52269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 52279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(Manifest.permission.DUMP, "isViewServerRunning")) { 52309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 52319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mViewServer != null && mViewServer.isRunning(); 52349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 52379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all availble windows in the system. The listing is written in the 52389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specified Socket's output stream with the following syntax: 52399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * windowHashCodeInHexadecimal windowName 52409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Each line of the ouput represents a different window. 52419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 52429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param client The remote client to send the listing to. 52439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return False if an error occured, true otherwise. 52449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 52459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean viewServerListWindows(Socket client) { 524606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy if (isSystemSecure()) { 52479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 52489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean result = true; 52519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5252e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState[] windows; 52539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 52549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //noinspection unchecked 5255e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown windows = mWindows.toArray(new WindowState[mWindows.size()]); 52569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BufferedWriter out = null; 52599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Any uncaught exception will crash the system process 52619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 52629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OutputStream clientStream = client.getOutputStream(); 52639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out = new BufferedWriter(new OutputStreamWriter(clientStream), 8 * 1024); 52649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = windows.length; 52669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 5267e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown final WindowState w = windows[i]; 52689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.write(Integer.toHexString(System.identityHashCode(w))); 52699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.write(' '); 52709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append(w.mAttrs.getTitle()); 52719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.write('\n'); 52729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.write("DONE.\n"); 52759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.flush(); 52769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 52779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = false; 52789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 52799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out != null) { 52809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 52819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.close(); 52829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 52839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = false; 52849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 52899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5292f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev * Returns the focused window in the following format: 5293f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev * windowHashCodeInHexadecimal windowName 5294f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev * 5295f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev * @param client The remote client to send the listing to. 5296f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev * @return False if an error occurred, true otherwise. 5297f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev */ 5298f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev boolean viewServerGetFocusedWindow(Socket client) { 5299f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev if (isSystemSecure()) { 5300f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev return false; 5301f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev } 5302f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev 5303f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev boolean result = true; 5304f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev 5305f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev WindowState focusedWindow = getFocusedWindow(); 5306f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev 5307f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev BufferedWriter out = null; 5308f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev 5309f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev // Any uncaught exception will crash the system process 5310f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev try { 5311f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev OutputStream clientStream = client.getOutputStream(); 5312f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev out = new BufferedWriter(new OutputStreamWriter(clientStream), 8 * 1024); 5313f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev 5314f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev if(focusedWindow != null) { 5315f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev out.write(Integer.toHexString(System.identityHashCode(focusedWindow))); 5316f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev out.write(' '); 5317f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev out.append(focusedWindow.mAttrs.getTitle()); 5318f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev } 5319f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev out.write('\n'); 5320f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev out.flush(); 5321f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev } catch (Exception e) { 5322f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev result = false; 53239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 53249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out != null) { 53259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 53269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.close(); 53279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 53289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = false; 53299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 53349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 53379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sends a command to a target window. The result of the command, if any, will be 53389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * written in the output stream of the specified socket. 53399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 53409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The parameters must follow this syntax: 53419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * windowHashcode extra 53429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 53439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Where XX is the length in characeters of the windowTitle. 53449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 53459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The first parameter is the target window. The window with the specified hashcode 53469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be the target. If no target can be found, nothing happens. The extra parameters 53479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be delivered to the target window and as parameters to the command itself. 53489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 53499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param client The remote client to sent the result, if any, to. 53509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param command The command to execute. 53519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parameters The command parameters. 53529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 53539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if the command was successfully delivered, false otherwise. This does 53549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not indicate whether the command itself was successful. 53559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 53569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean viewServerWindowCommand(Socket client, String command, String parameters) { 535706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy if (isSystemSecure()) { 53589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 53599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean success = true; 53629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data = null; 53639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel reply = null; 53649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 536543b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev BufferedWriter out = null; 536643b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev 53679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Any uncaught exception will crash the system process 53689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 53699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Find the hashcode of the window 53709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = parameters.indexOf(' '); 53719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index == -1) { 53729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = parameters.length(); 53739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String code = parameters.substring(0, index); 5375236092a36216c79507ec19eb207831810caced19Romain Guy int hashCode = (int) Long.parseLong(code, 16); 53769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Extract the command's parameter after the window description 53789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index < parameters.length()) { 53799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parameters = parameters.substring(index + 1); 53809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 53819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parameters = ""; 53829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final WindowState window = findWindow(hashCode); 53859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (window == null) { 53869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 53879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = Parcel.obtain(); 53909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken("android.view.IWindow"); 53919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeString(command); 53929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeString(parameters); 53939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt(1); 53949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ParcelFileDescriptor.fromSocket(client).writeToParcel(data, 0); 53959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply = Parcel.obtain(); 53979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IBinder binder = window.mClient.asBinder(); 53999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: GET THE TRANSACTION CODE IN A SAFER MANNER 54009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project binder.transact(IBinder.FIRST_CALL_TRANSACTION, data, reply, 0); 54019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.readException(); 54039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 540443b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev if (!client.isOutputShutdown()) { 540543b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 540643b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev out.write("DONE\n"); 540743b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev out.flush(); 540843b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev } 540943b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev 54109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 54118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Could not send command " + command + " with parameters " + parameters, e); 54129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project success = false; 54139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 54149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (data != null) { 54159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.recycle(); 54169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (reply != null) { 54189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.recycle(); 54199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 542043b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev if (out != null) { 542143b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev try { 542243b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev out.close(); 542343b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev } catch (IOException e) { 542443b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev 542543b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev } 542643b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev } 54279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return success; 54309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5432dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev public void addWindowChangeListener(WindowChangeListener listener) { 5433dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev synchronized(mWindowMap) { 5434dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowChangeListeners.add(listener); 5435dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 5436dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 5437dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev 5438dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev public void removeWindowChangeListener(WindowChangeListener listener) { 5439dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev synchronized(mWindowMap) { 5440dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowChangeListeners.remove(listener); 5441dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 5442dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 5443dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev 5444dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev private void notifyWindowsChanged() { 5445dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev WindowChangeListener[] windowChangeListeners; 5446dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev synchronized(mWindowMap) { 5447dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev if(mWindowChangeListeners.isEmpty()) { 5448dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev return; 5449dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 5450dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev windowChangeListeners = new WindowChangeListener[mWindowChangeListeners.size()]; 5451dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev windowChangeListeners = mWindowChangeListeners.toArray(windowChangeListeners); 5452dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 5453dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev int N = windowChangeListeners.length; 5454dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev for(int i = 0; i < N; i++) { 5455dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev windowChangeListeners[i].windowsChanged(); 5456dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 5457dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 5458dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev 54596e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev private void notifyFocusChanged() { 54606e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev WindowChangeListener[] windowChangeListeners; 54616e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev synchronized(mWindowMap) { 54626e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev if(mWindowChangeListeners.isEmpty()) { 54636e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev return; 54646e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev } 54656e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev windowChangeListeners = new WindowChangeListener[mWindowChangeListeners.size()]; 54666e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev windowChangeListeners = mWindowChangeListeners.toArray(windowChangeListeners); 54676e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev } 54686e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev int N = windowChangeListeners.length; 54696e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev for(int i = 0; i < N; i++) { 54706e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev windowChangeListeners[i].focusChanged(); 54716e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev } 54726e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev } 54736e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev 54749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WindowState findWindow(int hashCode) { 54759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hashCode == -1) { 54769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getFocusedWindow(); 54779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 5480e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown final ArrayList<WindowState> windows = mWindows; 54819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = windows.size(); 54829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 5484e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = windows.get(i); 54859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (System.identityHashCode(w) == hashCode) { 54869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return w; 54879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 54929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 54959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Instruct the Activity Manager to fetch the current configuration and broadcast 54969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that to config-changed listeners if appropriate. 54979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 54989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void sendNewConfiguration() { 54999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 55009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityManager.updateConfiguration(null); 55019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 55029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 550406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 55059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Configuration computeNewConfiguration() { 55069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 550794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn Configuration config = computeNewConfigurationLocked(); 550894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (config == null && mWaitingForConfig) { 550994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn // Nothing changed but we are waiting for something... stop that! 551094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn mWaitingForConfig = false; 551194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn performLayoutAndPlaceSurfacesLocked(); 551294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn } 551394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn return config; 5514c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn } 5515c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn } 551606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 5517c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn Configuration computeNewConfigurationLocked() { 5518c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn Configuration config = new Configuration(); 5519c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn if (!computeNewConfigurationLocked(config)) { 5520c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn return null; 5521c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn } 5522c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn return config; 5523c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn } 552406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 552569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn private int reduceConfigWidthSize(int curSize, int rotation, float density, int dw) { 552669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn int size = (int)(mPolicy.getConfigDisplayWidth(rotation, dw) / density); 552769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (size < curSize) { 552869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn curSize = size; 552969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 553069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn return curSize; 553169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 553269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn 55335fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn private int computeSmallestWidth(boolean rotated, int dw, int dh, float density) { 55345fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn // We need to determine the smallest width that will occur under normal 55355fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn // operation. To this, start with the base screen size and compute the 55365fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn // width under the different possible rotations. We need to un-rotate 55375fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn // the current screen dimensions before doing this. 55385fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn int unrotDw, unrotDh; 55395fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (rotated) { 55405fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn unrotDw = dh; 55415fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn unrotDh = dw; 55425fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } else { 55435fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn unrotDw = dw; 55445fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn unrotDh = dh; 55455fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } 55465fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn int sw = reduceConfigWidthSize(unrotDw, Surface.ROTATION_0, density, unrotDw); 55475fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn sw = reduceConfigWidthSize(sw, Surface.ROTATION_90, density, unrotDh); 55485fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn sw = reduceConfigWidthSize(sw, Surface.ROTATION_180, density, unrotDw); 55495fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn sw = reduceConfigWidthSize(sw, Surface.ROTATION_270, density, unrotDh); 55505fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn return sw; 55515fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } 55525fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn 555348a7651823030ed3c0f4c084b423430044425feaDianne Hackborn private int reduceCompatConfigWidthSize(int curSize, int rotation, DisplayMetrics dm, 555448a7651823030ed3c0f4c084b423430044425feaDianne Hackborn int dw, int dh) { 555548a7651823030ed3c0f4c084b423430044425feaDianne Hackborn dm.unscaledWidthPixels = mPolicy.getNonDecorDisplayWidth(rotation, dw); 555648a7651823030ed3c0f4c084b423430044425feaDianne Hackborn dm.unscaledHeightPixels = mPolicy.getNonDecorDisplayHeight(rotation, dh); 555748a7651823030ed3c0f4c084b423430044425feaDianne Hackborn float scale = CompatibilityInfo.computeCompatibleScaling(dm, null); 555848a7651823030ed3c0f4c084b423430044425feaDianne Hackborn int size = (int)(((dm.unscaledWidthPixels / scale) / dm.density) + .5f); 555948a7651823030ed3c0f4c084b423430044425feaDianne Hackborn if (curSize == 0 || size < curSize) { 556048a7651823030ed3c0f4c084b423430044425feaDianne Hackborn curSize = size; 556148a7651823030ed3c0f4c084b423430044425feaDianne Hackborn } 556248a7651823030ed3c0f4c084b423430044425feaDianne Hackborn return curSize; 556348a7651823030ed3c0f4c084b423430044425feaDianne Hackborn } 556448a7651823030ed3c0f4c084b423430044425feaDianne Hackborn 556548a7651823030ed3c0f4c084b423430044425feaDianne Hackborn private int computeCompatSmallestWidth(boolean rotated, DisplayMetrics dm, int dw, int dh) { 556648a7651823030ed3c0f4c084b423430044425feaDianne Hackborn mTmpDisplayMetrics.setTo(dm); 556748a7651823030ed3c0f4c084b423430044425feaDianne Hackborn dm = mTmpDisplayMetrics; 556848a7651823030ed3c0f4c084b423430044425feaDianne Hackborn int unrotDw, unrotDh; 556948a7651823030ed3c0f4c084b423430044425feaDianne Hackborn if (rotated) { 557048a7651823030ed3c0f4c084b423430044425feaDianne Hackborn unrotDw = dh; 557148a7651823030ed3c0f4c084b423430044425feaDianne Hackborn unrotDh = dw; 557248a7651823030ed3c0f4c084b423430044425feaDianne Hackborn } else { 557348a7651823030ed3c0f4c084b423430044425feaDianne Hackborn unrotDw = dw; 557448a7651823030ed3c0f4c084b423430044425feaDianne Hackborn unrotDh = dh; 557548a7651823030ed3c0f4c084b423430044425feaDianne Hackborn } 557648a7651823030ed3c0f4c084b423430044425feaDianne Hackborn int sw = reduceCompatConfigWidthSize(0, Surface.ROTATION_0, dm, unrotDw, unrotDh); 557748a7651823030ed3c0f4c084b423430044425feaDianne Hackborn sw = reduceCompatConfigWidthSize(sw, Surface.ROTATION_90, dm, unrotDh, unrotDw); 557848a7651823030ed3c0f4c084b423430044425feaDianne Hackborn sw = reduceCompatConfigWidthSize(sw, Surface.ROTATION_180, dm, unrotDw, unrotDh); 557948a7651823030ed3c0f4c084b423430044425feaDianne Hackborn sw = reduceCompatConfigWidthSize(sw, Surface.ROTATION_270, dm, unrotDh, unrotDw); 558048a7651823030ed3c0f4c084b423430044425feaDianne Hackborn return sw; 558148a7651823030ed3c0f4c084b423430044425feaDianne Hackborn } 558248a7651823030ed3c0f4c084b423430044425feaDianne Hackborn 5583c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn boolean computeNewConfigurationLocked(Configuration config) { 5584c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn if (mDisplay == null) { 5585c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn return false; 55869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 558700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 558800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputManager.getInputConfiguration(config); 5589b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate 5590b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate // Use the effective "visual" dimensions based on current rotation 5591b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate final boolean rotated = (mRotation == Surface.ROTATION_90 5592b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate || mRotation == Surface.ROTATION_270); 55937916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn final int realdw = rotated ? mBaseDisplayHeight : mBaseDisplayWidth; 55947916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn final int realdh = rotated ? mBaseDisplayWidth : mBaseDisplayHeight; 559568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn 559668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn if (mAltOrientation) { 559768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn mCurDisplayWidth = realdw; 559868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn mCurDisplayHeight = realdh; 559968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn if (realdw > realdh) { 560068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // Turn landscape into portrait. 560168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn int maxw = (int)(realdh/1.3f); 560268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn if (maxw < realdw) { 560368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn mCurDisplayWidth = maxw; 560468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn } 560568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn } else { 560668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // Turn portrait into landscape. 560768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn int maxh = (int)(realdw/1.3f); 560868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn if (maxh < realdh) { 560968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn mCurDisplayHeight = maxh; 561068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn } 561168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn } 561268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn } else { 561368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn mCurDisplayWidth = realdw; 561468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn mCurDisplayHeight = realdh; 561568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn } 561668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn 561768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn final int dw = mCurDisplayWidth; 561868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn final int dh = mCurDisplayHeight; 5619b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate 5620c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn int orientation = Configuration.ORIENTATION_SQUARE; 5621c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn if (dw < dh) { 5622c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn orientation = Configuration.ORIENTATION_PORTRAIT; 5623c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn } else if (dw > dh) { 5624c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn orientation = Configuration.ORIENTATION_LANDSCAPE; 5625c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn } 5626c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn config.orientation = orientation; 5627ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 56285fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn DisplayMetrics dm = mDisplayMetrics; 562968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn mDisplay.getRealMetrics(dm); 563068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn 563168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // Override display width and height with what we are computing, 563268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // to be sure they remain consistent. 563381e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn dm.widthPixels = dm.unscaledWidthPixels = mAppDisplayWidth 563481e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn = mPolicy.getNonDecorDisplayWidth(mRotation, dw); 563581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn dm.heightPixels = dm.unscaledHeightPixels = mAppDisplayHeight 563681e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn = mPolicy.getNonDecorDisplayHeight(mRotation, dh); 563768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn 56385fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn mCompatibleScreenScale = CompatibilityInfo.computeCompatibleScaling(dm, 56395fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn mCompatDisplayMetrics); 56401ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima 564169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn config.screenWidthDp = (int)(mPolicy.getConfigDisplayWidth(mRotation, dw) / dm.density); 564269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn config.screenHeightDp = (int)(mPolicy.getConfigDisplayHeight(mRotation, dh) / dm.density); 56435fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn config.smallestScreenWidthDp = computeSmallestWidth(rotated, dw, dh, dm.density); 56445fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn 56455fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn config.compatScreenWidthDp = (int)(config.screenWidthDp / mCompatibleScreenScale); 56465fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn config.compatScreenHeightDp = (int)(config.screenHeightDp / mCompatibleScreenScale); 564748a7651823030ed3c0f4c084b423430044425feaDianne Hackborn config.compatSmallestScreenWidthDp = computeCompatSmallestWidth(rotated, dm, dw, dh); 564869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn 564969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn // We need to determine the smallest width that will occur under normal 565069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn // operation. To this, start with the base screen size and compute the 565169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn // width under the different possible rotations. We need to un-rotate 565269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn // the current screen dimensions before doing this. 565369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn int unrotDw, unrotDh; 565469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (rotated) { 565569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn unrotDw = dh; 565669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn unrotDh = dw; 565769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } else { 565869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn unrotDw = dw; 565969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn unrotDh = dh; 566069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 566169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn config.smallestScreenWidthDp = reduceConfigWidthSize(unrotDw, 566269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn Surface.ROTATION_0, dm.density, unrotDw); 566369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn config.smallestScreenWidthDp = reduceConfigWidthSize(config.smallestScreenWidthDp, 566469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn Surface.ROTATION_90, dm.density, unrotDh); 566569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn config.smallestScreenWidthDp = reduceConfigWidthSize(config.smallestScreenWidthDp, 566669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn Surface.ROTATION_180, dm.density, unrotDw); 566769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn config.smallestScreenWidthDp = reduceConfigWidthSize(config.smallestScreenWidthDp, 566869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn Surface.ROTATION_270, dm.density, unrotDh); 5669ebff8f92f13513ce37bd74759eb1db63f2220590Dianne Hackborn 567068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // Compute the screen layout size class. 567168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn int screenLayout; 567268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn int longSize = dw; 567368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn int shortSize = dh; 567468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn if (longSize < shortSize) { 567568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn int tmp = longSize; 567668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn longSize = shortSize; 567768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn shortSize = tmp; 567868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn } 567968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn longSize = (int)(longSize/dm.density); 568068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn shortSize = (int)(shortSize/dm.density); 568168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn 568268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // These semi-magic numbers define our compatibility modes for 568368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // applications with different screens. These are guarantees to 568468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // app developers about the space they can expect for a particular 568568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // configuration. DO NOT CHANGE! 568668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn if (longSize < 470) { 568768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // This is shorter than an HVGA normal density screen (which 568868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // is 480 pixels on its long side). 568968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn screenLayout = Configuration.SCREENLAYOUT_SIZE_SMALL 569068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn | Configuration.SCREENLAYOUT_LONG_NO; 569168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn } else { 569268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // What size is this screen screen? 569368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn if (longSize >= 960 && shortSize >= 720) { 569468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // 1.5xVGA or larger screens at medium density are the point 569568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // at which we consider it to be an extra large screen. 569668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn screenLayout = Configuration.SCREENLAYOUT_SIZE_XLARGE; 569768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn } else if (longSize >= 640 && shortSize >= 480) { 569868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // VGA or larger screens at medium density are the point 569968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // at which we consider it to be a large screen. 570068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn screenLayout = Configuration.SCREENLAYOUT_SIZE_LARGE; 5701723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } else { 570268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn screenLayout = Configuration.SCREENLAYOUT_SIZE_NORMAL; 570368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn } 5704ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 570568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // If this screen is wider than normal HVGA, or taller 570668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // than FWVGA, then for old apps we want to run in size 570768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // compatibility mode. 570868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn if (shortSize > 321 || longSize > 570) { 570968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn screenLayout |= Configuration.SCREENLAYOUT_COMPAT_NEEDED; 571068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn } 571168066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn 571268066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // Is this a long screen? 571368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn if (((longSize*3)/5) >= (shortSize-1)) { 571468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn // Anything wider than WVGA (5:3) is considering to be long. 571568066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn screenLayout |= Configuration.SCREENLAYOUT_LONG_YES; 571668066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn } else { 571768066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn screenLayout |= Configuration.SCREENLAYOUT_LONG_NO; 5718723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } 5719723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } 572068066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn config.screenLayout = screenLayout; 5721ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 5722597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown // Determine whether a hard keyboard is available and enabled. 57232992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown boolean hardKeyboardAvailable = config.keyboard != Configuration.KEYBOARD_NOKEYS; 57242992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown if (hardKeyboardAvailable != mHardKeyboardAvailable) { 57252992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mHardKeyboardAvailable = hardKeyboardAvailable; 57262992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mHardKeyboardEnabled = hardKeyboardAvailable; 57272992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 57282992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mH.removeMessages(H.REPORT_HARD_KEYBOARD_STATUS_CHANGE); 57292992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mH.sendEmptyMessage(H.REPORT_HARD_KEYBOARD_STATUS_CHANGE); 57302992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 57312992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown if (!mHardKeyboardEnabled) { 57322992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown config.keyboard = Configuration.KEYBOARD_NOKEYS; 57332992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 5734597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown 5735597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown // Update value of keyboardHidden, hardKeyboardHidden and navigationHidden 5736597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown // based on whether a hard or soft keyboard is present, whether navigation keys 5737597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown // are present and the lid switch state. 5738597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown config.keyboardHidden = Configuration.KEYBOARDHIDDEN_NO; 5739597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_NO; 5740597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown config.navigationHidden = Configuration.NAVIGATIONHIDDEN_NO; 5741597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown mPolicy.adjustConfigurationLw(config); 5742c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn return true; 57439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5744a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 57452992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown public boolean isHardKeyboardAvailable() { 57462992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown synchronized (mWindowMap) { 57472992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown return mHardKeyboardAvailable; 57482992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 57492992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 57502992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 57512992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown public boolean isHardKeyboardEnabled() { 57522992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown synchronized (mWindowMap) { 57532992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown return mHardKeyboardEnabled; 57542992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 57552992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 57562992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 57572992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown public void setHardKeyboardEnabled(boolean enabled) { 57582992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown synchronized (mWindowMap) { 57592992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown if (mHardKeyboardEnabled != enabled) { 57602992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mHardKeyboardEnabled = enabled; 57612992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION); 57622992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 57632992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 57642992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 57652992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 57662992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown public void setOnHardKeyboardStatusChangeListener( 57672992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown OnHardKeyboardStatusChangeListener listener) { 57682992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown synchronized (mWindowMap) { 57692992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mHardKeyboardStatusChangeListener = listener; 57702992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 57712992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 57722992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 57732992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown void notifyHardKeyboardStatusChange() { 57742992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown final boolean available, enabled; 57752992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown final OnHardKeyboardStatusChangeListener listener; 57762992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown synchronized (mWindowMap) { 57772992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown listener = mHardKeyboardStatusChangeListener; 57782992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown available = mHardKeyboardAvailable; 57792992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown enabled = mHardKeyboardEnabled; 57802992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 57812992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown if (listener != null) { 57822992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown listener.onHardKeyboardStatusChange(available, enabled); 57832992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 57842992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 57852992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 5786a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate // ------------------------------------------------------------- 5787a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate // Drag and drop 5788a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate // ------------------------------------------------------------- 5789a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 5790a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate IBinder prepareDragSurface(IWindow window, SurfaceSession session, 579102d2b3ba9ba830a8147db2739613f7bbb2d0fcbfChristopher Tate int flags, int width, int height, Surface outSurface) { 5792a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (DEBUG_DRAG) { 5793a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate Slog.d(TAG, "prepare drag surface: w=" + width + " h=" + height 579402d2b3ba9ba830a8147db2739613f7bbb2d0fcbfChristopher Tate + " flags=" + Integer.toHexString(flags) + " win=" + window 5795a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate + " asbinder=" + window.asBinder()); 5796a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 5797a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 5798a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate final int callerPid = Binder.getCallingPid(); 5799a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate final long origId = Binder.clearCallingIdentity(); 5800a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate IBinder token = null; 5801a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 5802a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate try { 5803a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate synchronized (mWindowMap) { 5804a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate try { 5805a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (mDragState == null) { 5806a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate Surface surface = new Surface(session, callerPid, "drag surface", 0, 5807a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate width, height, PixelFormat.TRANSLUCENT, Surface.HIDDEN); 5808ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, " DRAG " 5809ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn + surface + ": CREATE"); 5810a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate outSurface.copyFrom(surface); 58117b362e431f3e17a755e56bc7dbc99bd661cb46baChris Tate final IBinder winBinder = window.asBinder(); 5812a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate token = new Binder(); 58136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mDragState = new DragState(this, token, surface, /*flags*/ 0, winBinder); 5814a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate mDragState.mSurface = surface; 5815a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate token = mDragState.mToken = new Binder(); 5816a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 5817a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate // 5 second timeout for this window to actually begin the drag 58187b362e431f3e17a755e56bc7dbc99bd661cb46baChris Tate mH.removeMessages(H.DRAG_START_TIMEOUT, winBinder); 58197b362e431f3e17a755e56bc7dbc99bd661cb46baChris Tate Message msg = mH.obtainMessage(H.DRAG_START_TIMEOUT, winBinder); 5820a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate mH.sendMessageDelayed(msg, 5000); 5821a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } else { 5822a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate Slog.w(TAG, "Drag already in progress"); 5823a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 5824a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } catch (Surface.OutOfResourcesException e) { 5825a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate Slog.e(TAG, "Can't allocate drag surface w=" + width + " h=" + height, e); 5826a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (mDragState != null) { 5827a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate mDragState.reset(); 5828a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate mDragState = null; 5829a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 5830a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 5831a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 5832a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } finally { 5833a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate Binder.restoreCallingIdentity(origId); 5834a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 5835a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 5836a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate return token; 5837a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 5838a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 58399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 58409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Input Events and Focus Management 58419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 584246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 58436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final InputMonitor mInputMonitor = new InputMonitor(this); 58447fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 58459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void pauseKeyDispatching(IBinder _token) { 58469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 58479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "pauseKeyDispatching()")) { 5848cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 58499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 585006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 58519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 58529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken token = mTokenMap.get(_token); 58539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token != null) { 585400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputMonitor.pauseDispatchingLw(token); 58559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 58569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 58579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5858ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 58599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void resumeKeyDispatching(IBinder _token) { 58609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 58619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "resumeKeyDispatching()")) { 5862cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 5863e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan } 5864e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan 58659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 58669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken token = mTokenMap.get(_token); 58679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token != null) { 586800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputMonitor.resumeDispatchingLw(token); 5869e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan } 5870e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan } 58719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5872e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan 58739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setEventDispatching(boolean enabled) { 58749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 58759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "resumeKeyDispatching()")) { 5876cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 58779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 587806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 58799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 588000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputMonitor.setEventDispatchingLw(enabled); 58819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 58829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 588306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 58849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 58859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Injects a keystroke event into the UI. 5886bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * Even when sync is false, this method may block while waiting for current 5887bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * input events to be dispatched. 588806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * 588906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * @param ev A motion event describing the keystroke action. (Be sure to use 58909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link SystemClock#uptimeMillis()} as the timebase.) 58919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sync If true, wait for the event to be completed before returning to the caller. 58929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if event was dispatched, false if it was dropped for any reason 58939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 58949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean injectKeyEvent(KeyEvent ev, boolean sync) { 58959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long downTime = ev.getDownTime(); 58969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long eventTime = ev.getEventTime(); 589706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 58989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int action = ev.getAction(); 58999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int code = ev.getKeyCode(); 59009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int repeatCount = ev.getRepeatCount(); 59019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int metaState = ev.getMetaState(); 59029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int deviceId = ev.getDeviceId(); 59039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int scancode = ev.getScanCode(); 5904c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown int source = ev.getSource(); 5905c6ded10dd1ee08c887d0e81d683a7611fbe3ca4dMike Playle int flags = ev.getFlags(); 5906c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 5907c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown if (source == InputDevice.SOURCE_UNKNOWN) { 5908c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown source = InputDevice.SOURCE_KEYBOARD; 5909c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown } 591006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 59119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (eventTime == 0) eventTime = SystemClock.uptimeMillis(); 59129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (downTime == 0) downTime = eventTime; 591306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 59149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project KeyEvent newEvent = new KeyEvent(downTime, eventTime, action, code, repeatCount, metaState, 59154a88013a4a06a9ea80e8419f94694936e6b013f0Jean-Baptiste Queru deviceId, scancode, flags | KeyEvent.FLAG_FROM_SYSTEM, source); 591606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 59172bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final int pid = Binder.getCallingPid(); 59182bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final int uid = Binder.getCallingUid(); 59192bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final long ident = Binder.clearCallingIdentity(); 592046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 5921bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown final int result = mInputManager.injectInputEvent(newEvent, pid, uid, 5922bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown sync ? InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISH 5923bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown : InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT, 5924bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown INJECTION_TIMEOUT_MILLIS); 592546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 59262bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn Binder.restoreCallingIdentity(ident); 59277fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown return reportInjectionResult(result); 59289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 59299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 59309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 59319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inject a pointer (touch) event into the UI. 5932bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * Even when sync is false, this method may block while waiting for current 5933bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * input events to be dispatched. 593406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * 593506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * @param ev A motion event describing the pointer (touch) action. (As noted in 593606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * {@link MotionEvent#obtain(long, long, int, float, float, int)}, be sure to use 59379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link SystemClock#uptimeMillis()} as the timebase.) 59389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sync If true, wait for the event to be completed before returning to the caller. 59399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if event was dispatched, false if it was dropped for any reason 59409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 59419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean injectPointerEvent(MotionEvent ev, boolean sync) { 59422bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final int pid = Binder.getCallingPid(); 59432bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final int uid = Binder.getCallingUid(); 59442bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final long ident = Binder.clearCallingIdentity(); 594546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 5946c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown MotionEvent newEvent = MotionEvent.obtain(ev); 5947c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown if ((newEvent.getSource() & InputDevice.SOURCE_CLASS_POINTER) == 0) { 5948c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown newEvent.setSource(InputDevice.SOURCE_TOUCHSCREEN); 5949c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown } 5950c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 5951bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown final int result = mInputManager.injectInputEvent(newEvent, pid, uid, 5952bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown sync ? InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISH 5953bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown : InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT, 5954bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown INJECTION_TIMEOUT_MILLIS); 595546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 59562bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn Binder.restoreCallingIdentity(ident); 59577fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown return reportInjectionResult(result); 59589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 595906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 59609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 59619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inject a trackball (navigation device) event into the UI. 5962bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * Even when sync is false, this method may block while waiting for current 5963bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * input events to be dispatched. 596406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * 596506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * @param ev A motion event describing the trackball action. (As noted in 596606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * {@link MotionEvent#obtain(long, long, int, float, float, int)}, be sure to use 59679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link SystemClock#uptimeMillis()} as the timebase.) 59689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sync If true, wait for the event to be completed before returning to the caller. 59699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if event was dispatched, false if it was dropped for any reason 59709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 59719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean injectTrackballEvent(MotionEvent ev, boolean sync) { 59722bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final int pid = Binder.getCallingPid(); 59732bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final int uid = Binder.getCallingUid(); 59742bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final long ident = Binder.clearCallingIdentity(); 597546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 5976c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown MotionEvent newEvent = MotionEvent.obtain(ev); 5977c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown if ((newEvent.getSource() & InputDevice.SOURCE_CLASS_TRACKBALL) == 0) { 5978c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown newEvent.setSource(InputDevice.SOURCE_TRACKBALL); 5979c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown } 5980c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 5981bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown final int result = mInputManager.injectInputEvent(newEvent, pid, uid, 5982bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown sync ? InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISH 5983bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown : InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT, 5984bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown INJECTION_TIMEOUT_MILLIS); 5985bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown 5986bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown Binder.restoreCallingIdentity(ident); 5987bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown return reportInjectionResult(result); 5988bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown } 5989bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown 5990bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown /** 5991bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * Inject an input event into the UI without waiting for dispatch to commence. 5992bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * This variant is useful for fire-and-forget input event injection. It does not 5993bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * block any longer than it takes to enqueue the input event. 5994bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * 5995bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * @param ev An input event. (Be sure to set the input source correctly.) 5996bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * @return Returns true if event was dispatched, false if it was dropped for any reason 5997bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown */ 5998bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown public boolean injectInputEventNoWait(InputEvent ev) { 5999bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown final int pid = Binder.getCallingPid(); 6000bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown final int uid = Binder.getCallingUid(); 6001bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown final long ident = Binder.clearCallingIdentity(); 6002bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown 6003bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown final int result = mInputManager.injectInputEvent(ev, pid, uid, 6004bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown InputManager.INPUT_EVENT_INJECTION_SYNC_NONE, 6005bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown INJECTION_TIMEOUT_MILLIS); 600646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 60072bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn Binder.restoreCallingIdentity(ident); 60087fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown return reportInjectionResult(result); 60097fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown } 60107fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 60117fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown private boolean reportInjectionResult(int result) { 601200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown switch (result) { 601300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown case InputManager.INPUT_EVENT_INJECTION_PERMISSION_DENIED: 601400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown Slog.w(TAG, "Input event injection permission denied."); 601500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown throw new SecurityException( 601600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown "Injecting to another application requires INJECT_EVENTS permission"); 601700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown case InputManager.INPUT_EVENT_INJECTION_SUCCEEDED: 601809e85dc0270ac9ce660c17ee8290ff2d136b395bChristopher Tate //Slog.v(TAG, "Input event injection succeeded."); 601900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown return true; 602000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown case InputManager.INPUT_EVENT_INJECTION_TIMED_OUT: 602100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown Slog.w(TAG, "Input event injection timed out."); 602200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown return false; 602300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown case InputManager.INPUT_EVENT_INJECTION_FAILED: 602400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown default: 602500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown Slog.w(TAG, "Input event injection failed."); 602600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown return false; 6027cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn } 60289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 602906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 60301a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown /** 60311a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown * Temporarily set the pointer speed. Does not save the new setting. 60321a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown * Used by the settings application. 60331a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown */ 60341a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown public void setPointerSpeed(int speed) { 60351a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown if (!checkCallingPermission(android.Manifest.permission.SET_POINTER_SPEED, 60361a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown "setPointerSpeed()")) { 60371a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown throw new SecurityException("Requires SET_POINTER_SPEED permission"); 60381a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown } 60391a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 60401a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown mInputManager.setPointerSpeed(speed); 60411a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown } 60421a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 60439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WindowState getFocusedWindow() { 60449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 60459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getFocusedWindowLocked(); 60469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 60479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 60489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 60499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WindowState getFocusedWindowLocked() { 60509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrentFocus; 60519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 605206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 60539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean detectSafeMode() { 6054b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown if (!mInputMonitor.waitForInputDevicesReady( 6055b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS)) { 6056b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown Slog.w(TAG, "Devices still not ready after waiting " 6057b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown + INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS 6058b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown + " milliseconds before attempting to detect safe mode."); 6059b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown } 6060b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown 60619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSafeMode = mPolicy.detectSafeMode(); 60629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSafeMode; 60639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 606406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 60659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void systemReady() { 60665132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn synchronized(mWindowMap) { 60675132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn if (mDisplay != null) { 60685132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn throw new IllegalStateException("Display already initialized"); 60695132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn } 60705132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE); 60715132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn mDisplay = wm.getDefaultDisplay(); 60727916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mInitialDisplayWidth = mDisplay.getRealWidth(); 60737916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mInitialDisplayHeight = mDisplay.getRealHeight(); 60747916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn int rot = mDisplay.getRotation(); 60757916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (rot == Surface.ROTATION_90 || rot == Surface.ROTATION_270) { 60767916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn // If the screen is currently rotated, we need to swap the 60777916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn // initial width and height to get the true natural values. 60787916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn int tmp = mInitialDisplayWidth; 60797916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mInitialDisplayWidth = mInitialDisplayHeight; 60807916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mInitialDisplayHeight = tmp; 60817916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 608281e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn mBaseDisplayWidth = mCurDisplayWidth = mAppDisplayWidth = mInitialDisplayWidth; 608381e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn mBaseDisplayHeight = mCurDisplayHeight = mAppDisplayHeight = mInitialDisplayHeight; 6084ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn mInputManager.setDisplaySize(0, mDisplay.getRawWidth(), mDisplay.getRawHeight()); 608529735689cea7bf52998c1911542dcfdd1c1d9628Dianne Hackborn mPolicy.setInitialDisplaySize(mInitialDisplayWidth, mInitialDisplayHeight); 60865132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn } 60875132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn 60885132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn try { 60895132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn mActivityManager.updateConfiguration(null); 60905132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn } catch (RemoteException e) { 60915132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn } 6092571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato 6093154db5f6358284d917d515f05d4474606b4896b2Dianne Hackborn mPolicy.systemReady(); 6094571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato 6095571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato synchronized (mWindowMap) { 6096571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato readForcedDisplaySizeLocked(); 6097571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato } 60985132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn } 60995132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn 61006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // This is an animation that does nothing: it just immediately finishes 61016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // itself every time it is called. It is used as a stub animation in cases 61026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // where we want to synchronize multiple things that may be animating. 61036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn static final class DummyAnimation extends Animation { 61046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public boolean getTransformation(long currentTime, Transformation outTransformation) { 61056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return false; 61066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 61076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 61086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn static final Animation sDummyAnimation = new DummyAnimation(); 61096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 61109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 61116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Async Handler 61129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 61139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 61146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final class H extends Handler { 61156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int REPORT_FOCUS_CHANGE = 2; 61166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int REPORT_LOSING_FOCUS = 3; 61176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int ANIMATE = 4; 61186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int ADD_STARTING = 5; 61196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int REMOVE_STARTING = 6; 61206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int FINISHED_STARTING = 7; 61216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int REPORT_APPLICATION_TOKEN_WINDOWS = 8; 61226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int WINDOW_FREEZE_TIMEOUT = 11; 61236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int HOLD_SCREEN_CHANGED = 12; 61246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int APP_TRANSITION_TIMEOUT = 13; 61256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int PERSIST_ANIMATION_SCALE = 14; 61266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int FORCE_GC = 15; 61276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int ENABLE_SCREEN = 16; 61286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int APP_FREEZE_TIMEOUT = 17; 61296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int SEND_NEW_CONFIGURATION = 18; 61306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int REPORT_WINDOWS_CHANGE = 19; 61316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int DRAG_START_TIMEOUT = 20; 61326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int DRAG_END_TIMEOUT = 21; 61336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int REPORT_HARD_KEYBOARD_STATUS_CHANGE = 22; 613406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 61359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Session mLastReportedHold; 613606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 61379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public H() { 61389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 613906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 61409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 61419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void handleMessage(Message msg) { 61429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (msg.what) { 61439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case REPORT_FOCUS_CHANGE: { 61449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState lastFocus; 61459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState newFocus; 614606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 61479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 61489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lastFocus = mLastFocus; 61499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newFocus = mCurrentFocus; 61509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lastFocus == newFocus) { 61519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Focus is not changing, so nothing to do. 61529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 61539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 61549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastFocus = newFocus; 61558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Focus moving from " + lastFocus 61569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " to " + newFocus); 61579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newFocus != null && lastFocus != null 61589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && !newFocus.isDisplayedLw()) { 61598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Delaying loss of focus..."); 61609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLosingFocus.add(lastFocus); 61619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lastFocus = null; 61629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 61639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 61649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 61659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lastFocus != newFocus) { 61669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //System.out.println("Changing focus from " + lastFocus 61679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " to " + newFocus); 61689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newFocus != null) { 61699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 61708a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Gaining focus: " + newFocus); 61719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newFocus.mClient.windowFocusChanged(true, mInTouchMode); 61729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 61739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ignore if process has died. 61749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 61755e7833a571967d1dbc8618ac96ad6a379bcdf66aKonstantin Lopyrev notifyFocusChanged(); 61769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 61779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 61789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lastFocus != null) { 61799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 61808a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Losing focus: " + lastFocus); 61819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lastFocus.mClient.windowFocusChanged(false, mInTouchMode); 61829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 61839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ignore if process has died. 61849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 61859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6186664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato 6187664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato mPolicy.focusChanged(lastFocus, newFocus); 61889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 61899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 61909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 61919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case REPORT_LOSING_FOCUS: { 61929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<WindowState> losers; 619306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 61949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 61959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project losers = mLosingFocus; 61969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLosingFocus = new ArrayList<WindowState>(); 61979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 61989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 61999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = losers.size(); 62009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 62019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 62028a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Losing delayed focus: " + losers.get(i)); 62039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project losers.get(i).mClient.windowFocusChanged(false, mInTouchMode); 62049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 62059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ignore if process has died. 62069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 62099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 62109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ANIMATE: { 62119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 62129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimationPending = false; 62139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 62149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 62169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 62179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ADD_STARTING: { 62189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken wtoken = (AppWindowToken)msg.obj; 62199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final StartingData sd = wtoken.startingData; 62209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 62219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sd == null) { 62229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Animation has been canceled... do nothing. 62239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 62249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 622506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 62268a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Add starting " 62279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken + ": pkg=" + sd.pkg); 622806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 62299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View view = null; 62309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 62319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view = mPolicy.addStartingWindow( 62322f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn wtoken.token, sd.pkg, sd.theme, sd.compatInfo, 62332f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn sd.nonLocalizedLabel, sd.labelRes, sd.icon, sd.windowFlags); 62349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 62358a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Exception when adding starting window", e); 62369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 62389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (view != null) { 62399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean abort = false; 62409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 62419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 62429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.removed || wtoken.startingData == null) { 62439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the window was successfully added, then 62449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we need to remove it. 62459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.startingWindow != null) { 62468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW) Slog.v(TAG, 62479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Aborted starting " + wtoken 62489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": removed=" + wtoken.removed 62499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " startingData=" + wtoken.startingData); 62509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingWindow = null; 62519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingData = null; 62529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project abort = true; 62539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 62559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingView = view; 62569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62578a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW && !abort) Slog.v(TAG, 62589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Added starting " + wtoken 62599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": startingWindow=" 62609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken.startingWindow + " startingView=" 62619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken.startingView); 62629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 62649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (abort) { 62659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 62669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.removeStartingWindow(wtoken.token, view); 62679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 62688a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Exception when removing starting window", e); 62699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 62739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 62749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case REMOVE_STARTING: { 62759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken wtoken = (AppWindowToken)msg.obj; 62769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder token = null; 62779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View view = null; 62789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 62798a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Remove starting " 62809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken + ": startingWindow=" 62819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken.startingWindow + " startingView=" 62829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken.startingView); 62839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.startingWindow != null) { 62849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view = wtoken.startingView; 62859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token = wtoken.token; 62869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingData = null; 62879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingView = null; 62889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingWindow = null; 62899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (view != null) { 62929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 62939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.removeStartingWindow(token, view); 62949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 62958a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Exception when removing starting window", e); 62969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 62999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 63009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FINISHED_STARTING: { 63019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder token = null; 63029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View view = null; 63039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (true) { 63049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 63059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mFinishedStarting.size(); 63069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N <= 0) { 63079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 63089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = mFinishedStarting.remove(N-1); 63109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 63118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW) Slog.v(TAG, 63129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Finished starting " + wtoken 63139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": startingWindow=" + wtoken.startingWindow 63149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " startingView=" + wtoken.startingView); 63159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 63169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.startingWindow == null) { 63179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 63189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 63209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view = wtoken.startingView; 63219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token = wtoken.token; 63229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingData = null; 63239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingView = null; 63249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingWindow = null; 63259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 63279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 63289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.removeStartingWindow(token, view); 63299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 63308a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Exception when removing starting window", e); 63319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 63349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 63359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case REPORT_APPLICATION_TOKEN_WINDOWS: { 63369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken wtoken = (AppWindowToken)msg.obj; 63379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 63389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean nowVisible = msg.arg1 != 0; 63399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean nowGone = msg.arg2 != 0; 63409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 63419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 63428a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY) Slog.v( 63439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Reporting visible in " + wtoken 63449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " visible=" + nowVisible 63459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " gone=" + nowGone); 63469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nowVisible) { 63479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.appToken.windowsVisible(); 63489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 63499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.appToken.windowsGone(); 63509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 63529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 635406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 63559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WINDOW_FREEZE_TIMEOUT: { 63569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 63578a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Window freeze timeout expired."); 63589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = mWindows.size(); 63599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i > 0) { 63609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 6361e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 63629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mOrientationChanging) { 63639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mOrientationChanging = false; 63648a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Force clearing orientation change: " + w); 63659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 63689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 63709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 637106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 63729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case HOLD_SCREEN_CHANGED: { 63739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Session oldHold; 63749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Session newHold; 63759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 63769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project oldHold = mLastReportedHold; 63779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newHold = (Session)msg.obj; 63789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastReportedHold = newHold; 63799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 638006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 63819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldHold != newHold) { 63829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 63839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldHold != null) { 63849adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mBatteryStats.noteStopWakelock(oldHold.mUid, -1, 63859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "window", 63869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BatteryStats.WAKE_TYPE_WINDOW); 63879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newHold != null) { 63899adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mBatteryStats.noteStartWakelock(newHold.mUid, -1, 63909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "window", 63919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BatteryStats.WAKE_TYPE_WINDOW); 63929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 63949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 63979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 639806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 63999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case APP_TRANSITION_TIMEOUT: { 64009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 6401bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 64028a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 64039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "*** APP TRANSITION TIMEOUT"); 64049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTransitionReady = true; 64059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTransitionTimeout = true; 64069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 64079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 64109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 641106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 64129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PERSIST_ANIMATION_SCALE: { 64139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.System.putFloat(mContext.getContentResolver(), 64149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.System.WINDOW_ANIMATION_SCALE, mWindowAnimationScale); 64159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.System.putFloat(mContext.getContentResolver(), 64169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.System.TRANSITION_ANIMATION_SCALE, mTransitionAnimationScale); 64179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 64189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 641906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 64209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FORCE_GC: { 64219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 64229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAnimationPending) { 64239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are animating, don't do the gc now but 64249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // delay a bit so we don't interrupt the animation. 64259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessageDelayed(mH.obtainMessage(H.FORCE_GC), 64269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2000); 64279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 64289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are currently rotating the display, it will 64309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // schedule a new message when done. 64319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDisplayFrozen) { 64329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 64339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFreezeGcPending = 0; 64359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Runtime.getRuntime().gc(); 64379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 64389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 643906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 64409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ENABLE_SCREEN: { 64419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performEnableScreen(); 64429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 64439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 644406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 64459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case APP_FREEZE_TIMEOUT: { 64469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 64478a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "App freeze timeout expired."); 64489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = mAppTokens.size(); 64499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i > 0) { 64509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 64519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken tok = mAppTokens.get(i); 64529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tok.freezingScreen) { 64538a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Force clearing freeze: " + tok); 64549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsetAppFreezingScreenLocked(tok, true, true); 64559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 64599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 646006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6461e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn case SEND_NEW_CONFIGURATION: { 6462e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn removeMessages(SEND_NEW_CONFIGURATION); 6463e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn sendNewConfiguration(); 6464c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project break; 6465c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 646606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 64676e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev case REPORT_WINDOWS_CHANGE: { 6468dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev if (mWindowsChanged) { 6469dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev synchronized (mWindowMap) { 6470dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = false; 6471dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 6472dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev notifyWindowsChanged(); 6473dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 6474dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev break; 6475dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 6476dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev 6477a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate case DRAG_START_TIMEOUT: { 6478a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate IBinder win = (IBinder)msg.obj; 6479a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (DEBUG_DRAG) { 6480a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate Slog.w(TAG, "Timeout starting drag by win " + win); 6481a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 6482a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate synchronized (mWindowMap) { 6483a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate // !!! TODO: ANR the app that has failed to start the drag in time 6484a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (mDragState != null) { 6485d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate mDragState.unregister(); 64862e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(true /*force*/); 6487a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate mDragState.reset(); 6488a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate mDragState = null; 6489a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 6490a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 6491d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate break; 6492a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 6493a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 6494d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate case DRAG_END_TIMEOUT: { 6495d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate IBinder win = (IBinder)msg.obj; 6496d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate if (DEBUG_DRAG) { 6497d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate Slog.w(TAG, "Timeout ending drag to win " + win); 6498d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate } 6499d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate synchronized (mWindowMap) { 6500d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate // !!! TODO: ANR the drag-receiving app 6501d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate mDragState.mDragResult = false; 6502d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate mDragState.endDragLw(); 6503d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate } 6504d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate break; 6505d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate } 65062992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 65072992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown case REPORT_HARD_KEYBOARD_STATUS_CHANGE: { 65082992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown notifyHardKeyboardStatusChange(); 65092992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown break; 65102992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 65119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 65159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 65169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // IWindowManager API 65179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 65189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 65199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public IWindowSession openSession(IInputMethodClient client, 65209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IInputContext inputContext) { 65219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (client == null) throw new IllegalArgumentException("null client"); 65229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (inputContext == null) throw new IllegalArgumentException("null inputContext"); 65236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Session session = new Session(this, client, inputContext); 652446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return session; 65259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 65279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean inputMethodClientHasFocus(IInputMethodClient client) { 65289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 65299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The focus for the client is the window immediately below 65309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // where we would place the input method window. 65319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int idx = findDesiredInputMethodWindowIndexLocked(false); 65329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState imFocus; 65339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (idx > 0) { 6534e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown imFocus = mWindows.get(idx-1); 6535e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn //Log.i(TAG, "Desired input method target: " + imFocus); 6536e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn //Log.i(TAG, "Current focus: " + this.mCurrentFocus); 6537e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn //Log.i(TAG, "Last focus: " + this.mLastFocus); 65389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imFocus != null) { 6539e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // This may be a starting window, in which case we still want 6540e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // to count it as okay. 6541e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (imFocus.mAttrs.type == LayoutParams.TYPE_APPLICATION_STARTING 6542e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn && imFocus.mAppToken != null) { 6543e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // The client has definitely started, so it really should 6544e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // have a window in this app token. Let's look for it. 6545e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn for (int i=0; i<imFocus.mAppToken.windows.size(); i++) { 6546e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn WindowState w = imFocus.mAppToken.windows.get(i); 6547e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (w != imFocus) { 6548e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn //Log.i(TAG, "Switching to real app window: " + w); 6549e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn imFocus = w; 6550e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn break; 6551e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn } 6552e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn } 6553e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn } 6554e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn //Log.i(TAG, "IM target client: " + imFocus.mSession.mClient); 6555e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn //if (imFocus.mSession.mClient != null) { 6556e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // Log.i(TAG, "IM target client binder: " + imFocus.mSession.mClient.asBinder()); 6557e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // Log.i(TAG, "Requesting client binder: " + client.asBinder()); 6558e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn //} 65599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imFocus.mSession.mClient != null && 65609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imFocus.mSession.mClient.asBinder() == client.asBinder()) { 65619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 65629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6563e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn 6564e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // Okay, how about this... what is the current focus? 6565e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // It seems in some cases we may not have moved the IM 6566e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // target window, such as when it was in a pop-up window, 6567e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // so let's also look at the current focus. (An example: 6568e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // go to Gmail, start searching so the keyboard goes up, 6569e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // press home. Sometimes the IME won't go down.) 6570e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // Would be nice to fix this more correctly, but it's 6571e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // way at the end of a release, and this should be good enough. 6572e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (mCurrentFocus != null && mCurrentFocus.mSession.mClient != null && 6573e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn mCurrentFocus.mSession.mClient.asBinder() == client.asBinder()) { 6574e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn return true; 6575e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn } 65769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 65809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 658106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6582ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn public void getDisplaySize(Point size) { 6583ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn synchronized(mWindowMap) { 658481e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn size.x = mAppDisplayWidth; 658581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn size.y = mAppDisplayHeight; 6586ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn } 6587ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn } 6588ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn 6589ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn public int getMaximumSizeDimension() { 6590ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn synchronized(mWindowMap) { 6591ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn // Do this based on the raw screen size, until we are smarter. 65927916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn return mBaseDisplayWidth > mBaseDisplayHeight 65937916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn ? mBaseDisplayWidth : mBaseDisplayHeight; 65947916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 65957916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 65967916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 65977916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn public void setForcedDisplaySize(int longDimen, int shortDimen) { 65987916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn synchronized(mWindowMap) { 65997916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn int width, height; 66007916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (mInitialDisplayWidth < mInitialDisplayHeight) { 66017916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn width = shortDimen < mInitialDisplayWidth 66027916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn ? shortDimen : mInitialDisplayWidth; 66037916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn height = longDimen < mInitialDisplayHeight 66047916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn ? longDimen : mInitialDisplayHeight; 66057916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } else { 66067916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn width = longDimen < mInitialDisplayWidth 66077916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn ? longDimen : mInitialDisplayWidth; 66087916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn height = shortDimen < mInitialDisplayHeight 66097916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn ? shortDimen : mInitialDisplayHeight; 66107916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 66117916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn setForcedDisplaySizeLocked(width, height); 6612571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato Settings.Secure.putString(mContext.getContentResolver(), 6613571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato Settings.Secure.DISPLAY_SIZE_FORCED, width + "," + height); 66147916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 66157916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 66167916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 66177916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn private void rebuildBlackFrame(boolean inTransaction) { 66187916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (!inTransaction) { 66197916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, 66207916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn ">>> OPEN TRANSACTION rebuildBlackFrame"); 66217916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn Surface.openTransaction(); 66227916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 66237916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn try { 66247916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (mBlackFrame != null) { 66257916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mBlackFrame.kill(); 66267916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mBlackFrame = null; 66277916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 66287916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (mBaseDisplayWidth < mInitialDisplayWidth 66297916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn || mBaseDisplayHeight < mInitialDisplayHeight) { 66308f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn int initW, initH, baseW, baseH; 66318f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn final boolean rotated = (mRotation == Surface.ROTATION_90 66328f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn || mRotation == Surface.ROTATION_270); 66338f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn if (rotated) { 66348f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn initW = mInitialDisplayHeight; 66358f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn initH = mInitialDisplayWidth; 66368f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn baseW = mBaseDisplayHeight; 66378f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn baseH = mBaseDisplayWidth; 66388f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn } else { 66398f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn initW = mInitialDisplayWidth; 66408f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn initH = mInitialDisplayHeight; 66418f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn baseW = mBaseDisplayWidth; 66428f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn baseH = mBaseDisplayHeight; 66438f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn } 66448f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn Rect outer = new Rect(0, 0, initW, initH); 66458f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn Rect inner = new Rect(0, 0, baseW, baseH); 66467916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn try { 66477916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mBlackFrame = new BlackFrame(mFxSession, outer, inner, MASK_LAYER); 66487916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } catch (Surface.OutOfResourcesException e) { 66497916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 66507916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 66517916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } finally { 66527916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (!inTransaction) { 66537916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn Surface.closeTransaction(); 66547916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, 66557916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn "<<< CLOSE TRANSACTION rebuildBlackFrame"); 66567916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 66577916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 66587916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 66597916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 6660571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato private void readForcedDisplaySizeLocked() { 6661571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato final String str = Settings.Secure.getString(mContext.getContentResolver(), 6662571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato Settings.Secure.DISPLAY_SIZE_FORCED); 6663571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato if (str == null || str.length() == 0) { 6664571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato return; 6665571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato } 6666571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato final int pos = str.indexOf(','); 6667571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato if (pos <= 0 || str.lastIndexOf(',') != pos) { 6668571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato return; 6669571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato } 6670571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato int width, height; 6671571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato try { 6672571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato width = Integer.parseInt(str.substring(0, pos)); 6673571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato height = Integer.parseInt(str.substring(pos+1)); 6674571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato } catch (NumberFormatException ex) { 6675571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato return; 6676571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato } 6677571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato setForcedDisplaySizeLocked(width, height); 6678571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato } 6679571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato 66807916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn private void setForcedDisplaySizeLocked(int width, int height) { 6681571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato Slog.i(TAG, "Using new display size: " + width + "x" + height); 6682571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato 66837916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mBaseDisplayWidth = width; 66847916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mBaseDisplayHeight = height; 66857916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mPolicy.setInitialDisplaySize(mBaseDisplayWidth, mBaseDisplayHeight); 66867916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 66877916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mLayoutNeeded = true; 66887916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 66897916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn boolean configChanged = updateOrientationFromAppTokensLocked(false); 66907916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mTempConfiguration.setToDefaults(); 66917916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mTempConfiguration.fontScale = mCurConfiguration.fontScale; 66927916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (computeNewConfigurationLocked(mTempConfiguration)) { 66937916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (mCurConfiguration.diff(mTempConfiguration) != 0) { 66947916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn configChanged = true; 66957916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 66967916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 66977916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 66987916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (configChanged) { 66997916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mWaitingForConfig = true; 67007916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn startFreezingDisplayLocked(false); 67017916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION); 67027916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 67037916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 67047916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn rebuildBlackFrame(false); 67057916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 67067916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn performLayoutAndPlaceSurfacesLocked(); 67077916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 67087916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 67097916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn public void clearForcedDisplaySize() { 67107916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn synchronized(mWindowMap) { 67117916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn setForcedDisplaySizeLocked(mInitialDisplayWidth, mInitialDisplayHeight); 6712571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato Settings.Secure.putString(mContext.getContentResolver(), 6713571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato Settings.Secure.DISPLAY_SIZE_FORCED, ""); 6714ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn } 6715ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn } 6716ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn 671781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn public boolean canStatusBarHide() { 671881e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn return mPolicy.canStatusBarHide(); 671981e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn } 672081e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn 67219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 67229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Internals 67239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 67249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6725e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn final WindowState windowForClientLocked(Session session, IWindow client, 6726e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean throwOnError) { 6727e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return windowForClientLocked(session, client.asBinder(), throwOnError); 67289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 672906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6730e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn final WindowState windowForClientLocked(Session session, IBinder client, 6731e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean throwOnError) { 67329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = mWindowMap.get(client); 67338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v( 67349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Looking up client " + client + ": " + win); 67359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win == null) { 6736e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn RuntimeException ex = new IllegalArgumentException( 6737e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn "Requested window " + client + " does not exist"); 6738e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (throwOnError) { 6739e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn throw ex; 6740e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 67418a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Failed looking up window", ex); 67429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 67439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 67449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (session != null && win.mSession != session) { 6745e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn RuntimeException ex = new IllegalArgumentException( 6746e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn "Requested window " + client + " is in session " + 6747e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn win.mSession + ", not " + session); 6748e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (throwOnError) { 6749e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn throw ex; 6750e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 67518a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Failed looking up window", ex); 67529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 67539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 67549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 67559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return win; 67569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 67579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6758a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn final void rebuildAppWindowListLocked() { 6759a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn int NW = mWindows.size(); 6760a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn int i; 67613b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn int lastWallpaper = -1; 67629bfb707597898f54722460b48588007b682f3e2aDianne Hackborn int numRemoved = 0; 6763ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 6764f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (mRebuildTmp.length < NW) { 6765f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn mRebuildTmp = new WindowState[NW+10]; 6766f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 6767f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn 6768a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // First remove all existing app windows. 6769a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn i=0; 6770a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn while (i < NW) { 6771e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 67723b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (w.mAppToken != null) { 6773e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState win = mWindows.remove(i); 6774f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn win.mRebuilding = true; 6775f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn mRebuildTmp[numRemoved] = win; 6776dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 67778a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, 6778bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn "Rebuild removing window: " + win); 6779a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn NW--; 67809bfb707597898f54722460b48588007b682f3e2aDianne Hackborn numRemoved++; 6781a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn continue; 67823b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_WALLPAPER 67833b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn && lastWallpaper == i-1) { 67843b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn lastWallpaper = i; 6785a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 6786a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn i++; 6787a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 6788ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 67893b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // The wallpaper window(s) typically live at the bottom of the stack, 67903b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // so skip them before adding app tokens. 67913b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn lastWallpaper++; 67923b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn i = lastWallpaper; 6793ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 6794bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn // First add all of the exiting app tokens... these are no longer 6795bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn // in the main app list, but still have windows shown. We put them 6796bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn // in the back because now that the animation is over we no longer 6797bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn // will care about them. 6798bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn int NT = mExitingAppTokens.size(); 6799a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn for (int j=0; j<NT; j++) { 6800bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn i = reAddAppWindowsLocked(i, mExitingAppTokens.get(j)); 6801bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn } 6802ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 6803bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn // And add in the still active app tokens in Z order. 6804bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn NT = mAppTokens.size(); 6805bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn for (int j=0; j<NT; j++) { 6806bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn i = reAddAppWindowsLocked(i, mAppTokens.get(j)); 6807a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 6808ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 68093b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn i -= lastWallpaper; 68109bfb707597898f54722460b48588007b682f3e2aDianne Hackborn if (i != numRemoved) { 68118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Rebuild removed " + numRemoved 68129bfb707597898f54722460b48588007b682f3e2aDianne Hackborn + " windows but added " + i); 6813f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn for (i=0; i<numRemoved; i++) { 6814f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn WindowState ws = mRebuildTmp[i]; 6815f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (ws.mRebuilding) { 6816f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn StringWriter sw = new StringWriter(); 6817f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn PrintWriter pw = new PrintWriter(sw); 6818f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn ws.dump(pw, ""); 6819f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn pw.flush(); 6820f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn Slog.w(TAG, "This window was lost: " + ws); 6821f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn Slog.w(TAG, sw.toString()); 6822f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 6823f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 6824f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn Slog.w(TAG, "Current app token list:"); 6825f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn dumpAppTokensLocked(); 6826f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn Slog.w(TAG, "Final window list:"); 6827f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn dumpWindowsLocked(); 68289bfb707597898f54722460b48588007b682f3e2aDianne Hackborn } 6829a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 6830ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 68319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final void assignLayersLocked() { 68329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = mWindows.size(); 68339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int curBaseLayer = 0; 68349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int curLayer = 0; 68359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 683606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 68376c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (DEBUG_LAYERS) { 68386c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn RuntimeException here = new RuntimeException("here"); 68396c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn here.fillInStackTrace(); 68406c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn Log.v(TAG, "Assigning layers", here); 68416c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn } 68426c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn 68439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 6844e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 68457341d7a104b47996445d069a695e155a07184606Dianne Hackborn if (w.mBaseLayer == curBaseLayer || w.mIsImWindow 68467341d7a104b47996445d069a695e155a07184606Dianne Hackborn || (i > 0 && w.mIsWallpaper)) { 68479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curLayer += WINDOW_LAYER_MULTIPLIER; 68489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLayer = curLayer; 68499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 68509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curBaseLayer = curLayer = w.mBaseLayer; 68519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLayer = curLayer; 68529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mTargetAppToken != null) { 68549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mAnimLayer = w.mLayer + w.mTargetAppToken.animLayerAdjustment; 68559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (w.mAppToken != null) { 68569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mAnimLayer = w.mLayer + w.mAppToken.animLayerAdjustment; 68579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 68589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mAnimLayer = w.mLayer; 68599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mIsImWindow) { 68619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mAnimLayer += mInputMethodAnimLayerAdjustment; 6862759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } else if (w.mIsWallpaper) { 6863759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn w.mAnimLayer += mWallpaperAnimLayerAdjustment; 68649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYERS) Slog.v(TAG, "Assign layer " + w + ": " 68669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + w.mAnimLayer); 68679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //System.out.println( 68689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // "Assigned layer " + curLayer + " to " + w.mClient.asBinder()); 68699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 68729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mInLayout = false; 68739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final void performLayoutAndPlaceSurfacesLocked() { 68749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInLayout) { 6875cfe6524071624b6679e5fa4db847328e8d0317c8Dave Bort if (DEBUG) { 68769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Recursive call!"); 68779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68788a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "performLayoutAndPlaceSurfacesLocked called while in layout"); 68799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 68809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6882e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (mWaitingForConfig) { 6883e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // Our configuration has changed (most likely rotation), but we 6884e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // don't yet have the complete configuration to report to 6885e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // applications. Don't do any window layout until we have it. 6886e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return; 6887e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 6888e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 6889ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn if (mDisplay == null) { 6890ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn // Not yet initialized, nothing to do. 6891ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn return; 6892ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 6893ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 68942e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn mInLayout = true; 68959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean recoveringMemory = false; 68962e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn 68972e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn try { 68982e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn if (mForceRemoves != null) { 68992e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn recoveringMemory = true; 6900f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn // Wait a little bit for things to settle down, and off we go. 69012e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn for (int i=0; i<mForceRemoves.size(); i++) { 69022e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn WindowState ws = mForceRemoves.get(i); 69032e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn Slog.i(TAG, "Force removing: " + ws); 69042e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn removeWindowInnerLocked(ws.mSession, ws); 69052e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn } 69062e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn mForceRemoves = null; 69072e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn Slog.w(TAG, "Due to memory failure, waiting a bit for next layout"); 69082e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn Object tmp = new Object(); 69092e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn synchronized (tmp) { 69102e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn try { 69112e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn tmp.wait(250); 69122e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn } catch (InterruptedException e) { 69132e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn } 69149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69162e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn } catch (RuntimeException e) { 69172e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn Slog.e(TAG, "Unhandled exception while force removing for memory", e); 69189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69192e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn 69209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 69219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLockedInner(recoveringMemory); 692206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6923f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn int N = mPendingRemove.size(); 6924f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (N > 0) { 6925f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (mPendingRemoveTmp.length < N) { 6926f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn mPendingRemoveTmp = new WindowState[N+10]; 69279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6928f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn mPendingRemove.toArray(mPendingRemoveTmp); 69299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPendingRemove.clear(); 6930f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn for (int i=0; i<N; i++) { 6931f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn WindowState w = mPendingRemoveTmp[i]; 6932f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn removeWindowInnerLocked(w.mSession, w); 6933f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 69349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 69359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInLayout = false; 69369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assignLayersLocked(); 69379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 69389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 69399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 69409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 69419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInLayout = false; 69429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLayoutNeeded) { 69439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestAnimationLocked(0); 69449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6946dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev if (mWindowsChanged && !mWindowChangeListeners.isEmpty()) { 69476e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev mH.removeMessages(H.REPORT_WINDOWS_CHANGE); 69486e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev mH.sendMessage(mH.obtainMessage(H.REPORT_WINDOWS_CHANGE)); 6949dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 69509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 69519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInLayout = false; 69528a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.e(TAG, "Unhandled exception while layout out windows", e); 69539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 69563a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown private final int performLayoutLockedInner(boolean initial, boolean updateInputWindows) { 6957b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (!mLayoutNeeded) { 6958b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn return 0; 6959b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 6960b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 6961b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mLayoutNeeded = false; 6962b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 6963ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn final int dw = mCurDisplayWidth; 6964ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn final int dh = mCurDisplayHeight; 69659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 69669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mWindows.size(); 69679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 69689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 69698a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYOUT) Slog.v(TAG, "performLayout: needed=" 69709b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn + mLayoutNeeded + " dw=" + dw + " dh=" + dh); 69719b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn 6972b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mPolicy.beginLayoutLw(dw, dh); 697306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6974b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn int seq = mLayoutSeq+1; 6975b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (seq < 0) seq = 0; 6976b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mLayoutSeq = seq; 6977b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 6978b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // First perform layout of any root windows (not attached 6979b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // to another window). 6980b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn int topAttached = -1; 6981b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn for (i = N-1; i >= 0; i--) { 6982e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState win = mWindows.get(i); 6983b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 6984b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // Don't do layout of a window if it is not visible, or 6985b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // soon won't be visible, to avoid wasting time and funky 6986b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // changes while a window is animating away. 6987b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn final AppWindowToken atoken = win.mAppToken; 6988b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn final boolean gone = win.mViewVisibility == View.GONE 6989b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn || !win.mRelayoutCalled 6990ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn || (atoken == null && win.mRootToken.hidden) 6991b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn || (atoken != null && atoken.hiddenRequested) 6992b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn || win.mAttachedHidden 6993b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn || win.mExiting || win.mDestroying; 6994b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 69951c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn if (DEBUG_LAYOUT && !win.mLayoutAttached) { 69961c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn Slog.v(TAG, "First pass " + win 6997b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + ": gone=" + gone + " mHaveFrame=" + win.mHaveFrame 6998b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + " mLayoutAttached=" + win.mLayoutAttached); 69991c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn if (gone) Slog.v(TAG, " (mViewVisibility=" 7000b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mViewVisibility + " mRelayoutCalled=" 7001b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mRelayoutCalled + " hidden=" 7002b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mRootToken.hidden + " hiddenRequested=" 7003b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + (atoken != null && atoken.hiddenRequested) 7004b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + " mAttachedHidden=" + win.mAttachedHidden); 7005b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7006e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 7007b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // If this view is GONE, then skip it -- keep the current 7008b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // frame, and let the caller know so they can ignore it 7009b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // if they want. (We do the normal layout for INVISIBLE 7010b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // windows, since that means "perform layout as normal, 7011b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // just don't display"). 7012b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (!gone || !win.mHaveFrame) { 7013e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (!win.mLayoutAttached) { 70148e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn if (initial) { 70150f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial"); 70168e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn win.mContentChanged = false; 70178e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn } 7018e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn win.prelayout(); 7019b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mPolicy.layoutWindowLw(win, win.mAttrs, null); 7020b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn win.mLayoutSeq = seq; 7021b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (DEBUG_LAYOUT) Slog.v(TAG, "-> mFrame=" 7022b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mFrame + " mContainingFrame=" 7023b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mContainingFrame + " mDisplayFrame=" 7024b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mDisplayFrame); 7025b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } else { 7026b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (topAttached < 0) topAttached = i; 70279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 70289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7029b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 703006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 7031b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // Now perform layout of attached windows, which usually 7032b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // depend on the position of the window they are attached to. 7033b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // XXX does not deal with windows that are attached to windows 7034b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // that are themselves attached. 7035b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn for (i = topAttached; i >= 0; i--) { 7036e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState win = mWindows.get(i); 70379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7038b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (win.mLayoutAttached) { 7039b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (DEBUG_LAYOUT) Slog.v(TAG, "Second pass " + win 7040b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + " mHaveFrame=" + win.mHaveFrame 7041b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + " mViewVisibility=" + win.mViewVisibility 7042b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + " mRelayoutCalled=" + win.mRelayoutCalled); 70431c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn // If this view is GONE, then skip it -- keep the current 70441c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn // frame, and let the caller know so they can ignore it 70451c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn // if they want. (We do the normal layout for INVISIBLE 70461c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn // windows, since that means "perform layout as normal, 70471c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn // just don't display"). 7048b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if ((win.mViewVisibility != View.GONE && win.mRelayoutCalled) 7049b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn || !win.mHaveFrame) { 70508e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn if (initial) { 70510f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial"); 70528e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn win.mContentChanged = false; 70538e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn } 7054e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn win.prelayout(); 7055b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mPolicy.layoutWindowLw(win, win.mAttrs, win.mAttachedWindow); 7056b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn win.mLayoutSeq = seq; 7057b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (DEBUG_LAYOUT) Slog.v(TAG, "-> mFrame=" 7058b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mFrame + " mContainingFrame=" 7059b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mContainingFrame + " mDisplayFrame=" 7060b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mDisplayFrame); 70619bfb707597898f54722460b48588007b682f3e2aDianne Hackborn } 7062958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn } 70639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7064349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 7065349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // Window frames may have changed. Tell the input dispatcher about it. 70663a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown mInputMonitor.setUpdateInputWindowsNeededLw(); 70673a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown if (updateInputWindows) { 70682e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(false /*force*/); 70693a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown } 7070b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 7071b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn return mPolicy.finishLayoutLw(); 70729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 707306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 70746804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick // "Something has changed! Let's make it correct now." 70759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final void performLayoutAndPlaceSurfacesLockedInner( 70769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean recoveringMemory) { 707734bcebca707187393263183aa4dab32728763f2fJoe Onorato if (mDisplay == null) { 707834bcebca707187393263183aa4dab32728763f2fJoe Onorato Slog.i(TAG, "skipping performLayoutAndPlaceSurfacesLockedInner with no mDisplay"); 707934bcebca707187393263183aa4dab32728763f2fJoe Onorato return; 708034bcebca707187393263183aa4dab32728763f2fJoe Onorato } 708134bcebca707187393263183aa4dab32728763f2fJoe Onorato 70829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long currentTime = SystemClock.uptimeMillis(); 708368066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn final int dw = mCurDisplayWidth; 708468066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn final int dh = mCurDisplayHeight; 708581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn final int innerDw = mAppDisplayWidth; 708681e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn final int innerDh = mAppDisplayHeight; 7087e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn 70889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 70899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7090b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn if (mFocusMayChange) { 7091b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn mFocusMayChange = false; 70923a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, 70933a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/); 7094b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn } 7095b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn 70969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Initialize state of exiting tokens. 70979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=mExitingTokens.size()-1; i>=0; i--) { 70989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExitingTokens.get(i).hasVisible = false; 70999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 71009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 71019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Initialize state of exiting applications. 71029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=mExitingAppTokens.size()-1; i>=0; i--) { 71039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExitingAppTokens.get(i).hasVisible = false; 71049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 71059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 71069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean orientationChangeComplete = true; 71079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Session holdScreen = null; 71089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float screenBrightness = -1; 7109fb73f79340375013225618a5d87f46b958f698efMike Lockwood float buttonBrightness = -1; 71109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean focusDisplayed = false; 71119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean animating = false; 7112fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn boolean createWatermark = false; 711389ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn boolean updateRotation = false; 711450660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn boolean screenRotationFinished = false; 7115fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn 7116fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn if (mFxSession == null) { 7117fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn mFxSession = new SurfaceSession(); 7118fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn createWatermark = true; 7119fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 7120fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn 712194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION performLayoutAndPlaceSurfaces"); 71229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 71239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Surface.openTransaction(); 7124fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn 7125fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn if (createWatermark) { 7126fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn createWatermark(); 7127fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 7128fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn if (mWatermark != null) { 7129fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn mWatermark.positionSurface(dw, dh); 7130fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 71316804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick if (mStrictModeFlash != null) { 71326804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick mStrictModeFlash.positionSurface(dw, dh); 71336804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick } 7134fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn 71359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7136de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn boolean wallpaperForceHidingChanged = false; 7137b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn int repeats = 0; 7138b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn int changes = 0; 7139b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 71409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 7141b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn repeats++; 7142b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (repeats > 6) { 7143b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn Slog.w(TAG, "Animation repeat aborted after too many iterations"); 7144b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mLayoutNeeded = false; 7145b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn break; 7146b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7147b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 7148b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if ((changes&(WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER 7149b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn | WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG 7150b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn | WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT)) != 0) { 7151b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) { 7152b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if ((adjustWallpaperWindowsLocked()&ADJUST_WALLPAPER_LAYERS_CHANGED) != 0) { 7153b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn assignLayersLocked(); 7154b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mLayoutNeeded = true; 7155b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7156b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7157b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG) != 0) { 7158b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (DEBUG_LAYOUT) Slog.v(TAG, "Computing new config from layout"); 715994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (updateOrientationFromAppTokensLocked(true)) { 7160b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mLayoutNeeded = true; 7161b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION); 7162b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7163b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7164b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT) != 0) { 7165b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mLayoutNeeded = true; 7166b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7167b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7168b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 7169b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // FIRST LOOP: Perform a layout, if needed. 7170b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (repeats < 4) { 71713a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown changes = performLayoutLockedInner(repeats == 0, false /*updateInputWindows*/); 7172b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (changes != 0) { 7173b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn continue; 7174b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7175b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } else { 7176b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn Slog.w(TAG, "Layout repeat skipped after too many iterations"); 7177b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes = 0; 7178b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7179b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 71809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int transactionSequence = ++mTransactionSequence; 71819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 71829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Update animations of all applications, including those 71839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // associated with exiting/removed apps 71849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean tokensAnimating = false; 71859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NAT = mAppTokens.size(); 71869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<NAT; i++) { 7187e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if (mAppTokens.get(i).stepAnimationLocked(currentTime, 7188e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn innerDw, innerDh)) { 71899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tokensAnimating = true; 71909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 71919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 71929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NEAT = mExitingAppTokens.size(); 71939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<NEAT; i++) { 7194e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if (mExitingAppTokens.get(i).stepAnimationLocked(currentTime, 7195e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn innerDw, innerDh)) { 71969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tokensAnimating = true; 71979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 71989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 71999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7200b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // SECOND LOOP: Execute animations and update visibility of windows. 7201b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 72028a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "*** ANIM STEP: seq=" 7203de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn + transactionSequence + " tokensAnimating=" 7204de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn + tokensAnimating); 7205de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn 72069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project animating = tokensAnimating; 72079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7208f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn if (mScreenRotationAnimation != null) { 7209f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn if (mScreenRotationAnimation.isAnimating()) { 7210f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn if (mScreenRotationAnimation.stepAnimation(currentTime)) { 7211f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn animating = true; 7212f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } else { 721350660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn screenRotationFinished = true; 721489ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn updateRotation = true; 7215f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } 7216f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } 7217f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } 7218f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn 72199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean tokenMayBeDrawn = false; 72206c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn boolean wallpaperMayChange = false; 7221b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn boolean forceHiding = false; 72226c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn WindowState windowDetachedWallpaper = null; 7223de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn WindowState windowAnimationBackground = null; 7224de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn int windowAnimationBackgroundColor = 0; 72259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 72269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.beginAnimationLw(dw, dh); 72279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7228bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn final int N = mWindows.size(); 7229ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 72309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=N-1; i>=0; i--) { 7231e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 72329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 72339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowManager.LayoutParams attrs = w.mAttrs; 72349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 72359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mSurface != null) { 72368e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn // Take care of the window being ready to display. 72376c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn if (w.commitFinishDrawingLocked(currentTime)) { 72386c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn if ((w.mAttrs.flags 72396c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) { 72408a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 72410586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn "First draw done in potential wallpaper target " + w); 72426c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn wallpaperMayChange = true; 72436c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn } 72446c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn } 7245ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 72466c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn final boolean wasAnimating = w.mAnimating; 72478e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn 7248e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn int animDw = innerDw; 7249e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn int animDh = innerDh; 72508e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn 72518e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn // If the window has moved due to its containing 72528e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn // content frame changing, then we'd like to animate 72538e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn // it. The checks here are ordered by what is least 72543fe7f2f2e35692fe563ae00f62995030f1987c4fJoe Onorato // likely to be true first. 72551c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn if (w.shouldAnimateMove()) { 72568e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn // Frame has moved, containing content frame 72578e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn // has also moved, and we're not currently animating... 72588e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn // let's do something. 72598e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn Animation a = AnimationUtils.loadAnimation(mContext, 72608e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn com.android.internal.R.anim.window_move_from_decor); 72618e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn w.setAnimation(a); 72628e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn animDw = w.mLastFrame.left - w.mFrame.left; 72638e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn animDh = w.mLastFrame.top - w.mFrame.top; 72648e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn } 72658e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn 72668e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn // Execute animation. 72678e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn final boolean nowAnimating = w.stepAnimationLocked(currentTime, 72688e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn animDw, animDh); 72696c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn 72706c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // If this window is animating, make a note that we have 72716c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // an animating window and take care of a request to run 72726c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // a detached wallpaper animation. 72736c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (nowAnimating) { 7274de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (w.mAnimation != null) { 7275de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (w.mAnimation.getDetachWallpaper()) { 7276de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn windowDetachedWallpaper = w; 7277de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 7278de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (w.mAnimation.getBackgroundColor() != 0) { 7279de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn windowAnimationBackground = w; 7280de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn windowAnimationBackgroundColor = 7281de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn w.mAnimation.getBackgroundColor(); 7282de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 72836c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn } 72849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project animating = true; 72859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 72866c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn 72876c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // If this window's app token is running a detached wallpaper 72886c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // animation, make a note so we can ensure the wallpaper is 72896c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // displayed behind it. 7290de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (w.mAppToken != null && w.mAppToken.animation != null) { 7291de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (w.mAppToken.animation.getDetachWallpaper()) { 7292de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn windowDetachedWallpaper = w; 7293de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 7294de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (w.mAppToken.animation.getBackgroundColor() != 0) { 7295de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn windowAnimationBackground = w; 7296de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn windowAnimationBackgroundColor = 7297de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn w.mAppToken.animation.getBackgroundColor(); 7298de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 72996c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn } 73006c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn 73016136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn if (wasAnimating && !w.mAnimating && mWallpaperTarget == w) { 73026136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn wallpaperMayChange = true; 73036136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn } 7304ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 73053b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (mPolicy.doesForceHide(w, attrs)) { 73066c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (!wasAnimating && nowAnimating) { 730720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (DEBUG_VISIBILITY) Slog.v(TAG, 73086c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn "Animation started that could impact force hide: " 730920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn + w); 73103b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn wallpaperForceHidingChanged = true; 7311b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn mFocusMayChange = true; 73123b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else if (w.isReadyForDisplay() && w.mAnimation == null) { 73133b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn forceHiding = true; 73143b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 73153b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else if (mPolicy.canBeForceHidden(w, attrs)) { 73163b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn boolean changed; 73173b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (forceHiding) { 73183b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn changed = w.hideLw(false, false); 731920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (DEBUG_VISIBILITY && changed) Slog.v(TAG, 732020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn "Now policy hidden: " + w); 73213b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else { 73223b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn changed = w.showLw(false, false); 732320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (DEBUG_VISIBILITY && changed) Slog.v(TAG, 732420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn "Now policy shown: " + w); 732520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (changed) { 732620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (wallpaperForceHidingChanged 7327b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn && w.isVisibleNow() /*w.isReadyForDisplay()*/) { 732820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn // Assume we will need to animate. If 732920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn // we don't (because the wallpaper will 733020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn // stay with the lock screen), then we will 733120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn // clean up later. 733220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn Animation a = mPolicy.createForceHideEnterAnimation(); 733320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (a != null) { 733420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn w.setAnimation(a); 733520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn } 733620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn } 733720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (mCurrentFocus == null || 733820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn mCurrentFocus.mLayer < w.mLayer) { 733920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn // We are showing on to of the current 734020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn // focus, so re-evaluate focus to make 734120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn // sure it is correct. 734220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn mFocusMayChange = true; 73433b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 73443b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 73453b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 73463b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (changed && (attrs.flags 73473b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) { 73483b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn wallpaperMayChange = true; 73493b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 73503b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 7351ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 73529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.animatingWindowLw(w, attrs); 73539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 73549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 73559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken atoken = w.mAppToken; 73569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken != null && (!atoken.allDrawn || atoken.freezingScreen)) { 73579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken.lastTransactionSequence != transactionSequence) { 73589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.lastTransactionSequence = transactionSequence; 73599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.numInterestingWindows = atoken.numDrawnWindows = 0; 73609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.startingDisplayed = false; 73619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 73629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((w.isOnScreen() || w.mAttrs.type 73639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project == WindowManager.LayoutParams.TYPE_BASE_APPLICATION) 73649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && !w.mExiting && !w.mDestroying) { 73659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) { 73668a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Eval win " + w + ": isDrawn=" 73677433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn + w.isDrawnLw() 73689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", isAnimating=" + w.isAnimating()); 73697433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn if (!w.isDrawnLw()) { 73708a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Not displayed: s=" + w.mSurface 73719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " pv=" + w.mPolicyVisibility 73729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " dp=" + w.mDrawPending 73739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " cdp=" + w.mCommitDrawPending 73749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " ah=" + w.mAttachedHidden 73759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " th=" + atoken.hiddenRequested 73769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " a=" + w.mAnimating); 73779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 73789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 73799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w != atoken.startingWindow) { 73809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!atoken.freezingScreen || !w.mAppFreezing) { 73819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.numInterestingWindows++; 73827433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn if (w.isDrawnLw()) { 73839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.numDrawnWindows++; 73848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) Slog.v(TAG, 73859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "tokenMayBeDrawn: " + atoken 73869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " freezingScreen=" + atoken.freezingScreen 73879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAppFreezing=" + w.mAppFreezing); 73889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tokenMayBeDrawn = true; 73899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 73909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 73917433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn } else if (w.isDrawnLw()) { 73929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.startingDisplayed = true; 73939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 73949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 73959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (w.mReadyToShow) { 73969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.performShowLocked(); 73979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 73989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 73999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7400b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes |= mPolicy.finishAnimationLw(); 74019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 74029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tokenMayBeDrawn) { 74039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // See if any windows have been drawn, so they (and others 74049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // associated with them) can now be shown. 7405f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn final int NT = mAppTokens.size(); 74069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<NT; i++) { 7407f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn AppWindowToken wtoken = mAppTokens.get(i); 74089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.freezingScreen) { 74099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numInteresting = wtoken.numInterestingWindows; 74109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) { 74118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY) Slog.v(TAG, 74129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "allDrawn: " + wtoken 74139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " interesting=" + numInteresting 74149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " drawn=" + wtoken.numDrawnWindows); 74159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.showAllWindowsLocked(); 74169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsetAppFreezingScreenLocked(wtoken, false, true); 74179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project orientationChangeComplete = true; 74189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (!wtoken.allDrawn) { 74209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numInteresting = wtoken.numInterestingWindows; 74219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) { 74228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY) Slog.v(TAG, 74239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "allDrawn: " + wtoken 74249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " interesting=" + numInteresting 74259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " drawn=" + wtoken.numDrawnWindows); 74269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.allDrawn = true; 7427b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM; 74289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 74299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We can now show all of the drawn windows! 74309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mOpeningApps.contains(wtoken)) { 74319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.showAllWindowsLocked(); 74329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 74389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are ready to perform an app transition, check through 74399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // all of the app tokens to be shown and see if they are ready 74409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to go. 74419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAppTransitionReady) { 74429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NN = mOpeningApps.size(); 74439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean goodToGo = true; 74448a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 74459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Checking " + NN + " opening apps (frozen=" 74469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mDisplayFrozen + " timeout=" 74479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mAppTransitionTimeout + ")..."); 74489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mDisplayFrozen && !mAppTransitionTimeout) { 74499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the display isn't frozen, wait to do anything until 74509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // all of the apps are ready. Otherwise just go because 74519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we'll unfreeze the display when everyone is ready. 74529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<NN && goodToGo; i++) { 74539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = mOpeningApps.get(i); 74548a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 74559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Check opening app" + wtoken + ": allDrawn=" 74569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken.allDrawn + " startingDisplayed=" 74579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken.startingDisplayed); 74589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!wtoken.allDrawn && !wtoken.startingDisplayed 74599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && !wtoken.startingMoved) { 74609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goodToGo = false; 74619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (goodToGo) { 74658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO"); 74669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int transit = mNextAppTransition; 74679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSkipAppTransitionAnimation) { 7468bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn transit = WindowManagerPolicy.TRANSIT_UNSET; 74699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7470bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET; 74719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTransitionReady = false; 7472a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mAppTransitionRunning = true; 74739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTransitionTimeout = false; 74749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartingIconInTransition = false; 74759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSkipAppTransitionAnimation = false; 74769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 74779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.removeMessages(H.APP_TRANSITION_TIMEOUT); 74789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7479a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // If there are applications waiting to come to the 7480a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // top of the stack, now is the time to move their windows. 7481a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // (Note that we don't do apps going to the bottom 7482a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // here -- we want to keep their windows in the old 7483a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // Z-order until the animation completes.) 7484a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (mToTopApps.size() > 0) { 7485a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn NN = mAppTokens.size(); 7486a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn for (i=0; i<NN; i++) { 7487a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn AppWindowToken wtoken = mAppTokens.get(i); 7488a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (wtoken.sendingToTop) { 7489a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wtoken.sendingToTop = false; 7490a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn moveAppWindowsLocked(wtoken, NN, false); 7491a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 7492a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 7493a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToTopApps.clear(); 7494a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 7495ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 749625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn WindowState oldWallpaper = mWallpaperTarget; 7497ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 74983be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn adjustWallpaperWindowsLocked(); 74996c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn wallpaperMayChange = false; 7500ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 7501bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // The top-most window will supply the layout params, 7502bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // and we will determine it below. 7503bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn LayoutParams animLp = null; 7504bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn int bestAnimLayer = -1; 750508121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn boolean fullscreenAnim = false; 7506ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 75078a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 75083be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn "New wallpaper target=" + mWallpaperTarget 75093be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn + ", lower target=" + mLowerWallpaperTarget 75103be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn + ", upper target=" + mUpperWallpaperTarget); 751125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn int foundWallpapers = 0; 7512bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // Do a first pass through the tokens for two 7513bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // things: 7514bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // (1) Determine if both the closing and opening 7515bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // app token sets are wallpaper targets, in which 7516bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // case special animations are needed 7517bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // (since the wallpaper needs to stay static 7518bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // behind them). 7519bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // (2) Find the layout params of the top-most 7520bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // application window in the tokens, which is 7521bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // what will control the animation theme. 7522bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn final int NC = mClosingApps.size(); 7523bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn NN = NC + mOpeningApps.size(); 7524bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn for (i=0; i<NN; i++) { 7525bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn AppWindowToken wtoken; 7526bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn int mode; 7527bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn if (i < NC) { 7528bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn wtoken = mClosingApps.get(i); 7529bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn mode = 1; 7530bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn } else { 7531bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn wtoken = mOpeningApps.get(i-NC); 7532bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn mode = 2; 7533f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 7534bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn if (mLowerWallpaperTarget != null) { 7535bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn if (mLowerWallpaperTarget.mAppToken == wtoken 7536bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn || mUpperWallpaperTarget.mAppToken == wtoken) { 7537bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn foundWallpapers |= mode; 7538f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 7539bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn } 7540bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn if (wtoken.appFullscreen) { 7541bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn WindowState ws = wtoken.findMainWindow(); 7542bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn if (ws != null) { 7543ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn animLp = ws.mAttrs; 7544ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn bestAnimLayer = ws.mLayer; 754508121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn fullscreenAnim = true; 754608121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn } 754708121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn } else if (!fullscreenAnim) { 754808121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn WindowState ws = wtoken.findMainWindow(); 754908121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn if (ws != null) { 755008121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn if (ws.mLayer > bestAnimLayer) { 7551bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn animLp = ws.mAttrs; 7552bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn bestAnimLayer = ws.mLayer; 7553bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn } 7554f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 7555f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 755625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn } 7557ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 755825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn if (foundWallpapers == 3) { 75598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 756025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn "Wallpaper animation!"); 756125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn switch (transit) { 756225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN: 756325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_TASK_OPEN: 756425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_TASK_TO_FRONT: 756525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn transit = WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_OPEN; 756625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn break; 756725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE: 756825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_TASK_CLOSE: 756925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_TASK_TO_BACK: 757025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn transit = WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_CLOSE; 757125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn break; 7572f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 75738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 757425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn "New transit: " + transit); 757525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn } else if (oldWallpaper != null) { 757625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn // We are transitioning from an activity with 757725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn // a wallpaper to one without. 757825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn transit = WindowManagerPolicy.TRANSIT_WALLPAPER_CLOSE; 75798a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 758025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn "New transit away from wallpaper: " + transit); 758125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn } else if (mWallpaperTarget != null) { 758225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn // We are transitioning from an activity without 758325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn // a wallpaper to now showing the wallpaper 758425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn transit = WindowManagerPolicy.TRANSIT_WALLPAPER_OPEN; 75858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 758625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn "New transit into wallpaper: " + transit); 7587f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 7588ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 7589de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn // If all closing windows are obscured, then there is 7590de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn // no need to do an animation. This is the case, for 7591de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn // example, when this transition is being done behind 7592de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn // the lock screen. 7593de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn if (!mPolicy.allowAppAnimationsLw()) { 7594de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn animLp = null; 7595de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn } 7596de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn 75979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NN = mOpeningApps.size(); 75989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<NN; i++) { 75999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = mOpeningApps.get(i); 76008a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 76019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Now opening app" + wtoken); 76029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.reportedVisible = false; 76039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.inPendingTransaction = false; 760483360b3167f2c394125b74f655bc577070cb9ccaDianne Hackborn wtoken.animation = null; 7605e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn setTokenVisibilityLocked(wtoken, animLp, true, 7606ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn transit, false); 76079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.updateReportedVisibilityLocked(); 7608a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wtoken.waitingToShow = false; 76099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.showAllWindowsLocked(); 76109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 76119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NN = mClosingApps.size(); 76129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<NN; i++) { 76139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = mClosingApps.get(i); 76148a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 76159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Now closing app" + wtoken); 76169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.inPendingTransaction = false; 761783360b3167f2c394125b74f655bc577070cb9ccaDianne Hackborn wtoken.animation = null; 7618e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn setTokenVisibilityLocked(wtoken, animLp, false, 7619ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn transit, false); 76209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.updateReportedVisibilityLocked(); 7621a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wtoken.waitingToHide = false; 76229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Force the allDrawn flag, because we want to start 76239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this guy's animations regardless of whether it's 76249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // gotten drawn. 76259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.allDrawn = true; 76269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 76279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 76288b571a817cc953ce96750f440645f104c7f55157Dianne Hackborn mNextAppTransitionPackage = null; 7629ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 76309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOpeningApps.clear(); 76319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClosingApps.clear(); 76329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 76339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This has changed the visibility of windows, so perform 76349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // a new layout to get them all up-to-date. 763594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT 763694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn | WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG; 76379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 763820583ff9d49257bd4ccc60e7b6337661e34ed887Dianne Hackborn if (!moveInputMethodWindowsIfNeededLocked(true)) { 763920583ff9d49257bd4ccc60e7b6337661e34ed887Dianne Hackborn assignLayersLocked(); 764020583ff9d49257bd4ccc60e7b6337661e34ed887Dianne Hackborn } 76413a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES, 76423a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/); 7643b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn mFocusMayChange = false; 76449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 76459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7646ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 764716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn int adjResult = 0; 764816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn 7649a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (!animating && mAppTransitionRunning) { 7650a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // We have finished the animation of an app transition. To do 7651a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // this, we have delayed a lot of operations like showing and 7652a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // hiding apps, moving apps in Z-order, etc. The app token list 7653a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // reflects the correct Z-order, but the window list may now 7654a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // be out of sync with it. So here we will just rebuild the 7655a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // entire app window list. Fun! 7656a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mAppTransitionRunning = false; 7657a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // Clear information about apps that were moving. 7658a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToBottomApps.clear(); 7659ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 7660a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn rebuildAppWindowListLocked(); 7661b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT; 766216064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn adjResult |= ADJUST_WALLPAPER_LAYERS_CHANGED; 7663a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn moveInputMethodWindowsIfNeededLocked(false); 7664a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wallpaperMayChange = true; 7665c9568e3989f1491abaa7960eca986af12743cb05Suchi Amalapurapu // Since the window list has been rebuilt, focus might 7666c9568e3989f1491abaa7960eca986af12743cb05Suchi Amalapurapu // have to be recomputed since the actual order of windows 7667c9568e3989f1491abaa7960eca986af12743cb05Suchi Amalapurapu // might have changed again. 7668b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn mFocusMayChange = true; 7669a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 7670ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 7671b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (wallpaperForceHidingChanged && changes == 0 && !mAppTransitionReady) { 76723b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // At this point, there was a window with a wallpaper that 76733b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // was force hiding other windows behind it, but now it 76743b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // is going away. This may be simple -- just animate 76753b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // away the wallpaper and its window -- or it may be 76763b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // hard -- the wallpaper now needs to be shown behind 76773b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // something that was hidden. 76783b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn WindowState oldWallpaper = mWallpaperTarget; 7679de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn if (mLowerWallpaperTarget != null 7680de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn && mLowerWallpaperTarget.mAppToken != null) { 76818a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 7682de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn "wallpaperForceHiding changed with lower=" 7683de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn + mLowerWallpaperTarget); 76848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 7685de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn "hidden=" + mLowerWallpaperTarget.mAppToken.hidden + 7686de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn " hiddenRequested=" + mLowerWallpaperTarget.mAppToken.hiddenRequested); 7687de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn if (mLowerWallpaperTarget.mAppToken.hidden) { 7688de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn // The lower target has become hidden before we 7689de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn // actually started the animation... let's completely 7690de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn // re-evaluate everything. 7691de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn mLowerWallpaperTarget = mUpperWallpaperTarget = null; 7692b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM; 7693de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn } 7694de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn } 769516064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn adjResult |= adjustWallpaperWindowsLocked(); 76963b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn wallpaperMayChange = false; 7697de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn wallpaperForceHidingChanged = false; 76988a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "****** OLD: " + oldWallpaper 7699de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn + " NEW: " + mWallpaperTarget 7700de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn + " LOWER: " + mLowerWallpaperTarget); 77013b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (mLowerWallpaperTarget == null) { 77023b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // Whoops, we don't need a special wallpaper animation. 77033b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // Clear them out. 77043b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn forceHiding = false; 77053b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn for (i=N-1; i>=0; i--) { 7706e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 77073b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (w.mSurface != null) { 77083b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn final WindowManager.LayoutParams attrs = w.mAttrs; 7709c03d28b9e96f667d29ec6e480bed171bbd07169dSuchi Amalapurapu if (mPolicy.doesForceHide(w, attrs) && w.isVisibleLw()) { 77108a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_FOCUS) Slog.i(TAG, "win=" + w + " force hides other windows"); 77113b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn forceHiding = true; 77123b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else if (mPolicy.canBeForceHidden(w, attrs)) { 77133b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (!w.mAnimating) { 77143b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // We set the animation above so it 77153b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // is not yet running. 77163b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn w.clearAnimation(); 77173b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 77183b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 77193b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 77203b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 77213b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 77223b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 7723ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 77246c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (mWindowDetachedWallpaper != windowDetachedWallpaper) { 77256c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (DEBUG_WALLPAPER) Slog.v(TAG, 77266c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn "Detached wallpaper changed from " + mWindowDetachedWallpaper 77276c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn + windowDetachedWallpaper); 77286c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn mWindowDetachedWallpaper = windowDetachedWallpaper; 77296c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn wallpaperMayChange = true; 77306c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn } 77316c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn 7732de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (windowAnimationBackgroundColor != 0) { 7733de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (mWindowAnimationBackgroundSurface == null) { 7734de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mWindowAnimationBackgroundSurface = new DimSurface(mFxSession); 7735de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 7736de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mWindowAnimationBackgroundSurface.show(dw, dh, 7737de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn windowAnimationBackground.mAnimLayer - LAYER_OFFSET_DIM, 7738de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn windowAnimationBackgroundColor); 7739de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } else if (mWindowAnimationBackgroundSurface != null) { 7740de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mWindowAnimationBackgroundSurface.hide(); 7741de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 7742de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn 77436c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn if (wallpaperMayChange) { 77448a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 77450586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn "Wallpaper may change! Adjusting"); 774616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn adjResult |= adjustWallpaperWindowsLocked(); 77473b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 7748ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 77493b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if ((adjResult&ADJUST_WALLPAPER_LAYERS_CHANGED) != 0) { 77508a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 77513b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn "Wallpaper layer changed: assigning layers + relayout"); 7752b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT; 77533b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn assignLayersLocked(); 77543b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else if ((adjResult&ADJUST_WALLPAPER_VISIBILITY_CHANGED) != 0) { 77558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 77563b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn "Wallpaper visibility changed: relayout"); 7757b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT; 77583b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 7759ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 7760b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn if (mFocusMayChange) { 7761b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn mFocusMayChange = false; 77623a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown if (updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES, 77633a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/)) { 7764b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM; 77653b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn adjResult = 0; 7766a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 77676c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn } 77683b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn 77693b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (mLayoutNeeded) { 7770b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT; 77713b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 7772ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 7773b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "*** ANIM STEP: changes=0x" 7774b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + Integer.toHexString(changes)); 7775b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } while (changes != 0); 77769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 77779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // THIRD LOOP: Update the surfaces of all windows. 77789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 77799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean someoneLosingFocus = mLosingFocus.size() != 0; 77809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 77819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean obscured = false; 77829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean blurring = false; 77839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean dimming = false; 77849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean covered = false; 77859ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn boolean syswin = false; 77869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7787bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn final int N = mWindows.size(); 7788ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 77899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=N-1; i>=0; i--) { 7790e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 77919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 77929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean displayed = false; 77939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowManager.LayoutParams attrs = w.mAttrs; 77949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int attrFlags = attrs.flags; 77959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 77969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mSurface != null) { 7797ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // XXX NOTE: The logic here could be improved. We have 7798ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // the decision about whether to resize a window separated 7799ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // from whether to hide the surface. This can cause us to 7800ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // resize a surface even if we are going to hide it. You 7801ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // can see this by (1) holding device in landscape mode on 7802ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // home screen; (2) tapping browser icon (device will rotate 7803ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // to landscape; (3) tap home. The wallpaper will be resized 7804ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // in step 2 but then immediately hidden, causing us to 7805ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // have to resize and then redraw it again in step 3. It 7806ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // would be nice to figure out how to avoid this, but it is 7807ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // difficult because we do need to resize surfaces in some 7808ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // cases while they are hidden such as when first showing a 7809ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // window. 7810ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn 78119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.computeShownFrameLocked(); 78128a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v( 78139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Placing surface #" + i + " " + w.mSurface 7814ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn + ": new=" + w.mShownFrame); 78159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 78169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int width, height; 78179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((w.mAttrs.flags & w.mAttrs.FLAG_SCALED) != 0) { 78189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // for a scaled surface, we just want to use 78199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the requested size. 78209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project width = w.mRequestedWidth; 78219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project height = w.mRequestedHeight; 78229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7823ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn width = w.mCompatFrame.width(); 7824ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn height = w.mCompatFrame.height(); 78259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 78269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7827fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown if (w.mSurface != null) { 7828fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown if (w.mSurfaceX != w.mShownFrame.left 7829fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown || w.mSurfaceY != w.mShownFrame.top) { 7830fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown try { 7831fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown if (SHOW_TRANSACTIONS) logSurface(w, 7832fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown "POS " + w.mShownFrame.left 7833fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + ", " + w.mShownFrame.top, null); 7834fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown w.mSurfaceX = w.mShownFrame.left; 7835fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown w.mSurfaceY = w.mShownFrame.top; 7836fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown w.mSurface.setPosition(w.mShownFrame.left, w.mShownFrame.top); 7837fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown } catch (RuntimeException e) { 7838fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown Slog.w(TAG, "Error positioning surface of " + w 7839fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + " pos=(" + w.mShownFrame.left 7840fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + "," + w.mShownFrame.top + ")", e); 7841fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown if (!recoveringMemory) { 7842648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn reclaimSomeSurfaceMemoryLocked(w, "position", true); 7843fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown } 7844fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown } 7845fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown } 7846fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown 7847fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown if (width < 1) { 7848fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown width = 1; 7849fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown } 7850fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown if (height < 1) { 7851fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown height = 1; 7852fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown } 7853fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown 7854fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown if (w.mSurfaceW != width || w.mSurfaceH != height) { 78559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7856b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (SHOW_TRANSACTIONS) logSurface(w, 7857fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown "SIZE " + w.mShownFrame.width() + "x" 7858b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + w.mShownFrame.height(), null); 7859ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn w.mSurfaceResized = true; 786016064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn w.mSurfaceW = width; 786116064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn w.mSurfaceH = height; 78629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mSurface.setSize(width, height); 78639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 78649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If something goes wrong with the surface (such 78659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // as running out of memory), don't take down the 78669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // entire system. 7867fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown Slog.e(TAG, "Error resizing surface of " + w 7868fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + " size=(" + width + "x" + height + ")", e); 78699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!recoveringMemory) { 7870648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn reclaimSomeSurfaceMemoryLocked(w, "size", true); 78719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 78729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 78739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 78749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7875fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown 7876e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (!w.mAppFreezing && w.mLayoutSeq == mLayoutSeq) { 78779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mContentInsetsChanged = 78789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project !w.mLastContentInsets.equals(w.mContentInsets); 78799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mVisibleInsetsChanged = 78809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project !w.mLastVisibleInsets.equals(w.mVisibleInsets); 7881e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean configChanged = 7882e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn w.mConfiguration != mCurConfiguration 7883e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn && (w.mConfiguration == null 7884e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn || mCurConfiguration.diff(w.mConfiguration) != 0); 7885694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn if (DEBUG_CONFIGURATION && configChanged) { 7886694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn Slog.v(TAG, "Win " + w + " config changed: " 7887694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn + mCurConfiguration); 7888694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn } 78898a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v(TAG, "Resizing " + w 7890e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn + ": configChanged=" + configChanged 7891ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn + " last=" + w.mLastCompatFrame + " frame=" + w.mCompatFrame); 7892ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn boolean frameChanged = !w.mLastCompatFrame.equals(w.mCompatFrame); 7893fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown if (frameChanged 78949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mContentInsetsChanged 7895e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn || w.mVisibleInsetsChanged 7896ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn || w.mSurfaceResized 7897e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn || configChanged) { 7898fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown if (DEBUG_RESIZE || DEBUG_ORIENTATION) { 7899fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown Slog.v(TAG, "Resize reasons: " 7900fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + "frameChanged=" + frameChanged 7901fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + " contentInsetsChanged=" + w.mContentInsetsChanged 7902fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + " visibleInsetsChanged=" + w.mVisibleInsetsChanged 7903fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + " surfaceResized=" + w.mSurfaceResized 7904fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + " configChanged=" + configChanged); 7905fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown } 7906fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown 79079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastFrame.set(w.mFrame); 7908ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn w.mLastCompatFrame.set(w.mCompatFrame); 79099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastContentInsets.set(w.mContentInsets); 79109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastVisibleInsets.set(w.mVisibleInsets); 79110586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // If the screen is currently frozen, then keep 79120586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // it frozen until this window draws at its new 79130586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // orientation. 79140586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn if (mDisplayFrozen) { 79158a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, 79160586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn "Resizing while display frozen: " + w); 79170586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn w.mOrientationChanging = true; 7918e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (!mWindowsFreezingScreen) { 79190586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn mWindowsFreezingScreen = true; 79200586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // XXX should probably keep timeout from 79210586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // when we first froze the display. 79220586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT); 79230586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn mH.sendMessageDelayed(mH.obtainMessage( 79240586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn H.WINDOW_FREEZE_TIMEOUT), 2000); 79250586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn } 79260586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn } 79279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the orientation is changing, then we need to 79289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // hold off on unfreezing the display until this 79299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // window has been redrawn; to do that, we need 79309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to go through the process of getting informed 79319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // by the application when it has finished drawing. 79329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mOrientationChanging) { 79338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, 79349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Orientation start waiting for draw in " 79359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + w + ", surface " + w.mSurface); 79369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mDrawPending = true; 79379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mCommitDrawPending = false; 79389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mReadyToShow = false; 79399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mAppToken != null) { 79409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mAppToken.allDrawn = false; 79419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 79429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7943ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn if (DEBUG_RESIZE || DEBUG_ORIENTATION) Slog.v(TAG, 7944ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn "Resizing window " + w + " to " + w.mCompatFrame); 79459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResizingWindows.add(w); 79469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (w.mOrientationChanging) { 79479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!w.mDrawPending && !w.mCommitDrawPending) { 79488a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, 79499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Orientation not waiting for draw in " 79509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + w + ", surface " + w.mSurface); 79519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mOrientationChanging = false; 79529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 79539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 79549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 79559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 79563b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (w.mAttachedHidden || !w.isReadyForDisplay()) { 79579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!w.mLastHidden) { 79589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //dump(); 79599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastHidden = true; 7960b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (SHOW_TRANSACTIONS) logSurface(w, 7961b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn "HIDE (performLayout)", null); 79629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mSurface != null) { 796316064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn w.mSurfaceShown = false; 79649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 79659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mSurface.hide(); 79669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 79678a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Exception hiding surface in " + w); 79689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 79699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 79709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 79719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are waiting for this window to handle an 79729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // orientation change, well, it is hidden, so 79739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // doesn't really matter. Note that this does 79749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // introduce a potential glitch if the window 79759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // becomes unhidden before it has drawn for the 79769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // new orientation. 79779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mOrientationChanging) { 79789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mOrientationChanging = false; 79798a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, 79809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Orientation change skips hidden " + w); 79819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 79829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (w.mLastLayer != w.mAnimLayer 79839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mLastAlpha != w.mShownAlpha 79849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mLastDsDx != w.mDsDx 79859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mLastDtDx != w.mDtDx 79869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mLastDsDy != w.mDsDy 79879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mLastDtDy != w.mDtDy 79889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mLastHScale != w.mHScale 79899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mLastVScale != w.mVScale 79909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mLastHidden) { 79919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayed = true; 79929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastAlpha = w.mShownAlpha; 79939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastLayer = w.mAnimLayer; 79949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastDsDx = w.mDsDx; 79959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastDtDx = w.mDtDx; 79969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastDsDy = w.mDsDy; 79979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastDtDy = w.mDtDy; 79989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastHScale = w.mHScale; 79999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastVScale = w.mVScale; 8000b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (SHOW_TRANSACTIONS) logSurface(w, 8001b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn "alpha=" + w.mShownAlpha + " layer=" + w.mAnimLayer 80020586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn + " matrix=[" + (w.mDsDx*w.mHScale) 80030586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn + "," + (w.mDtDx*w.mVScale) 80040586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn + "][" + (w.mDsDy*w.mHScale) 8005b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + "," + (w.mDtDy*w.mVScale) + "]", null); 80069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mSurface != null) { 80079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 800816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn w.mSurfaceAlpha = w.mShownAlpha; 80099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mSurface.setAlpha(w.mShownAlpha); 801016064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn w.mSurfaceLayer = w.mAnimLayer; 80119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mSurface.setLayer(w.mAnimLayer); 80129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mSurface.setMatrix( 80139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mDsDx*w.mHScale, w.mDtDx*w.mVScale, 80149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mDsDy*w.mHScale, w.mDtDy*w.mVScale); 80159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 80168a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Error updating surface in " + w, e); 80179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!recoveringMemory) { 8018648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn reclaimSomeSurfaceMemoryLocked(w, "update", true); 80199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 80239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mLastHidden && !w.mDrawPending 80249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && !w.mCommitDrawPending 80259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && !w.mReadyToShow) { 8026b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (SHOW_TRANSACTIONS) logSurface(w, 8027b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn "SHOW (performLayout)", null); 80288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + w 80299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " during relayout"); 80309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (showSurfaceRobustlyLocked(w)) { 80319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mHasDrawn = true; 80329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastHidden = false; 80339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 80349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mOrientationChanging = false; 80359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mSurface != null) { 80389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mToken.hasVisible = true; 80399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 80419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayed = true; 80429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 80449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (displayed) { 80459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!covered) { 8046980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy if (attrs.width == LayoutParams.MATCH_PARENT 8047980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy && attrs.height == LayoutParams.MATCH_PARENT) { 80489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project covered = true; 80499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mOrientationChanging) { 80529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mDrawPending || w.mCommitDrawPending) { 80539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project orientationChangeComplete = false; 80548a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, 80559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Orientation continue waiting for draw in " + w); 80569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 80579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mOrientationChanging = false; 80588a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, 80599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Orientation change complete in " + w); 80609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mToken.hasVisible = true; 80639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (w.mOrientationChanging) { 80658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, 80669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Orientation change skips hidden " + w); 80679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mOrientationChanging = false; 80689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 80700f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn if (w.mContentChanged) { 80710f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn //Slog.i(TAG, "Window " + this + " clearing mContentChanged - done placing"); 80720f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn w.mContentChanged = false; 80730f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn } 80740f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn 80759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean canBeSeen = w.isDisplayedLw(); 80769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 80779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (someoneLosingFocus && w == mCurrentFocus && canBeSeen) { 80789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project focusDisplayed = true; 80799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8081e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn final boolean obscuredChanged = w.mObscured != obscured; 8082ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 80839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Update effect. 80847341d7a104b47996445d069a695e155a07184606Dianne Hackborn if (!(w.mObscured=obscured)) { 80859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mSurface != null) { 80869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((attrFlags&FLAG_KEEP_SCREEN_ON) != 0) { 80879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project holdScreen = w.mSession; 80889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80899ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn if (!syswin && w.mAttrs.screenBrightness >= 0 80909ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn && screenBrightness < 0) { 80919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project screenBrightness = w.mAttrs.screenBrightness; 80929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8093fb73f79340375013225618a5d87f46b958f698efMike Lockwood if (!syswin && w.mAttrs.buttonBrightness >= 0 8094fb73f79340375013225618a5d87f46b958f698efMike Lockwood && buttonBrightness < 0) { 8095fb73f79340375013225618a5d87f46b958f698efMike Lockwood buttonBrightness = w.mAttrs.buttonBrightness; 8096fb73f79340375013225618a5d87f46b958f698efMike Lockwood } 809746af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood if (canBeSeen 809846af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood && (attrs.type == WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG 809946af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood || attrs.type == WindowManager.LayoutParams.TYPE_KEYGUARD 810046af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood || attrs.type == WindowManager.LayoutParams.TYPE_SYSTEM_ERROR)) { 81019ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn syswin = true; 81029ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn } 81039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81041ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima 810525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn boolean opaqueDrawn = canBeSeen && w.isOpaqueDrawn(); 8106e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if (opaqueDrawn && w.isFullscreen(innerDw, innerDh)) { 81079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This window completely covers everything behind it, 81089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // so we want to leave all of them as unblurred (for 81099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // performance reasons). 81109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project obscured = true; 81113b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else if (canBeSeen && !obscured && 81129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (attrFlags&FLAG_BLUR_BEHIND|FLAG_DIM_BEHIND) != 0) { 81138a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v(TAG, "Win " + w 81149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": blurring=" + blurring 81159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " obscured=" + obscured 81169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " displayed=" + displayed); 81179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((attrFlags&FLAG_DIM_BEHIND) != 0) { 81189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!dimming) { 81198a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "DIM BEHIND: " + w); 81209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dimming = true; 81210a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima if (mDimAnimator == null) { 81220a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima mDimAnimator = new DimAnimator(mFxSession); 81239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 812448a7651823030ed3c0f4c084b423430044425feaDianne Hackborn mDimAnimator.show(innerDw, innerDh); 81251c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn mDimAnimator.updateParameters(mContext.getResources(), 81261c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn w, currentTime); 81279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((attrFlags&FLAG_BLUR_BEHIND) != 0) { 81309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!blurring) { 81318a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "BLUR BEHIND: " + w); 81329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project blurring = true; 81339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBlurSurface == null) { 81349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 813506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy mBlurSurface = new Surface(mFxSession, 0, 81365d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian "BlurSurface", 81379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -1, 16, 16, 81389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PixelFormat.OPAQUE, 81399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Surface.FX_SURFACE_BLUR); 81409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 81418a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.e(TAG, "Exception creating Blur surface", e); 81429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8143ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, " BLUR " 8144ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn + mBlurSurface + ": CREATE"); 81459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBlurSurface != null) { 814716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, " BLUR " 814816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn + mBlurSurface + ": pos=(0,0) (" + 814916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn dw + "x" + dh + "), layer=" + (w.mAnimLayer-1)); 81509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBlurSurface.setPosition(0, 0); 81519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBlurSurface.setSize(dw, dh); 8152de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mBlurSurface.setLayer(w.mAnimLayer-LAYER_OFFSET_BLUR); 815316064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn if (!mBlurShown) { 815416064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn try { 815516064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, " BLUR " 815616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn + mBlurSurface + ": SHOW"); 815716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn mBlurSurface.show(); 815816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn } catch (RuntimeException e) { 815916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn Slog.w(TAG, "Failure showing blur surface", e); 816016064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn } 816116064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn mBlurShown = true; 81629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8168ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 8169e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn if (obscuredChanged && mWallpaperTarget == w) { 8170e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn // This is the wallpaper target and its obscured state 8171e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn // changed... make sure the current wallaper's visibility 8172e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn // has been updated accordingly. 8173e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn updateWallpaperVisibilityLocked(); 8174e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 81759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8176ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 81770a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima if (mDimAnimator != null && mDimAnimator.mDimShown) { 8178de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn animating |= mDimAnimator.updateSurface(dimming, currentTime, 8179de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn mDisplayFrozen || !mPolicy.isScreenOn()); 81809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 818106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 81829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!blurring && mBlurShown) { 81838a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (SHOW_TRANSACTIONS) Slog.i(TAG, " BLUR " + mBlurSurface 81849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": HIDE"); 81859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 81869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBlurSurface.hide(); 81879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalArgumentException e) { 81888a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Illegal argument exception hiding blur surface"); 81899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBlurShown = false; 81919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81927916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 81937916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (mBlackFrame != null) { 81947916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (mScreenRotationAnimation != null) { 81957916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mBlackFrame.setMatrix( 81967916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mScreenRotationAnimation.getEnterTransformation().getMatrix()); 81977916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } else { 81987916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mBlackFrame.clearMatrix(); 81997916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 82007916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 82019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 82028a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.e(TAG, "Unhandled exception in Window Manager", e); 82039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 82049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 82059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Surface.closeTransaction(); 820606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 820794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION performLayoutAndPlaceSurfaces"); 820894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn 8209b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn if (mWatermark != null) { 8210b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn mWatermark.drawIfNeeded(); 8211b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } 8212b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn 82138a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION && mDisplayFrozen) Slog.v(TAG, 82149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "With display frozen, orientationChangeComplete=" 82159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + orientationChangeComplete); 82169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (orientationChangeComplete) { 82179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mWindowsFreezingScreen) { 82189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowsFreezingScreen = false; 82199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT); 82209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8221e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn stopFreezingDisplayLocked(); 82229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 822306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 82249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i = mResizingWindows.size(); 82259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i > 0) { 82269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 82279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 82289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = mResizingWindows.get(i); 82299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8230ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn if (DEBUG_RESIZE || DEBUG_ORIENTATION) Slog.v(TAG, 8231ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn "Reporting new frame to " + win + ": " + win.mCompatFrame); 8232694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn int diff = 0; 8233e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean configChanged = 8234e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn win.mConfiguration != mCurConfiguration 8235e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn && (win.mConfiguration == null 8236694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn || (diff=mCurConfiguration.diff(win.mConfiguration)) != 0); 8237694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn if ((DEBUG_RESIZE || DEBUG_ORIENTATION || DEBUG_CONFIGURATION) 8238694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn && configChanged) { 82398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, "Sending new config to window " + win + ": " 8240ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn + win.mCompatFrame.width() + "x" + win.mCompatFrame.height() 8241694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn + " / " + mCurConfiguration + " / 0x" 8242694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn + Integer.toHexString(diff)); 8243e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 8244694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn win.mConfiguration = mCurConfiguration; 8245ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn win.mClient.resized(win.mCompatFrame.width(), 8246ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn win.mCompatFrame.height(), win.mLastContentInsets, 8247e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn win.mLastVisibleInsets, win.mDrawPending, 8248e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn configChanged ? win.mConfiguration : null); 82499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mContentInsetsChanged = false; 82509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mVisibleInsetsChanged = false; 8251ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn win.mSurfaceResized = false; 82529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 82539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mOrientationChanging = false; 82549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 82559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (i > 0); 82569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResizingWindows.clear(); 82579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 825806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 82599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Destroy the surface of any windows that are no longer visible. 82607341d7a104b47996445d069a695e155a07184606Dianne Hackborn boolean wallpaperDestroyed = false; 82619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i = mDestroySurface.size(); 82629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i > 0) { 82639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 82649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 82659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = mDestroySurface.get(i); 82669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mDestroying = false; 82679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInputMethodWindow == win) { 82689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodWindow = null; 82699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 82707341d7a104b47996445d069a695e155a07184606Dianne Hackborn if (win == mWallpaperTarget) { 82717341d7a104b47996445d069a695e155a07184606Dianne Hackborn wallpaperDestroyed = true; 82727341d7a104b47996445d069a695e155a07184606Dianne Hackborn } 82739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.destroySurfaceLocked(); 82749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (i > 0); 82759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDestroySurface.clear(); 82769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 82779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 82789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Time to remove any exiting tokens? 82799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=mExitingTokens.size()-1; i>=0; i--) { 82809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken token = mExitingTokens.get(i); 82819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!token.hasVisible) { 82829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExitingTokens.remove(i); 82834c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (token.windowType == TYPE_WALLPAPER) { 82844c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mWallpaperTokens.remove(token); 82854c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 82869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 82879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 82889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 82899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Time to remove any exiting applications? 82909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=mExitingAppTokens.size()-1; i>=0; i--) { 82919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken token = mExitingAppTokens.get(i); 82929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!token.hasVisible && !mClosingApps.contains(token)) { 82939bfb707597898f54722460b48588007b682f3e2aDianne Hackborn // Make sure there is no animation running on this token, 82949bfb707597898f54722460b48588007b682f3e2aDianne Hackborn // so any windows associated with it will be removed as 82959bfb707597898f54722460b48588007b682f3e2aDianne Hackborn // soon as their animations are complete 82969bfb707597898f54722460b48588007b682f3e2aDianne Hackborn token.animation = null; 82979bfb707597898f54722460b48588007b682f3e2aDianne Hackborn token.animating = false; 8298f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, 8299f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn "performLayout: App token exiting now removed" + token); 83009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTokens.remove(token); 83019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExitingAppTokens.remove(i); 83029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 83039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 83049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8305a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn boolean needRelayout = false; 8306ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 8307a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (!animating && mAppTransitionRunning) { 8308a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // We have finished the animation of an app transition. To do 8309a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // this, we have delayed a lot of operations like showing and 8310a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // hiding apps, moving apps in Z-order, etc. The app token list 8311a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // reflects the correct Z-order, but the window list may now 8312a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // be out of sync with it. So here we will just rebuild the 8313a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // entire app window list. Fun! 8314a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mAppTransitionRunning = false; 8315a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn needRelayout = true; 8316a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn rebuildAppWindowListLocked(); 831716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn assignLayersLocked(); 8318a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // Clear information about apps that were moving. 8319a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToBottomApps.clear(); 8320a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 8321ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 83229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (focusDisplayed) { 83239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendEmptyMessage(H.REPORT_LOSING_FOCUS); 83249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 83257341d7a104b47996445d069a695e155a07184606Dianne Hackborn if (wallpaperDestroyed) { 83260586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn needRelayout = adjustWallpaperWindowsLocked() != 0; 83277341d7a104b47996445d069a695e155a07184606Dianne Hackborn } 8328a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (needRelayout) { 83297341d7a104b47996445d069a695e155a07184606Dianne Hackborn requestAnimationLocked(0); 83307341d7a104b47996445d069a695e155a07184606Dianne Hackborn } else if (animating) { 83319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestAnimationLocked(currentTime+(1000/60)-SystemClock.uptimeMillis()); 83329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8333eb857f12d605659b385d168ef1ea7d4ba5193585Jeff Brown 83343a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown // Finally update all input windows now that the window changes have stabilized. 83352e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(true /*force*/); 8336eb857f12d605659b385d168ef1ea7d4ba5193585Jeff Brown 83378e03b7566c42621fda01186b66b019142eb84fbfJeff Brown setHoldScreenLocked(holdScreen != null); 8338428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn if (!mDisplayFrozen) { 8339428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn if (screenBrightness < 0 || screenBrightness > 1.0f) { 8340428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn mPowerManager.setScreenBrightnessOverride(-1); 8341428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn } else { 8342428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn mPowerManager.setScreenBrightnessOverride((int) 8343428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn (screenBrightness * Power.BRIGHTNESS_ON)); 8344428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn } 8345428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn if (buttonBrightness < 0 || buttonBrightness > 1.0f) { 8346428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn mPowerManager.setButtonBrightnessOverride(-1); 8347428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn } else { 8348428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn mPowerManager.setButtonBrightnessOverride((int) 8349428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn (buttonBrightness * Power.BRIGHTNESS_ON)); 8350428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn } 8351fb73f79340375013225618a5d87f46b958f698efMike Lockwood } 83529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (holdScreen != mHoldingScreenOn) { 83539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHoldingScreenOn = holdScreen; 83549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = mH.obtainMessage(H.HOLD_SCREEN_CHANGED, holdScreen); 83559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessage(m); 83569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8357ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 835893e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn if (mTurnOnScreen) { 8359b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn if (DEBUG_VISIBILITY) Slog.v(TAG, "Turning screen on after layout!"); 836093e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn mPowerManager.userActivity(SystemClock.uptimeMillis(), false, 836193e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn LocalPowerManager.BUTTON_EVENT, true); 836293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn mTurnOnScreen = false; 836393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn } 8364f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn 836550660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn if (screenRotationFinished && mScreenRotationAnimation != null) { 836650660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn mScreenRotationAnimation.kill(); 836750660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn mScreenRotationAnimation = null; 836850660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn } 836950660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn 837089ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn if (updateRotation) { 837189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation"); 837289ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn boolean changed = setRotationUncheckedLocked( 837389ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn WindowManagerPolicy.USE_LAST_ROTATION, 0, false); 837489ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn if (changed) { 83753e4f9d0452a2592338c15cf1b6d774761b929a28Dianne Hackborn mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION); 837689ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn } 837789ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn } 837889ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn 8379f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn // Check to see if we are now in a state where the screen should 8380f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn // be enabled, because the window obscured flags have changed. 8381f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn enableScreenIfNeededLocked(); 83829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 838346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 838446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /** 838546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Must be called with the main window manager lock held. 838646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 838746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown void setHoldScreenLocked(boolean holding) { 838846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown boolean state = mHoldingScreenWakeLock.isHeld(); 838946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (holding != state) { 839046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (holding) { 839146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mHoldingScreenWakeLock.acquire(); 839246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } else { 839346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mPolicy.screenOnStoppedLw(); 839446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mHoldingScreenWakeLock.release(); 839546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 839646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 839746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 83989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 83999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void requestAnimationLocked(long delay) { 84009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mAnimationPending) { 84019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimationPending = true; 84029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessageDelayed(mH.obtainMessage(H.ANIMATE), delay); 84039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 840506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 84069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 84079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Have the surface flinger show a surface, robustly dealing with 84089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * error conditions. In particular, if there is not enough memory 84099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to show the surface, then we will try to get rid of other surfaces 84109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in order to succeed. 841106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * 84129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if the surface was successfully shown. 84139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 84149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean showSurfaceRobustlyLocked(WindowState win) { 84159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 84169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mSurface != null) { 841716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn win.mSurfaceShown = true; 84189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mSurface.show(); 841993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn if (win.mTurnOnScreen) { 8420b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn if (DEBUG_VISIBILITY) Slog.v(TAG, 8421b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn "Show surface turning screen on: " + win); 842293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn win.mTurnOnScreen = false; 842393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn mTurnOnScreen = true; 842493e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn } 84259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 84279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 842894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn Slog.w(TAG, "Failure showing surface " + win.mSurface + " in " + win, e); 84299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 843006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 8431648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn reclaimSomeSurfaceMemoryLocked(win, "show", true); 843206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 84339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 84349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 843506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 8436648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn boolean reclaimSomeSurfaceMemoryLocked(WindowState win, String operation, boolean secure) { 84379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Surface surface = win.mSurface; 8438648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn boolean leakedSurface = false; 8439648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn boolean killedApps = false; 844006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 8441ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker EventLog.writeEvent(EventLogTags.WM_NO_SURFACE_MEMORY, win.toString(), 84429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mSession.mPid, operation); 844306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 84449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mForceRemoves == null) { 84459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForceRemoves = new ArrayList<WindowState>(); 84469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 844706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 84489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long callingIdentity = Binder.clearCallingIdentity(); 84499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 84509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // There was some problem... first, do a sanity check of the 84519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // window list to make sure we haven't left any dangling surfaces 84529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // around. 84539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = mWindows.size(); 84548a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, "Out of memory for surface! Looking for leaks..."); 84559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 8456e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState ws = mWindows.get(i); 84579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ws.mSurface != null) { 84589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mSessions.contains(ws.mSession)) { 84598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "LEAKED SURFACE (session doesn't exist): " 84609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ws + " surface=" + ws.mSurface 84619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " token=" + win.mToken 84629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " pid=" + ws.mSession.mPid 84639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " uid=" + ws.mSession.mUid); 846494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (SHOW_TRANSACTIONS) logSurface(ws, "LEAK DESTROY", null); 84650586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn ws.mSurface.destroy(); 846616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn ws.mSurfaceShown = false; 84679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ws.mSurface = null; 84689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForceRemoves.add(ws); 84699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 84709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 84719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project leakedSurface = true; 847294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn } else if (ws.mAppToken != null && ws.mAppToken.clientHidden) { 84738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "LEAKED SURFACE (app token hidden): " 84749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ws + " surface=" + ws.mSurface 84759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " token=" + win.mAppToken); 847694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (SHOW_TRANSACTIONS) logSurface(ws, "LEAK DESTROY", null); 84770586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn ws.mSurface.destroy(); 847816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn ws.mSurfaceShown = false; 84799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ws.mSurface = null; 84809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project leakedSurface = true; 84819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 848406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 84859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!leakedSurface) { 84868a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "No leaked surfaces; killing applicatons!"); 84879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SparseIntArray pidCandidates = new SparseIntArray(); 84889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 8489e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState ws = mWindows.get(i); 84909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ws.mSurface != null) { 84919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pidCandidates.append(ws.mSession.mPid, ws.mSession.mPid); 84929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pidCandidates.size() > 0) { 84959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] pids = new int[pidCandidates.size()]; 84969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<pids.length; i++) { 84979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pids[i] = pidCandidates.keyAt(i); 84989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8500648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn if (mActivityManager.killPids(pids, "Free memory", secure)) { 85019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project killedApps = true; 85029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 85049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 850706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 85089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (leakedSurface || killedApps) { 85099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We managed to reclaim some memory, so get rid of the trouble 85109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // surface and ask the app to request another one. 85118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Looks like we have reclaimed some memory, clearing surface for retry."); 85129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (surface != null) { 85135fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) logSurface(win, 85145fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn "RECOVER DESTROY", null); 85150586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn surface.destroy(); 851616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn win.mSurfaceShown = false; 85179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mSurface = null; 85189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 851906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 85209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 85219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mClient.dispatchGetNewSurface(); 85229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 85239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 85269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(callingIdentity); 85279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8528648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn 8529648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn return leakedSurface || killedApps; 85309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 853106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 85323a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown private boolean updateFocusedWindowLocked(int mode, boolean updateInputWindows) { 85339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState newFocus = computeFocusedWindowLocked(); 85349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrentFocus != newFocus) { 85359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This check makes sure that we don't already have the focus 85369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // change message pending. 85379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.removeMessages(H.REPORT_FOCUS_CHANGE); 85389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendEmptyMessage(H.REPORT_FOCUS_CHANGE); 85398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v( 85409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Changing focus from " + mCurrentFocus + " to " + newFocus); 85419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowState oldFocus = mCurrentFocus; 85429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentFocus = newFocus; 85439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLosingFocus.remove(newFocus); 854406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 85459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowState imWindow = mInputMethodWindow; 85469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newFocus != imWindow && oldFocus != imWindow) { 8547c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project if (moveInputMethodWindowsIfNeededLocked( 85489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mode != UPDATE_FOCUS_WILL_ASSIGN_LAYERS && 8549c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project mode != UPDATE_FOCUS_WILL_PLACE_SURFACES)) { 8550c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project mLayoutNeeded = true; 8551c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project } 85529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mode == UPDATE_FOCUS_PLACING_SURFACES) { 85533a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown performLayoutLockedInner(true /*initial*/, updateInputWindows); 8554c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project } else if (mode == UPDATE_FOCUS_WILL_PLACE_SURFACES) { 8555c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project // Client will do the layout, but we need to assign layers 8556c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project // for handleNewWindowLocked() below. 8557c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project assignLayersLocked(); 85589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8560349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 8561349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown if (mode != UPDATE_FOCUS_WILL_ASSIGN_LAYERS) { 8562349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // If we defer assigning layers, then the caller is responsible for 8563349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // doing this part. 85643a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown finishUpdateFocusedWindowAfterAssignLayersLocked(updateInputWindows); 8565c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project } 85669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 85679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 85699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8570349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 85713a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown private void finishUpdateFocusedWindowAfterAssignLayersLocked(boolean updateInputWindows) { 85723a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown mInputMonitor.setInputFocusLw(mCurrentFocus, updateInputWindows); 8573349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown } 85749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 85759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WindowState computeFocusedWindowLocked() { 85769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState result = null; 85779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win; 85789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 85799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = mWindows.size() - 1; 85809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int nextAppIndex = mAppTokens.size()-1; 85819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken nextApp = nextAppIndex >= 0 85829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? mAppTokens.get(nextAppIndex) : null; 85839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 85849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i >= 0) { 8585e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown win = mWindows.get(i); 85869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 85878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV || DEBUG_FOCUS) Slog.v( 85889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Looking for focus: " + i 85899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " = " + win 85909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", flags=" + win.mAttrs.flags 85919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", canReceive=" + win.canReceiveKeys()); 85929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 85939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken thisApp = win.mAppToken; 859406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 85959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this window's application has been removed, just skip it. 85969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (thisApp != null && thisApp.removed) { 85979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 85989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 85999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 860006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 86019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If there is a focused app, don't allow focus to go to any 86029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // windows below it. If this is an application window, step 86039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // through the app tokens until we find its app. 86049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (thisApp != null && nextApp != null && thisApp != nextApp 86059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && win.mAttrs.type != TYPE_APPLICATION_STARTING) { 86069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int origAppIndex = nextAppIndex; 86079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (nextAppIndex > 0) { 86089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nextApp == mFocusedApp) { 86099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Whoops, we are below the focused app... no focus 86109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // for you! 86118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV || DEBUG_FOCUS) Slog.v( 86129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Reached focused app: " + mFocusedApp); 86139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 86149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 86159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nextAppIndex--; 86169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nextApp = mAppTokens.get(nextAppIndex); 86179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nextApp == thisApp) { 86189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 86199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 86209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 86219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (thisApp != nextApp) { 86229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Uh oh, the app token doesn't exist! This shouldn't 86239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // happen, but if it does we can get totally hosed... 86249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // so restart at the original app. 86259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nextAppIndex = origAppIndex; 86269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nextApp = mAppTokens.get(nextAppIndex); 86279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 86289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 86299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 86309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Dispatch to this window if it is wants key events. 86319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.canReceiveKeys()) { 86328a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_FOCUS) Slog.v( 86339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Found focus @ " + i + " = " + win); 86349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = win; 86359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 86369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 86379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 86389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 86399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 86409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 86419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 86429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 86439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 864494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn private void startFreezingDisplayLocked(boolean inTransaction) { 86459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDisplayFrozen) { 86469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 86479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 864806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 86499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenFrozenLock.acquire(); 865006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 86519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long now = SystemClock.uptimeMillis(); 86528a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Freezing, gc pending: " + mFreezeGcPending + ", now " + now); 86539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFreezeGcPending != 0) { 86549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (now > (mFreezeGcPending+1000)) { 86558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Gc! " + now + " > " + (mFreezeGcPending+1000)); 86569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.removeMessages(H.FORCE_GC); 86579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Runtime.getRuntime().gc(); 86589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFreezeGcPending = now; 86599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 86609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 86619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFreezeGcPending = now; 86629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 866306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 86649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDisplayFrozen = true; 8665349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 866600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputMonitor.freezeInputDispatchingLw(); 8667349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 8668bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 8669bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET; 86703b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn mNextAppTransitionPackage = null; 86719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTransitionReady = true; 86729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 867306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 86749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (PROFILE_ORIENTATION) { 86759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File file = new File("/data/system/frozen"); 86769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Debug.startMethodTracing(file.toString(), 8 * 1024 * 1024); 86779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8678a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn 8679a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn if (CUSTOM_SCREEN_ROTATION) { 8680f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) { 8681f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mScreenRotationAnimation.kill(); 8682f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mScreenRotationAnimation = null; 8683f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } 8684a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn if (mScreenRotationAnimation == null) { 8685f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mScreenRotationAnimation = new ScreenRotationAnimation(mContext, 868694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn mDisplay, mFxSession, inTransaction); 8687a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn } 8688de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (!mScreenRotationAnimation.hasScreenshot()) { 8689de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn Surface.freezeDisplay(0); 8690de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 8691a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn } else { 8692a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn Surface.freezeDisplay(0); 8693a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn } 86949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 869506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 86969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void stopFreezingDisplayLocked() { 86979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mDisplayFrozen) { 86989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 86999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 870006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 8701e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (mWaitingForConfig || mAppsFreezingScreen > 0 || mWindowsFreezingScreen) { 8702e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return; 8703e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 8704e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 87059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDisplayFrozen = false; 87069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.removeMessages(H.APP_FREEZE_TIMEOUT); 87079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (PROFILE_ORIENTATION) { 87089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Debug.stopMethodTracing(); 87099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8710a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn 871189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn boolean updateRotation = false; 871289ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn 8713de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (CUSTOM_SCREEN_ROTATION && mScreenRotationAnimation != null 8714de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn && mScreenRotationAnimation.hasScreenshot()) { 8715de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (mScreenRotationAnimation.dismiss(mFxSession, MAX_ANIMATION_DURATION, 8716de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mTransitionAnimationScale)) { 8717de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn requestAnimationLocked(0); 8718de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } else { 8719de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mScreenRotationAnimation = null; 8720de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn updateRotation = true; 8721a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn } 8722a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn } else { 8723de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (mScreenRotationAnimation != null) { 8724de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mScreenRotationAnimation.kill(); 8725de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mScreenRotationAnimation = null; 8726de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 8727de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn updateRotation = true; 8728a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn Surface.unfreezeDisplay(0); 8729a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn } 873006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 873100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputMonitor.thawInputDispatchingLw(); 87329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8733420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn boolean configChanged; 8734420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn 8735b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate // While the display is frozen we don't re-compute the orientation 8736b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate // to avoid inconsistent states. However, something interesting 8737b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate // could have actually changed during that time so re-evaluate it 8738b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate // now to catch that. 8739420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn configChanged = updateOrientationFromAppTokensLocked(false); 8740b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate 87419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // A little kludge: a lot could have happened while the 87429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // display was frozen, so now that we are coming back we 87439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // do a gc so that any remote references the system 87449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // processes holds on others can be released if they are 87459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // no longer needed. 87469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.removeMessages(H.FORCE_GC); 87479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessageDelayed(mH.obtainMessage(H.FORCE_GC), 87489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2000); 874906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 87509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenFrozenLock.release(); 875189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn 875289ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn if (updateRotation) { 875389ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation"); 8754420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn configChanged |= setRotationUncheckedLocked( 875589ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn WindowManagerPolicy.USE_LAST_ROTATION, 0, false); 8756420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn } 8757420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn 8758420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn if (configChanged) { 8759420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION); 876089ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn } 87619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 876206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 8763b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn static int getPropertyInt(String[] tokens, int index, int defUnits, int defDps, 8764b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn DisplayMetrics dm) { 8765b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn if (index < tokens.length) { 8766b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn String str = tokens[index]; 8767b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn if (str != null && str.length() > 0) { 8768b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn try { 8769b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn int val = Integer.parseInt(str); 8770b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn return val; 8771b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } catch (Exception e) { 8772b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } 8773b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } 8774fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 8775fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn if (defUnits == TypedValue.COMPLEX_UNIT_PX) { 8776fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn return defDps; 8777fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 8778fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn int val = (int)TypedValue.applyDimension(defUnits, defDps, dm); 8779fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn return val; 8780fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 8781fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn 8782fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn void createWatermark() { 8783fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn if (mWatermark != null) { 8784fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn return; 8785fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 8786fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn 8787b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn File file = new File("/system/etc/setup.conf"); 8788b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn FileInputStream in = null; 8789b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn try { 8790b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn in = new FileInputStream(file); 8791b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn DataInputStream ind = new DataInputStream(in); 8792b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn String line = ind.readLine(); 8793b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn if (line != null) { 8794b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn String[] toks = line.split("%"); 8795b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn if (toks != null && toks.length > 0) { 8796ed7bfbf6c87153c3f2f23d6856db4180d4bac429Dianne Hackborn mWatermark = new Watermark(mDisplay, mFxSession, toks); 8797b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } 8798b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } 8799b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } catch (FileNotFoundException e) { 8800b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } catch (IOException e) { 8801b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } finally { 8802b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn if (in != null) { 8803b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn try { 8804b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn in.close(); 8805b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } catch (IOException e) { 8806b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } 8807b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } 8808fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 8809fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 8810fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn 88119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8812664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato public void statusBarVisibilityChanged(int visibility) { 881305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown mInputManager.setSystemUiVisibility(visibility); 8814664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato synchronized (mWindowMap) { 8815664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato final int N = mWindows.size(); 8816664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato for (int i = 0; i < N; i++) { 8817664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato WindowState ws = mWindows.get(i); 8818664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato try { 8819664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato if (ws.getAttrs().hasSystemUiListeners) { 8820664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato ws.mClient.dispatchSystemUiVisibilityChanged(visibility); 8821664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato } 8822664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato } catch (RemoteException e) { 8823664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato // so sorry 8824664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato } 8825664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato } 8826664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato } 8827664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato } 8828664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato 8829664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato @Override 88309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 88319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mContext.checkCallingOrSelfPermission("android.permission.DUMP") 88329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project != PackageManager.PERMISSION_GRANTED) { 88339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println("Permission Denial: can't dump WindowManager from from pid=" 88349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Binder.getCallingPid() 88359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", uid=" + Binder.getCallingUid()); 88369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 88379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 883806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 883900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputManager.dump(pw); 8840a2e92266b3f768f74ab7fcb42972a22d6c739b39Dianne Hackborn pw.println(" "); 8841a2e92266b3f768f74ab7fcb42972a22d6c739b39Dianne Hackborn 88429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 88439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println("Current Window Manager state:"); 88449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=mWindows.size()-1; i>=0; i--) { 8845e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 88461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" Window #"); pw.print(i); pw.print(' '); 88471d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(w); pw.println(":"); 88489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.dump(pw, " "); 88499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 88509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInputMethodDialogs.size() > 0) { 88519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" "); 88529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" Input method dialogs:"); 88539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=mInputMethodDialogs.size()-1; i>=0; i--) { 88549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState w = mInputMethodDialogs.get(i); 88551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" IM Dialog #"); pw.print(i); pw.print(": "); pw.println(w); 88569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 88579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 88589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPendingRemove.size() > 0) { 88599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" "); 88609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" Remove pending for:"); 88619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=mPendingRemove.size()-1; i>=0; i--) { 88629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState w = mPendingRemove.get(i); 88631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" Remove #"); pw.print(i); pw.print(' '); 88641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(w); pw.println(":"); 88659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.dump(pw, " "); 88669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 88679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 88689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mForceRemoves != null && mForceRemoves.size() > 0) { 88699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" "); 88709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" Windows force removing:"); 88719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=mForceRemoves.size()-1; i>=0; i--) { 88729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState w = mForceRemoves.get(i); 88731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" Removing #"); pw.print(i); pw.print(' '); 88741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(w); pw.println(":"); 88759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.dump(pw, " "); 88769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 88779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 88789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDestroySurface.size() > 0) { 88799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" "); 88809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" Windows waiting to destroy their surface:"); 88819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=mDestroySurface.size()-1; i>=0; i--) { 88829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState w = mDestroySurface.get(i); 88831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" Destroy #"); pw.print(i); pw.print(' '); 88841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(w); pw.println(":"); 88859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.dump(pw, " "); 88869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 88879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 88889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLosingFocus.size() > 0) { 88899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" "); 88909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" Windows losing focus:"); 88919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=mLosingFocus.size()-1; i>=0; i--) { 88929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState w = mLosingFocus.get(i); 88931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" Losing #"); pw.print(i); pw.print(' '); 88941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(w); pw.println(":"); 88959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.dump(pw, " "); 88969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 88979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 88980586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn if (mResizingWindows.size() > 0) { 88990586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn pw.println(" "); 89000586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn pw.println(" Windows waiting to resize:"); 89010586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn for (int i=mResizingWindows.size()-1; i>=0; i--) { 89020586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn WindowState w = mResizingWindows.get(i); 89030586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn pw.print(" Resizing #"); pw.print(i); pw.print(' '); 89040586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn pw.print(w); pw.println(":"); 89050586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn w.dump(pw, " "); 89060586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn } 89070586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn } 89089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSessions.size() > 0) { 89099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" "); 89109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" All active sessions:"); 89119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Iterator<Session> it = mSessions.iterator(); 89129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (it.hasNext()) { 89139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Session s = it.next(); 89141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" Session "); pw.print(s); pw.println(':'); 89159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.dump(pw, " "); 89169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 89179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 89189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTokenMap.size() > 0) { 89199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" "); 89209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" All tokens:"); 89219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Iterator<WindowToken> it = mTokenMap.values().iterator(); 89229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (it.hasNext()) { 89239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken token = it.next(); 89241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" Token "); pw.print(token.token); pw.println(':'); 89259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.dump(pw, " "); 89269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 89279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 89284c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (mWallpaperTokens.size() > 0) { 89294c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn pw.println(" "); 89304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn pw.println(" Wallpaper tokens:"); 89314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn for (int i=mWallpaperTokens.size()-1; i>=0; i--) { 89324c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn WindowToken token = mWallpaperTokens.get(i); 89334c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn pw.print(" Wallpaper #"); pw.print(i); 89344c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn pw.print(' '); pw.print(token); pw.println(':'); 89354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn token.dump(pw, " "); 89364c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 89374c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 89389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAppTokens.size() > 0) { 89399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" "); 89409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" Application tokens in Z order:"); 89419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=mAppTokens.size()-1; i>=0; i--) { 89421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" App #"); pw.print(i); pw.print(": "); 89431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.println(mAppTokens.get(i)); 89449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 89459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 89469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFinishedStarting.size() > 0) { 89479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" "); 89489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" Finishing start of application tokens:"); 89499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=mFinishedStarting.size()-1; i>=0; i--) { 89509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken token = mFinishedStarting.get(i); 89511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" Finished Starting #"); pw.print(i); 89521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(' '); pw.print(token); pw.println(':'); 89539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.dump(pw, " "); 89549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 89559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 89569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mExitingTokens.size() > 0) { 89579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" "); 89589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" Exiting tokens:"); 89599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=mExitingTokens.size()-1; i>=0; i--) { 89609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken token = mExitingTokens.get(i); 89611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" Exiting #"); pw.print(i); 89621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(' '); pw.print(token); pw.println(':'); 89639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.dump(pw, " "); 89649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 89659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 89669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mExitingAppTokens.size() > 0) { 89679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" "); 89689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" Exiting application tokens:"); 89699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=mExitingAppTokens.size()-1; i>=0; i--) { 89709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken token = mExitingAppTokens.get(i); 89711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" Exiting App #"); pw.print(i); 89721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(' '); pw.print(token); pw.println(':'); 89739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.dump(pw, " "); 89749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 89759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 89769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" "); 89771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mCurrentFocus="); pw.println(mCurrentFocus); 89781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mLastFocus="); pw.println(mLastFocus); 89791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mFocusedApp="); pw.println(mFocusedApp); 89801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mInputMethodTarget="); pw.println(mInputMethodTarget); 89811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mInputMethodWindow="); pw.println(mInputMethodWindow); 8982f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn pw.print(" mWallpaperTarget="); pw.println(mWallpaperTarget); 8983284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (mLowerWallpaperTarget != null && mUpperWallpaperTarget != null) { 8984284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn pw.print(" mLowerWallpaperTarget="); pw.println(mLowerWallpaperTarget); 8985284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn pw.print(" mUpperWallpaperTarget="); pw.println(mUpperWallpaperTarget); 8986284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 89876c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (mWindowDetachedWallpaper != null) { 89886c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn pw.print(" mWindowDetachedWallpaper="); pw.println(mWindowDetachedWallpaper); 89896c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn } 8990de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (mWindowAnimationBackgroundSurface != null) { 8991de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn pw.println(" mWindowAnimationBackgroundSurface:"); 8992de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mWindowAnimationBackgroundSurface.printTo(" ", pw); 8993de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 8994e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn pw.print(" mCurConfiguration="); pw.println(this.mCurConfiguration); 8995e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn pw.print(" mInTouchMode="); pw.print(mInTouchMode); 8996e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn pw.print(" mLayoutSeq="); pw.println(mLayoutSeq); 89971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mSystemBooted="); pw.print(mSystemBooted); 89981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mDisplayEnabled="); pw.println(mDisplayEnabled); 89991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mLayoutNeeded="); pw.print(mLayoutNeeded); 90001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mBlurShown="); pw.println(mBlurShown); 90010a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima if (mDimAnimator != null) { 9002de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn pw.println(" mDimAnimator:"); 9003de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mDimAnimator.printTo(" ", pw); 90040a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima } else { 9005a2e92266b3f768f74ab7fcb42972a22d6c739b39Dianne Hackborn pw.println( " no DimAnimator "); 90060a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima } 90071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mInputMethodAnimLayerAdjustment="); 9008759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn pw.print(mInputMethodAnimLayerAdjustment); 9009759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn pw.print(" mWallpaperAnimLayerAdjustment="); 9010759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn pw.println(mWallpaperAnimLayerAdjustment); 9011284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn pw.print(" mLastWallpaperX="); pw.print(mLastWallpaperX); 9012284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn pw.print(" mLastWallpaperY="); pw.println(mLastWallpaperY); 90131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mDisplayFrozen="); pw.print(mDisplayFrozen); 90141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mWindowsFreezingScreen="); pw.print(mWindowsFreezingScreen); 9015e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn pw.print(" mAppsFreezingScreen="); pw.print(mAppsFreezingScreen); 9016e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn pw.print(" mWaitingForConfig="); pw.println(mWaitingForConfig); 90171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mRotation="); pw.print(mRotation); 901868066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn pw.print(" mRequestedRotation="); pw.print(mRequestedRotation); 901968066c2f38e47b56f0510c56eafd827731a0dc08Dianne Hackborn pw.print(" mAltOrientation="); pw.println(mAltOrientation); 9020bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn pw.print(" mLastWindowForcedOrientation"); pw.print(mLastWindowForcedOrientation); 9021bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn pw.print(" mForcedAppOrientation="); pw.println(mForcedAppOrientation); 902289ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn pw.print(" mDeferredRotation="); pw.print(mDeferredRotation); 902329735689cea7bf52998c1911542dcfdd1c1d9628Dianne Hackborn pw.print(", mDeferredRotationAnimFlags="); pw.println(mDeferredRotationAnimFlags); 90241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mAnimationPending="); pw.print(mAnimationPending); 90251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mWindowAnimationScale="); pw.print(mWindowAnimationScale); 90261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mTransitionWindowAnimationScale="); pw.println(mTransitionAnimationScale); 90271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mNextAppTransition=0x"); 90281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(Integer.toHexString(mNextAppTransition)); 902929735689cea7bf52998c1911542dcfdd1c1d9628Dianne Hackborn pw.print(" mAppTransitionReady="); pw.println(mAppTransitionReady); 903029735689cea7bf52998c1911542dcfdd1c1d9628Dianne Hackborn pw.print(" mAppTransitionRunning="); pw.print(mAppTransitionRunning); 903129735689cea7bf52998c1911542dcfdd1c1d9628Dianne Hackborn pw.print(" mAppTransitionTimeout="); pw.println( mAppTransitionTimeout); 90323b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (mNextAppTransitionPackage != null) { 90333b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn pw.print(" mNextAppTransitionPackage="); 90343b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn pw.print(mNextAppTransitionPackage); 903529735689cea7bf52998c1911542dcfdd1c1d9628Dianne Hackborn pw.print(" mNextAppTransitionEnter=0x"); 90363b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn pw.print(Integer.toHexString(mNextAppTransitionEnter)); 903729735689cea7bf52998c1911542dcfdd1c1d9628Dianne Hackborn pw.print(" mNextAppTransitionExit=0x"); 90383b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn pw.print(Integer.toHexString(mNextAppTransitionExit)); 90393b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 90401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mStartingIconInTransition="); pw.print(mStartingIconInTransition); 90411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(", mSkipAppTransitionAnimation="); pw.println(mSkipAppTransitionAnimation); 90421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mOpeningApps.size() > 0) { 90431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mOpeningApps="); pw.println(mOpeningApps); 90441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 90451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mClosingApps.size() > 0) { 90461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mClosingApps="); pw.println(mClosingApps); 90471d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 9048a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (mToTopApps.size() > 0) { 9049a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn pw.print(" mToTopApps="); pw.println(mToTopApps); 9050a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 9051a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (mToBottomApps.size() > 0) { 9052a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn pw.print(" mToBottomApps="); pw.println(mToBottomApps); 9053a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 905487fc30828209afa25be69ac7053241f4eaeb3378Dianne Hackborn if (mDisplay != null) { 9055ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn pw.print(" Display: init="); pw.print(mInitialDisplayWidth); pw.print("x"); 90567916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn pw.print(mInitialDisplayHeight); pw.print(" base="); 90577916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn pw.print(mBaseDisplayWidth); pw.print("x"); pw.print(mBaseDisplayHeight); 90587916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn pw.print(" cur="); 9059ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn pw.print(mCurDisplayWidth); pw.print("x"); pw.print(mCurDisplayHeight); 906081e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn pw.print(" app="); 906181e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn pw.print(mAppDisplayWidth); pw.print("x"); pw.print(mAppDisplayHeight); 9062ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn pw.print(" real="); pw.print(mDisplay.getRealWidth()); 9063ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn pw.print("x"); pw.print(mDisplay.getRealHeight()); 9064ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn pw.print(" raw="); pw.print(mDisplay.getRawWidth()); 9065ac8dea12c17aa047e03a358110aeb60401d36aa2Dianne Hackborn pw.print("x"); pw.println(mDisplay.getRawHeight()); 906687fc30828209afa25be69ac7053241f4eaeb3378Dianne Hackborn } else { 906787fc30828209afa25be69ac7053241f4eaeb3378Dianne Hackborn pw.println(" NO DISPLAY"); 906887fc30828209afa25be69ac7053241f4eaeb3378Dianne Hackborn } 9069f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn pw.println(" Policy:"); 9070f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn mPolicy.dump(" ", fd, pw, args); 90719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 90729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 90739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9074349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // Called by the heartbeat to ensure locks are not held indefnitely (for deadlock detection). 90759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void monitor() { 90769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { } 9077983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood synchronized (mKeyguardTokenWatcher) { } 9078ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn } 9079ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 90802992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown public interface OnHardKeyboardStatusChangeListener { 90812992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown public void onHardKeyboardStatusChange(boolean available, boolean enabled); 90822992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 90839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9084