WindowManagerService.java revision e99adc70c8e0a64cb8d13a2ec4c125adaf18904d
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; 56a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackbornimport android.content.ComponentName; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 58284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Millerimport android.content.Intent; 59284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Millerimport android.content.IntentFilter; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ActivityInfo; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 621ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshimaimport android.content.res.CompatibilityInfo; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Configuration; 640aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackbornimport android.graphics.Bitmap; 65fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackbornimport android.graphics.Canvas; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Matrix; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PixelFormat; 6844bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackbornimport android.graphics.Point; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Region; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.BatteryStats; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 737580493b014a2c7ea883cd291255798dc72ebbffDianne Hackbornimport android.os.Bundle; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Debug; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.LocalPowerManager; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Looper; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFileDescriptor; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Power; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PowerManager; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 87ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrickimport android.os.StrictMode; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemProperties; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.TokenWatcher; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Settings; 92723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackbornimport android.util.DisplayMetrics; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.EventLog; 94d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Millerimport android.util.Log; 958a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseIntArray; 97fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackbornimport android.util.TypedValue; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Display; 99dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powellimport android.view.Gravity; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IApplicationToken; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IOnKeyguardExitResult; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IRotationWatcher; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindow; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindowManager; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.IWindowSession; 10646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownimport android.view.InputChannel; 107c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brownimport android.view.InputDevice; 108bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brownimport android.view.InputEvent; 109a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tateimport android.view.InputHandler; 110a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tateimport android.view.InputQueue; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Surface; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SurfaceSession; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerImpl; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerPolicy; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager.LayoutParams; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Animation; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.AnimationUtils; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Transformation; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.BufferedWriter; 125b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackbornimport java.io.DataInputStream; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 128b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackbornimport java.io.FileInputStream; 129b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackbornimport java.io.FileNotFoundException; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStream; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStreamWriter; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.StringWriter; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.Socket; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashSet; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** {@hide} */ 143ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackbornpublic class WindowManagerService extends IWindowManager.Stub 14400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown implements Watchdog.Monitor { 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final String TAG = "WindowManager"; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG = false; 147f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn static final boolean DEBUG_ADD_REMOVE = false; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_FOCUS = false; 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_ANIM = false; 1509b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn static final boolean DEBUG_LAYOUT = false; 151ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn static final boolean DEBUG_RESIZE = false; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_LAYERS = false; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_INPUT = false; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_INPUT_METHOD = false; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_VISIBILITY = false; 156bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn static final boolean DEBUG_WINDOW_MOVEMENT = false; 157f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn static final boolean DEBUG_TOKEN_MOVEMENT = false; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_ORIENTATION = false; 159bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn static final boolean DEBUG_APP_ORIENTATION = false; 160694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn static final boolean DEBUG_CONFIGURATION = false; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_APP_TRANSITIONS = false; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_STARTING_WINDOW = false; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG_REORDER = false; 1647341d7a104b47996445d069a695e155a07184606Dianne Hackborn static final boolean DEBUG_WALLPAPER = false; 165994ef9296a00523de1df424b4b760b4416ead58bChristopher Tate static final boolean DEBUG_DRAG = false; 1665fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn static final boolean SHOW_SURFACE_ALLOC = false; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean SHOW_TRANSACTIONS = false; 1689bfb707597898f54722460b48588007b682f3e2aDianne Hackborn static final boolean HIDE_STACK_CRAWLS = true; 16953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean PROFILE_ORIENTATION = false; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean BLUR = true; 172cfe6524071624b6679e5fa4db847328e8d0317c8Dave Bort static final boolean localLOGV = DEBUG; 17306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** How much to multiply the policy's type layer, to reserve room 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for multiple windows of the same type and Z-ordering adjustment 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with TYPE_LAYER_OFFSET. */ 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int TYPE_LAYER_MULTIPLIER = 10000; 17806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Offset from TYPE_LAYER_MULTIPLIER for moving a group of windows above 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or below others in the same layer. */ 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int TYPE_LAYER_OFFSET = 1000; 18206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** How much to increment the layer for each window, to reserve room 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for effect surfaces between them. 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int WINDOW_LAYER_MULTIPLIER = 5; 18706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 188de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn /** 189de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn * Dim surface layer is immediately below target window. 190de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn */ 191de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn static final int LAYER_OFFSET_DIM = 1; 192de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn 193de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn /** 194de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn * Blur surface layer is immediately below dim layer. 195de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn */ 196de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn static final int LAYER_OFFSET_BLUR = 2; 197de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn 1987916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn /** 1997916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn * Layer at which to put the rotation freeze snapshot. 2007916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn */ 2017916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn static final int FREEZE_LAYER = (TYPE_LAYER_MULTIPLIER * 200) + 1; 2027916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 2037916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn /** 2047916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn * Layer at which to put the mask for emulated screen sizes. 2057916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn */ 2067916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn static final int MASK_LAYER = TYPE_LAYER_MULTIPLIER * 200; 2077916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The maximum length we will accept for a loaded animation duration: 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this is 10 seconds. 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int MAX_ANIMATION_DURATION = 10*1000; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Amount of time (in milliseconds) to animate the dim surface from one 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * value to another, when no window animation is driving it. 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int DEFAULT_DIM_DURATION = 200; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2180a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima /** Amount of time (in milliseconds) to animate the fade-in-out transition for 2190a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima * compatible windows. 2200a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima */ 2210a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima static final int DEFAULT_FADE_IN_OUT_DURATION = 400; 2220a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima 223a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn /** 224a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn * If true, the window manager will do its own custom freezing and general 225a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn * management of the screen during rotation. 226a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn */ 227a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn static final boolean CUSTOM_SCREEN_ROTATION = true; 228a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn 2297fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown // Maximum number of milliseconds to wait for input event injection. 2307fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown // FIXME is this value reasonable? 2317fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown private static final int INJECTION_TIMEOUT_MILLIS = 30 * 1000; 232b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown 233b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown // Maximum number of milliseconds to wait for input devices to be enumerated before 234b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown // proceding with safe mode detection. 235b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown private static final int INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS = 1000; 23628637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller 237349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // Default input dispatching timeout in nanoseconds. 2386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn static final long DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS = 5000 * 1000000L; 23906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int UPDATE_FOCUS_NORMAL = 0; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int UPDATE_FOCUS_WILL_ASSIGN_LAYERS = 1; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int UPDATE_FOCUS_PLACING_SURFACES = 2; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int UPDATE_FOCUS_WILL_PLACE_SURFACES = 3; 24406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String SYSTEM_SECURE = "ro.secure"; 24606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy private static final String SYSTEM_DEBUGGABLE = "ro.debuggable"; 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Condition waited on by {@link #reenableKeyguard} to know the call to 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the window policy has finished. 251983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood * This is set to true only if mKeyguardTokenWatcher.acquired() has 252983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood * actually disabled the keyguard. 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 254983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood private boolean mKeyguardDisabled = false; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 256284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller private static final int ALLOW_DISABLE_YES = 1; 257284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller private static final int ALLOW_DISABLE_NO = 0; 258284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller private static final int ALLOW_DISABLE_UNKNOWN = -1; // check with DevicePolicyManager 259284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller private int mAllowDisableKeyguard = ALLOW_DISABLE_UNKNOWN; // sync'd by mKeyguardTokenWatcher 260284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller 261983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood final TokenWatcher mKeyguardTokenWatcher = new TokenWatcher( 262983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood new Handler(), "WindowManagerService.mKeyguardTokenWatcher") { 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void acquired() { 264284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller if (shouldAllowDisableKeyguard()) { 265284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mPolicy.enableKeyguard(false); 266284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mKeyguardDisabled = true; 267284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller } else { 268284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller Log.v(TAG, "Not disabling keyguard since device policy is enforced"); 269284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller } 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void released() { 272a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn mPolicy.enableKeyguard(true); 273983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood synchronized (mKeyguardTokenWatcher) { 274983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood mKeyguardDisabled = false; 275983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood mKeyguardTokenWatcher.notifyAll(); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 280284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 281284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller @Override 282284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller public void onReceive(Context context, Intent intent) { 283284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mPolicy.enableKeyguard(true); 284284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller synchronized(mKeyguardTokenWatcher) { 285284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // lazily evaluate this next time we're asked to disable keyguard 286284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mAllowDisableKeyguard = ALLOW_DISABLE_UNKNOWN; 287284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mKeyguardDisabled = false; 288284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller } 289284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller } 290284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller }; 291284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Context mContext; 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean mHaveInputMethods; 29506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean mLimitedAlphaCompositing; 29706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowManagerPolicy mPolicy = PolicyManager.makeNewWindowManager(); 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IActivityManager mActivityManager; 30106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IBatteryStats mBatteryStats; 30306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All currently active sessions with clients. 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashSet<Session> mSessions = new HashSet<Session>(); 30806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Mapping from an IWindow IBinder to the server's Window object. 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is also used as the lock for all of our state. 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<IBinder, WindowState> mWindowMap = new HashMap<IBinder, WindowState>(); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Mapping from a token IBinder to a WindowToken object. 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<IBinder, WindowToken> mTokenMap = 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new HashMap<IBinder, WindowToken>(); 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Window tokens that are in the process of exiting, but still 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on screen for animations. 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<WindowToken> mExitingTokens = new ArrayList<WindowToken>(); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Z-ordered (bottom-most first) list of all application tokens, for 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * controlling the ordering of windows in different applications. This 330f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn * contains AppWindowToken objects. 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<AppWindowToken> mAppTokens = new ArrayList<AppWindowToken>(); 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Application tokens that are in the process of exiting, but still 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on screen for animations. 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<AppWindowToken> mExitingAppTokens = new ArrayList<AppWindowToken>(); 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * List of window tokens that have finished starting their application, 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and now need to have the policy remove their windows. 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<AppWindowToken> mFinishedStarting = new ArrayList<AppWindowToken>(); 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Z-ordered (bottom-most first) list of all Window objects. 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 349e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown final ArrayList<WindowState> mWindows = new ArrayList<WindowState>(); 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Windows that are being resized. Used so we can tell the client about 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the resize after closing the transaction in which we resized the 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * underlying surface. 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<WindowState> mResizingWindows = new ArrayList<WindowState>(); 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Windows whose animations have ended and now must be removed. 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<WindowState> mPendingRemove = new ArrayList<WindowState>(); 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 364f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn * Used when processing mPendingRemove to avoid working on the original array. 365f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn */ 366f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn WindowState[] mPendingRemoveTmp = new WindowState[20]; 367f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn 368f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn /** 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Windows whose surface should be destroyed. 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<WindowState> mDestroySurface = new ArrayList<WindowState>(); 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Windows that have lost input focus and are waiting for the new 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * focus window to be displayed before they are told about this. 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<WindowState> mLosingFocus = new ArrayList<WindowState>(); 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is set when we have run out of memory, and will either be an empty 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * list or contain windows that need to be force removed. 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<WindowState> mForceRemoves; 38406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 385f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn /** 386f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn * Used when rebuilding window list to keep track of windows that have 387f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn * been removed. 388f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn */ 389f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn WindowState[] mRebuildTmp = new WindowState[20]; 390f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IInputMethodManager mInputMethodManager; 39206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SurfaceSession mFxSession; 3940a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima private DimAnimator mDimAnimator = null; 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Surface mBlurSurface; 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mBlurShown; 397fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn Watermark mWatermark; 3986804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick StrictModeFlash mStrictModeFlash; 399a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn ScreenRotationAnimation mScreenRotationAnimation; 40006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4017916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn BlackFrame mBlackFrame; 4027916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mTransactionSequence = 0; 40406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final float[] mTmpFloats = new float[9]; 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mSafeMode; 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mDisplayEnabled = false; 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mSystemBooted = false; 410b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate int mInitialDisplayWidth = 0; 411b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate int mInitialDisplayHeight = 0; 4127916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn int mBaseDisplayWidth = 0; 4137916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn int mBaseDisplayHeight = 0; 41444bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn int mCurDisplayWidth = 0; 41544bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn int mCurDisplayHeight = 0; 41681e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn int mAppDisplayWidth = 0; 41781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn int mAppDisplayHeight = 0; 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mRotation = 0; 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mRequestedRotation = 0; 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mForcedAppOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 421dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn boolean mAltOrientation = false; 422321ae681cad03d00ad1efc6f06f74268e00172a9Dianne Hackborn int mLastRotationFlags; 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<IRotationWatcher> mRotationWatchers 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new ArrayList<IRotationWatcher>(); 42589ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn int mDeferredRotation; 42689ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn int mDeferredRotationAnimFlags; 42706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mLayoutNeeded = true; 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mAnimationPending = false; 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mDisplayFrozen = false; 431e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean mWaitingForConfig = false; 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mWindowsFreezingScreen = false; 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mAppsFreezingScreen = 0; 434bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn int mLastWindowForcedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 436e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn int mLayoutSeq = 0; 437e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 438b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn // State while inside of layoutAndPlaceSurfacesLocked(). 439b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn boolean mFocusMayChange; 440b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn 441e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn Configuration mCurConfiguration = new Configuration(); 442e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This is held as long as we have the screen frozen, to give us time to 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // perform a rotation animation when turning off shows the lock screen which 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // changes the orientation. 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PowerManager.WakeLock mScreenFrozenLock; 44706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // State management of app transitions. When we are preparing for a 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // transition, mNextAppTransition will be the kind of transition to 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // perform or TRANSIT_NONE if we are not waiting. If we are waiting, 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // mOpeningApps and mClosingApps are the lists of tokens that will be 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // made visible or hidden at the next transition. 453bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn int mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET; 4543b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn String mNextAppTransitionPackage; 4553b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn int mNextAppTransitionEnter; 4563b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn int mNextAppTransitionExit; 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mAppTransitionReady = false; 458a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn boolean mAppTransitionRunning = false; 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mAppTransitionTimeout = false; 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mStartingIconInTransition = false; 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mSkipAppTransitionAnimation = false; 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<AppWindowToken> mOpeningApps = new ArrayList<AppWindowToken>(); 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<AppWindowToken> mClosingApps = new ArrayList<AppWindowToken>(); 464a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn final ArrayList<AppWindowToken> mToTopApps = new ArrayList<AppWindowToken>(); 465a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn final ArrayList<AppWindowToken> mToBottomApps = new ArrayList<AppWindowToken>(); 46606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Display mDisplay; 46806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4695fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn final DisplayMetrics mDisplayMetrics = new DisplayMetrics(); 470bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown final DisplayMetrics mRealDisplayMetrics = new DisplayMetrics(); 47148a7651823030ed3c0f4c084b423430044425feaDianne Hackborn final DisplayMetrics mTmpDisplayMetrics = new DisplayMetrics(); 4725fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn final DisplayMetrics mCompatDisplayMetrics = new DisplayMetrics(); 4735fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project H mH = new H(); 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState mCurrentFocus = null; 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState mLastFocus = null; 47806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This just indicates the window the input method is on top of, not 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // necessarily the window its input is going to. 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState mInputMethodTarget = null; 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mInputMethodTargetWaitingAnim; 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mInputMethodAnimLayerAdjustment; 48406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState mInputMethodWindow = null; 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<WindowState> mInputMethodDialogs = new ArrayList<WindowState>(); 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4882992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown boolean mHardKeyboardAvailable; 4892992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown boolean mHardKeyboardEnabled; 4902992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown OnHardKeyboardStatusChangeListener mHardKeyboardStatusChangeListener; 4912992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 4924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn final ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>(); 493ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 494759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn // If non-null, this is the currently visible window that is associated 495759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn // with the wallpaper. 496759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn WindowState mWallpaperTarget = null; 4973be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // If non-null, we are in the middle of animating from one wallpaper target 4983be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // to another, and this is the lower one in Z-order. 4993be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn WindowState mLowerWallpaperTarget = null; 5003be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // If non-null, we are in the middle of animating from one wallpaper target 5013be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // to another, and this is the higher one in Z-order. 5023be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn WindowState mUpperWallpaperTarget = null; 5036c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // Window currently running an animation that has requested it be detached 5046c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // from the wallpaper. This means we need to ensure the wallpaper is 5056c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // visible behind it in case it animates in a way that would allow it to be 5066c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // seen. 5076c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn WindowState mWindowDetachedWallpaper = null; 508de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn DimSurface mWindowAnimationBackgroundSurface = null; 509759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn int mWallpaperAnimLayerAdjustment; 51073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn float mLastWallpaperX = -1; 51173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn float mLastWallpaperY = -1; 512bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen float mLastWallpaperXStep = -1; 513bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen float mLastWallpaperYStep = -1; 51419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn // This is set when we are waiting for a wallpaper to tell us it is done 51519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn // changing its scroll position. 51619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn WindowState mWaitingOnWallpaper; 51719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn // The last time we had a timeout when waiting for a wallpaper. 51819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn long mLastWallpaperTimeoutTime; 51919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn // We give a wallpaper up to 150ms to finish scrolling. 52019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn static final long WALLPAPER_TIMEOUT = 150; 52119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn // Time we wait after a timeout before trying to wait again. 52219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn static final long WALLPAPER_TIMEOUT_RECOVERY = 10000; 523ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken mFocusedApp = null; 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PowerManagerService mPowerManager; 52706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float mWindowAnimationScale = 1.0f; 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float mTransitionAnimationScale = 1.0f; 53006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 53146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown final InputManager mInputManager; 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Who is holding the screen on. 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Session mHoldingScreenOn; 53546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown PowerManager.WakeLock mHoldingScreenWakeLock; 53606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 53793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn boolean mTurnOnScreen; 538ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 539a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate DragState mDragState = null; 5406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final InputHandler mDragInputHandler = new BaseInputHandler() { 541a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate @Override 5423915bb845b032dc184dba5e60970b803390ca3edJeff Brown public void handleMotion(MotionEvent event, InputQueue.FinishedCallback finishedCallback) { 5433915bb845b032dc184dba5e60970b803390ca3edJeff Brown boolean handled = false; 544a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate try { 5453915bb845b032dc184dba5e60970b803390ca3edJeff Brown if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0 5463915bb845b032dc184dba5e60970b803390ca3edJeff Brown && mDragState != null) { 5473915bb845b032dc184dba5e60970b803390ca3edJeff Brown boolean endDrag = false; 5483915bb845b032dc184dba5e60970b803390ca3edJeff Brown final float newX = event.getRawX(); 5493915bb845b032dc184dba5e60970b803390ca3edJeff Brown final float newY = event.getRawY(); 5503915bb845b032dc184dba5e60970b803390ca3edJeff Brown 551a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate switch (event.getAction()) { 552a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate case MotionEvent.ACTION_DOWN: { 553a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (DEBUG_DRAG) { 554a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate Slog.w(TAG, "Unexpected ACTION_DOWN in drag layer"); 555a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 556a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } break; 557a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 558a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate case MotionEvent.ACTION_MOVE: { 559a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate synchronized (mWindowMap) { 5602c095f367779ef32130c72849936a2e3013c8492Christopher Tate // move the surface and tell the involved window(s) where we are 561a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate mDragState.notifyMoveLw(newX, newY); 562a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 563a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } break; 564a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 565a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate case MotionEvent.ACTION_UP: { 566a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (DEBUG_DRAG) Slog.d(TAG, "Got UP on move channel; dropping at " 567a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate + newX + "," + newY); 568a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate synchronized (mWindowMap) { 569d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate endDrag = mDragState.notifyDropLw(newX, newY); 570a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 571a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } break; 572a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 573a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate case MotionEvent.ACTION_CANCEL: { 574a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (DEBUG_DRAG) Slog.d(TAG, "Drag cancelled!"); 575a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate endDrag = true; 576a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } break; 577a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 578a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 579a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (endDrag) { 580a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (DEBUG_DRAG) Slog.d(TAG, "Drag ended; tearing down state"); 581a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate // tell all the windows that the drag has ended 5825994359f3009a3ebfbd37d82bb9a665e9b947851Chris Tate synchronized (mWindowMap) { 583d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate mDragState.endDragLw(); 5845994359f3009a3ebfbd37d82bb9a665e9b947851Chris Tate } 585a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 5863915bb845b032dc184dba5e60970b803390ca3edJeff Brown 5873915bb845b032dc184dba5e60970b803390ca3edJeff Brown handled = true; 588a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 589a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } catch (Exception e) { 590a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate Slog.e(TAG, "Exception caught by drag handleMotion", e); 591a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } finally { 5923915bb845b032dc184dba5e60970b803390ca3edJeff Brown finishedCallback.finished(handled); 593a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 594a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 595a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate }; 596a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 597a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate /** 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether the UI is currently running in touch mode (not showing 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * navigational focus because the user is directly pressing the screen). 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 601e99adc70c8e0a64cb8d13a2ec4c125adaf18904dMichael Jurka boolean mInTouchMode = true; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ViewServer mViewServer; 604dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev private ArrayList<WindowChangeListener> mWindowChangeListeners = 605dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev new ArrayList<WindowChangeListener>(); 606dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev private boolean mWindowsChanged = false; 607dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev 608dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev public interface WindowChangeListener { 609dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev public void windowsChanged(); 6106e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev public void focusChanged(); 611dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 613c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn final Configuration mTempConfiguration = new Configuration(); 6141ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima 6152f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn // The desired scaling factor for compatible apps. 616e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn float mCompatibleScreenScale; 6171ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static WindowManagerService main(Context context, 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PowerManagerService pm, boolean haveInputMethods) { 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WMThread thr = new WMThread(context, pm, haveInputMethods); 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thr.start(); 62206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (thr) { 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (thr.mService == null) { 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thr.wait(); 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63006e57b5d46c87e9dd7bca1386b63b3a8522f51efJozef BABJAK return thr.mService; 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static class WMThread extends Thread { 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManagerService mService; 63606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Context mContext; 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final PowerManagerService mPM; 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final boolean mHaveInputMethods; 64006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WMThread(Context context, PowerManagerService pm, 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean haveInputMethods) { 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super("WindowManager"); 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPM = pm; 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHaveInputMethods = haveInputMethods; 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Looper.prepare(); 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManagerService s = new WindowManagerService(mContext, mPM, 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHaveInputMethods); 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.os.Process.setThreadPriority( 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.os.Process.THREAD_PRIORITY_DISPLAY); 655160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate android.os.Process.setCanSelfBackground(false); 65606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = s; 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 662ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick // For debug builds, log event loop stalls to dropbox for analysis. 663ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick if (StrictMode.conditionallyEnableDebugLogging()) { 664ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick Slog.i(TAG, "Enabled StrictMode logging for WMThread's Looper"); 665ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick } 666ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Looper.loop(); 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static class PolicyThread extends Thread { 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final WindowManagerPolicy mPolicy; 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final WindowManagerService mService; 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Context mContext; 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final PowerManagerService mPM; 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mRunning = false; 67706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PolicyThread(WindowManagerPolicy policy, 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManagerService service, Context context, 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PowerManagerService pm) { 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super("WindowManagerPolicy"); 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy = policy; 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = service; 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPM = pm; 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Looper.prepare(); 690ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn WindowManagerPolicyThread.set(this, Looper.myLooper()); 691ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Looper.myLooper().setMessageLogging(new LogPrinter( 6938a9b22056b13477f59df934928c00c58b5871c95Joe Onorato // Log.VERBOSE, "WindowManagerPolicy", Log.LOG_ID_SYSTEM)); 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.os.Process.setThreadPriority( 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.os.Process.THREAD_PRIORITY_FOREGROUND); 696160edb3645f8b7012bab70ae6e6e8c4a5733082bChristopher Tate android.os.Process.setCanSelfBackground(false); 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.init(mContext, mService, mPM); 69806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunning = true; 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 70306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 704ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick // For debug builds, log event loop stalls to dropbox for analysis. 705ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick if (StrictMode.conditionallyEnableDebugLogging()) { 706ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick Slog.i(TAG, "Enabled StrictMode for PolicyThread's Looper"); 707ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick } 708ec062f63a2f5fb49f825544da348e594dbf5bf3cBrad Fitzpatrick 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Looper.loop(); 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WindowManagerService(Context context, PowerManagerService pm, 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean haveInputMethods) { 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHaveInputMethods = haveInputMethods; 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLimitedAlphaCompositing = context.getResources().getBoolean( 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.bool.config_sf_limitedAlpha); 71906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPowerManager = pm; 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPowerManager.setPolicy(mPolicy); 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PowerManager pmc = (PowerManager)context.getSystemService(Context.POWER_SERVICE); 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenFrozenLock = pmc.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "SCREEN_FROZEN"); 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenFrozenLock.setReferenceCounted(false); 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityManager = ActivityManagerNative.getDefault(); 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryStats = BatteryStatsService.getService(); 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get persisted window scale setting 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowAnimationScale = Settings.System.getFloat(context.getContentResolver(), 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.System.WINDOW_ANIMATION_SCALE, mWindowAnimationScale); 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTransitionAnimationScale = Settings.System.getFloat(context.getContentResolver(), 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.System.TRANSITION_ANIMATION_SCALE, mTransitionAnimationScale); 73506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 736284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // Track changes to DevicePolicyManager state so we can enable/disable keyguard. 737284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller IntentFilter filter = new IntentFilter(); 738284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED); 739284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mContext.registerReceiver(mBroadcastReceiver, filter); 740284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller 74146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mHoldingScreenWakeLock = pmc.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, 74246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown "KEEP_SCREEN_ON_FLAG"); 74346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mHoldingScreenWakeLock.setReferenceCounted(false); 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 745e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown mInputManager = new InputManager(context, this); 74606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PolicyThread thr = new PolicyThread(mPolicy, this, context, pm); 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thr.start(); 74906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (thr) { 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (!thr.mRunning) { 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thr.wait(); 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 75806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 75900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputManager.start(); 76006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Add ourself to the Watchdog monitors. 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Watchdog.getInstance().addMonitor(this); 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onTransact(int code, Parcel data, Parcel reply, int flags) 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws RemoteException { 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.onTransact(code, data, reply, flags); 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The window manager only throws security exceptions, so let's 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // log all others. 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!(e instanceof SecurityException)) { 7748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.e(TAG, "Window Manager Crash", e); 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw e; 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 780e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown private void placeWindowAfter(WindowState pos, WindowState window) { 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int i = mWindows.indexOf(pos); 782f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v( 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Adding window " + window + " at " 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (i+1) + " of " + mWindows.size() + " (after " + pos + ")"); 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.add(i+1, window); 786dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown private void placeWindowBefore(WindowState pos, WindowState window) { 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int i = mWindows.indexOf(pos); 791f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v( 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Adding window " + window + " at " 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + i + " of " + mWindows.size() + " (before " + pos + ")"); 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.add(i, window); 795dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //This method finds out the index of a window that has the same app token as 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //win. used for z ordering the windows in mWindows 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int findIdxBasedOnAppTokens(WindowState win) { 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //use a local variable to cache mWindows 802e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown ArrayList<WindowState> localmWindows = mWindows; 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int jmax = localmWindows.size(); 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(jmax == 0) { 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int j = (jmax-1); j >= 0; j--) { 808e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState wentry = localmWindows.get(j); 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(wentry.mAppToken == win.mAppToken) { 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return j; 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void addWindowToListInOrderLocked(WindowState win, boolean addToToken) { 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IWindow client = win.mClient; 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowToken token = win.mToken; 819e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown final ArrayList<WindowState> localmWindows = mWindows; 82006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = localmWindows.size(); 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowState attached = win.mAttachedWindow; 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attached == null) { 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int tokenWindowsPos = token.windows.size(); 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token.appWindowToken != null) { 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = tokenWindowsPos-1; 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index >= 0) { 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this application has existing windows, we 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // simply place the new window on top of them... but 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // keep the starting window on top. 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mAttrs.type == TYPE_BASE_APPLICATION) { 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Base windows go behind everything else. 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project placeWindowBefore(token.windows.get(0), win); 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tokenWindowsPos = 0; 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken atoken = win.mAppToken; 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken != null && 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.windows.get(index) == atoken.startingWindow) { 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project placeWindowBefore(token.windows.get(index), win); 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tokenWindowsPos--; 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int newIdx = findIdxBasedOnAppTokens(win); 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(newIdx != -1) { 84506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy //there is a window above this one associated with the same 84606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy //apptoken note that the window could be a floating window 84706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy //that was created later or a window at the top of the list of 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //windows associated with this token. 849f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) { 850f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn Slog.v(TAG, "Adding window " + win + " at " 851f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn + (newIdx+1) + " of " + N); 852f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project localmWindows.add(newIdx+1, win); 854dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 85506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy } 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v( 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Figuring out where to add app window " 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + client.asBinder() + " (token=" + token + ")"); 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Figure out where the window should go, based on the 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // order of applications. 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NA = mAppTokens.size(); 865e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState pos = null; 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=NA-1; i>=0; i--) { 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken t = mAppTokens.get(i); 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == token) { 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 872ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 873a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // We haven't reached the token yet; if this token 874a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // is not going to the bottom and has windows, we can 875a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // use it as an anchor for when we do reach the token. 876a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (!t.sendingToBottom && t.windows.size() > 0) { 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = t.windows.get(0); 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We now know the index into the apps. If we found 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // an app window above, that gives us the position; else 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we need to look some more. 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos != null) { 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Move behind any windows attached to this one. 885e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowToken atoken = mTokenMap.get(pos.mClient.asBinder()); 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken != null) { 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NC = atoken.windows.size(); 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NC > 0) { 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState bottom = atoken.windows.get(0); 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bottom.mSubLayer < 0) { 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = bottom; 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project placeWindowBefore(pos, win); 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 897a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // Continue looking down until we find the first 898a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // token that has windows. 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i >= 0) { 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken t = mAppTokens.get(i); 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NW = t.windows.size(); 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NW > 0) { 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = t.windows.get(NW-1); 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos != null) { 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Move in front of any windows attached to this 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // one. 911e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowToken atoken = mTokenMap.get(pos.mClient.asBinder()); 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken != null) { 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NC = atoken.windows.size(); 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NC > 0) { 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState top = atoken.windows.get(NC-1); 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (top.mSubLayer >= 0) { 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = top; 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project placeWindowAfter(pos, win); 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Just search for the start of this layer. 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int myLayer = win.mBaseLayer; 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 926e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = localmWindows.get(i); 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mBaseLayer > myLayer) { 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 931f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) { 932f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn Slog.v(TAG, "Adding window " + win + " at " 933f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn + i + " of " + N); 934f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project localmWindows.add(i, win); 936dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Figure out where window should go, based on layer. 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int myLayer = win.mBaseLayer; 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=N-1; i>=0; i--) { 944e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown if (localmWindows.get(i).mBaseLayer <= myLayer) { 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i < 0) i = 0; 950f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v( 9519bfb707597898f54722460b48588007b682f3e2aDianne Hackborn TAG, "Adding window " + win + " at " 9529bfb707597898f54722460b48588007b682f3e2aDianne Hackborn + i + " of " + N); 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project localmWindows.add(i, win); 954dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (addToToken) { 957f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token); 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.windows.add(tokenWindowsPos, win); 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Figure out this window's ordering relative to the window 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it is attached to. 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NA = token.windows.size(); 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int sublayer = win.mSubLayer; 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int largestSublayer = Integer.MIN_VALUE; 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState windowWithLargestSublayer = null; 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<NA; i++) { 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState w = token.windows.get(i); 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int wSublayer = w.mSubLayer; 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wSublayer >= largestSublayer) { 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project largestSublayer = wSublayer; 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project windowWithLargestSublayer = w; 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sublayer < 0) { 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For negative sublayers, we go below all windows 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // in the same sublayer. 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wSublayer >= sublayer) { 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (addToToken) { 980f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token); 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.windows.add(i, win); 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project placeWindowBefore( 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wSublayer >= 0 ? attached : w, win); 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For positive sublayers, we go above all windows 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // in the same sublayer. 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wSublayer > sublayer) { 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (addToToken) { 992f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token); 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.windows.add(i, win); 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project placeWindowBefore(w, win); 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i >= NA) { 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (addToToken) { 1002f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Adding " + win + " to " + token); 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.windows.add(win); 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sublayer < 0) { 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project placeWindowBefore(attached, win); 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project placeWindowAfter(largestSublayer >= 0 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? windowWithLargestSublayer 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : attached, 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win); 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 101506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mAppToken != null && addToToken) { 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mAppToken.allAppWindows.add(win); 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 102006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static boolean canBeImeTarget(WindowState w) { 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int fl = w.mAttrs.flags 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project & (FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM); 1024e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (fl == 0 || fl == (FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM) 1025e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn || w.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) { 1026e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (DEBUG_INPUT_METHOD) { 1027e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn Slog.i(TAG, "isVisibleOrAdding " + w + ": " + w.isVisibleOrAdding()); 1028e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (!w.isVisibleOrAdding()) { 1029e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn Slog.i(TAG, " mSurface=" + w.mSurface + " reportDestroy=" + w.mReportDestroySurface 1030e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn + " relayoutCalled=" + w.mRelayoutCalled + " viewVis=" + w.mViewVisibility 1031e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn + " policyVis=" + w.mPolicyVisibility + " attachHid=" + w.mAttachedHidden 1032e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn + " exiting=" + w.mExiting + " destroying=" + w.mDestroying); 1033e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (w.mAppToken != null) { 1034e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn Slog.i(TAG, " mAppToken.hiddenRequested=" + w.mAppToken.hiddenRequested); 1035e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn } 1036e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn } 1037e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn } 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return w.isVisibleOrAdding(); 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 104206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int findDesiredInputMethodWindowIndexLocked(boolean willMove) { 1044e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown final ArrayList<WindowState> localmWindows = mWindows; 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = localmWindows.size(); 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState w = null; 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = N; 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i > 0) { 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 1050e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown w = localmWindows.get(i); 105106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 1052e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (DEBUG_INPUT_METHOD && willMove) Slog.i(TAG, "Checking window @" + i 1053e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn + " " + w + " fl=0x" + Integer.toHexString(w.mAttrs.flags)); 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (canBeImeTarget(w)) { 10558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Putting input method here!"); 105606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Yet more tricksyness! If this window is a "starting" 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // window, we do actually want to be on top of it, but 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it is not -really- where input will go. So if the caller 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // is not actually looking to move the IME, look down below 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // for a real window to target... 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!willMove 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && w.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && i > 0) { 1065e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState wb = localmWindows.get(i-1); 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wb.mAppToken == w.mAppToken && canBeImeTarget(wb)) { 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w = wb; 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 107406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 1075e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (DEBUG_INPUT_METHOD && willMove) Slog.v(TAG, "Proposed new IME target: " + w); 1076e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn 10777eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn // Now, a special case -- if the last target's window is in the 10787eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn // process of exiting, and is above the new target, keep on the 10797eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn // last target to avoid flicker. Consider for example a Dialog with 10807eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn // the IME shown: when the Dialog is dismissed, we want to keep 10817eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn // the IME above it until it is completely gone so it doesn't drop 10827eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn // behind the dialog or its full-screen scrim. 10837eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn if (mInputMethodTarget != null && w != null 10847eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn && mInputMethodTarget.isDisplayedLw() 10857eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn && mInputMethodTarget.mExiting) { 10867eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn if (mInputMethodTarget.mAnimLayer > w.mAnimLayer) { 10877eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn w = mInputMethodTarget; 10887eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn i = localmWindows.indexOf(w); 1089e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Current target higher, switching to: " + w); 10907eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn } 10917eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn } 109206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 10938a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Desired input method target=" 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + w + " willMove=" + willMove); 109506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (willMove && w != null) { 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowState curTarget = mInputMethodTarget; 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (curTarget != null && curTarget.mAppToken != null) { 109906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Now some fun for dealing with window animations that 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // modify the Z order. We need to look at all windows below 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the current target that are in this app, finding the highest 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // visible one in layering. 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken token = curTarget.mAppToken; 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState highestTarget = null; 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int highestPos = 0; 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token.animating || token.animation != null) { 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = 0; 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = localmWindows.indexOf(curTarget); 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (pos >= 0) { 1111e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState win = localmWindows.get(pos); 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mAppToken != token) { 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!win.mRemoved) { 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (highestTarget == null || win.mAnimLayer > 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project highestTarget.mAnimLayer) { 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project highestTarget = win; 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project highestPos = pos; 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos--; 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 112506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (highestTarget != null) { 11278a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_INPUT_METHOD) Slog.v(TAG, "mNextAppTransition=" 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mNextAppTransition + " " + highestTarget 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " animating=" + highestTarget.isAnimating() 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " layer=" + highestTarget.mAnimLayer 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " new layer=" + w.mAnimLayer); 113206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 1133bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are currently setting up for an animation, 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // hold everything until we can find out what will happen. 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodTargetWaitingAnim = true; 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodTarget = highestTarget; 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return highestPos + 1; 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (highestTarget.isAnimating() && 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project highestTarget.mAnimLayer > w.mAnimLayer) { 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the window we are currently targeting is involved 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // with an animation, and it is on top of the next target 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we will be over, then hold off on moving until 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // that is done. 1145e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn mInputMethodTargetWaitingAnim = true; 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodTarget = highestTarget; 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return highestPos + 1; 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 115206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 11538a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Placing input method @" + (i+1)); 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w != null) { 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (willMove) { 1156b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (DEBUG_INPUT_METHOD) { 1157b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn RuntimeException e = null; 1158b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (!HIDE_STACK_CRAWLS) { 1159b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e = new RuntimeException(); 1160b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e.fillInStackTrace(); 1161b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 1162b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn Slog.w(TAG, "Moving IM target from " 1163b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + mInputMethodTarget + " to " + w, e); 1164b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodTarget = w; 1166e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn mInputMethodTargetWaitingAnim = false; 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mAppToken != null) { 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInputMethodAnimLayerAdjustment(w.mAppToken.animLayerAdjustment); 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInputMethodAnimLayerAdjustment(0); 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return i+1; 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (willMove) { 1176b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (DEBUG_INPUT_METHOD) { 1177b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn RuntimeException e = null; 1178b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (!HIDE_STACK_CRAWLS) { 1179b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e = new RuntimeException(); 1180b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e.fillInStackTrace(); 1181b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 1182b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn Slog.w(TAG, "Moving IM target from " 1183b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + mInputMethodTarget + " to null", e); 1184b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodTarget = null; 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInputMethodAnimLayerAdjustment(0); 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 119006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void addInputMethodWindowToListLocked(WindowState win) { 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = findDesiredInputMethodWindowIndexLocked(true); 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos >= 0) { 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mTargetAppToken = mInputMethodTarget.mAppToken; 1195f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v( 11969bfb707597898f54722460b48588007b682f3e2aDianne Hackborn TAG, "Adding input method window " + win + " at " + pos); 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.add(pos, win); 1198dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project moveInputMethodDialogsLocked(pos+1); 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mTargetAppToken = null; 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addWindowToListInOrderLocked(win, true); 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project moveInputMethodDialogsLocked(pos); 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 120606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setInputMethodAnimLayerAdjustment(int adj) { 12088a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYERS) Slog.v(TAG, "Setting im layer adj to " + adj); 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodAnimLayerAdjustment = adj; 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState imw = mInputMethodWindow; 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imw != null) { 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imw.mAnimLayer = imw.mLayer + adj; 12138a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + imw 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " anim layer: " + imw.mAnimLayer); 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int wi = imw.mChildWindows.size(); 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (wi > 0) { 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wi--; 1218e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState cw = imw.mChildWindows.get(wi); 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cw.mAnimLayer = cw.mLayer + adj; 12208a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + cw 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " anim layer: " + cw.mAnimLayer); 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int di = mInputMethodDialogs.size(); 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (di > 0) { 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project di --; 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imw = mInputMethodDialogs.get(di); 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imw.mAnimLayer = imw.mLayer + adj; 12298a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + imw 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " anim layer: " + imw.mAnimLayer); 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 123306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int tmpRemoveWindowLocked(int interestingPos, WindowState win) { 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int wpos = mWindows.indexOf(win); 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wpos >= 0) { 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wpos < interestingPos) interestingPos--; 12388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Temp removing at " + wpos + ": " + win); 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.remove(wpos); 1240dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NC = win.mChildWindows.size(); 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (NC > 0) { 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NC--; 1244e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState cw = win.mChildWindows.get(NC); 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int cpos = mWindows.indexOf(cw); 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cpos >= 0) { 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cpos < interestingPos) interestingPos--; 12488a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Temp removing child at " 12499bfb707597898f54722460b48588007b682f3e2aDianne Hackborn + cpos + ": " + cw); 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.remove(cpos); 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return interestingPos; 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 125606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void reAddWindowToListInOrderLocked(WindowState win) { 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addWindowToListInOrderLocked(win, false); 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This is a hack to get all of the child windows added as well 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // at the right position. Child windows should be rare and 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this case should be rare, so it shouldn't be that big a deal. 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int wpos = mWindows.indexOf(win); 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wpos >= 0) { 12648a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "ReAdd removing from " + wpos 12659bfb707597898f54722460b48588007b682f3e2aDianne Hackborn + ": " + win); 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.remove(wpos); 1267dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reAddWindowLocked(wpos, win); 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 127106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void logWindowList(String prefix) { 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = mWindows.size(); 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 12768a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, prefix + "#" + N + ": " + mWindows.get(N)); 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 127906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void moveInputMethodDialogsLocked(int pos) { 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<WindowState> dialogs = mInputMethodDialogs; 128206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = dialogs.size(); 12848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Removing " + N + " dialogs w/pos=" + pos); 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = tmpRemoveWindowLocked(pos, dialogs.get(i)); 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_INPUT_METHOD) { 12898a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Window list w/pos=" + pos); 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project logWindowList(" "); 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 129206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos >= 0) { 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken targetAppToken = mInputMethodTarget.mAppToken; 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos < mWindows.size()) { 1296e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState wp = mWindows.get(pos); 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wp == mInputMethodWindow) { 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos++; 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Adding " + N + " dialogs at pos=" + pos); 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = dialogs.get(i); 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mTargetAppToken = targetAppToken; 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = reAddWindowLocked(pos, win); 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_INPUT_METHOD) { 13088a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Final window list:"); 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project logWindowList(" "); 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = dialogs.get(i); 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mTargetAppToken = null; 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reAddWindowToListInOrderLocked(win); 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_INPUT_METHOD) { 13188a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "No IM target, final list:"); 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project logWindowList(" "); 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 132306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean moveInputMethodWindowsIfNeededLocked(boolean needAssignLayers) { 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowState imWin = mInputMethodWindow; 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int DN = mInputMethodDialogs.size(); 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imWin == null && DN == 0) { 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 133006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int imPos = findDesiredInputMethodWindowIndexLocked(true); 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imPos >= 0) { 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In this case, the input method windows are to be placed 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // immediately above the window they are targeting. 133506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // First check to see if the input method windows are already 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // located here, and contiguous. 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mWindows.size(); 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState firstImWin = imPos < N 1340e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown ? mWindows.get(imPos) : null; 134106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Figure out the actual input method window that should be 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // at the bottom of their stack. 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState baseImWin = imWin != null 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? imWin : mInputMethodDialogs.get(0); 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (baseImWin.mChildWindows.size() > 0) { 1347e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState cw = baseImWin.mChildWindows.get(0); 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cw.mSubLayer < 0) baseImWin = cw; 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 135006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (firstImWin == baseImWin) { 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The windows haven't moved... but are they still contiguous? 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // First find the top IM window. 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = imPos+1; 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (pos < N) { 1356e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown if (!(mWindows.get(pos)).mIsImWindow) { 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos++; 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos++; 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Now there should be no more input method windows above. 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (pos < N) { 1364e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown if ((mWindows.get(pos)).mIsImWindow) { 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos++; 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos >= N) { 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // All is good! 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 137406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imWin != null) { 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_INPUT_METHOD) { 13778a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Moving IM from " + imPos); 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project logWindowList(" "); 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imPos = tmpRemoveWindowLocked(imPos, imWin); 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_INPUT_METHOD) { 13827eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn Slog.v(TAG, "List after removing with new pos " + imPos + ":"); 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project logWindowList(" "); 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imWin.mTargetAppToken = mInputMethodTarget.mAppToken; 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reAddWindowLocked(imPos, imWin); 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_INPUT_METHOD) { 13888a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "List after moving IM to " + imPos + ":"); 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project logWindowList(" "); 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DN > 0) moveInputMethodDialogsLocked(imPos+1); 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project moveInputMethodDialogsLocked(imPos); 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 139506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In this case, the input method windows go in a fixed layer, 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // because they aren't currently associated with a focus window. 139906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imWin != null) { 14018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Moving IM from " + imPos); 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmpRemoveWindowLocked(0, imWin); 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imWin.mTargetAppToken = null; 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reAddWindowToListInOrderLocked(imWin); 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_INPUT_METHOD) { 14068a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "List with no IM target:"); 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project logWindowList(" "); 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DN > 0) moveInputMethodDialogsLocked(-1);; 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project moveInputMethodDialogsLocked(-1);; 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 141306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 141506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needAssignLayers) { 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assignLayersLocked(); 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 141906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 142206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void adjustInputMethodDialogsLocked() { 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project moveInputMethodDialogsLocked(findDesiredInputMethodWindowIndexLocked(true)); 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 142606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 142725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn final boolean isWallpaperVisible(WindowState wallpaperTarget) { 14288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper vis: target obscured=" 142925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn + (wallpaperTarget != null ? Boolean.toString(wallpaperTarget.mObscured) : "??") 143025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn + " anim=" + ((wallpaperTarget != null && wallpaperTarget.mAppToken != null) 143125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn ? wallpaperTarget.mAppToken.animation : null) 143225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn + " upper=" + mUpperWallpaperTarget 143325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn + " lower=" + mLowerWallpaperTarget); 143425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn return (wallpaperTarget != null 143525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn && (!wallpaperTarget.mObscured || (wallpaperTarget.mAppToken != null 143625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn && wallpaperTarget.mAppToken.animation != null))) 143725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn || mUpperWallpaperTarget != null 143825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn || mLowerWallpaperTarget != null; 143925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn } 1440ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 14410586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn static final int ADJUST_WALLPAPER_LAYERS_CHANGED = 1<<1; 14420586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn static final int ADJUST_WALLPAPER_VISIBILITY_CHANGED = 1<<2; 1443ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 14440586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn int adjustWallpaperWindowsLocked() { 14450586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn int changed = 0; 1446ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 144781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn final int dw = mAppDisplayWidth; 144881e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn final int dh = mAppDisplayHeight; 1449ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 14504c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // First find top-most window that has asked to be on top of the 14514c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // wallpaper; all wallpapers go behind it. 1452e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown final ArrayList<WindowState> localmWindows = mWindows; 14534c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int N = localmWindows.size(); 14544c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn WindowState w = null; 1455f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn WindowState foundW = null; 1456f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn int foundI = 0; 14573b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn WindowState topCurW = null; 14583b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn int topCurI = 0; 14596c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn int windowDetachedI = -1; 14604c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int i = N; 14614c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn while (i > 0) { 14624c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn i--; 1463e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown w = localmWindows.get(i); 14643b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if ((w.mAttrs.type == WindowManager.LayoutParams.TYPE_WALLPAPER)) { 14653b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (topCurW == null) { 14663b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn topCurW = w; 14673b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn topCurI = i; 14683b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 14693b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn continue; 14703b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 14713b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn topCurW = null; 14726c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (w != mWindowDetachedWallpaper && w.mAppToken != null) { 14733be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // If this window's app token is hidden and not animating, 14743be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // it is of no interest to us. 14753be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (w.mAppToken.hidden && w.mAppToken.animation == null) { 14768a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 14776c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn "Skipping not hidden or animating token: " + w); 14783be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn continue; 1479f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 1480f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 14818a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "Win " + w + ": readyfordisplay=" 14823be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn + w.isReadyForDisplay() + " drawpending=" + w.mDrawPending 14833be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn + " commitdrawpending=" + w.mCommitDrawPending); 14847341d7a104b47996445d069a695e155a07184606Dianne Hackborn if ((w.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0 && w.isReadyForDisplay() 14856c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn && (mWallpaperTarget == w 14866c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn || (!w.mDrawPending && !w.mCommitDrawPending))) { 14878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 14883be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn "Found wallpaper activity: #" + i + "=" + w); 1489f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn foundW = w; 1490f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn foundI = i; 14913b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (w == mWallpaperTarget && ((w.mAppToken != null 14923b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn && w.mAppToken.animation != null) 14933b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn || w.mAnimation != null)) { 14943be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // The current wallpaper target is animating, so we'll 14953be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // look behind it for another possible target and figure 14963be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // out what is going on below. 14978a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "Win " + w 14983be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn + ": token animating, looking behind."); 1499f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn continue; 1500f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 15014c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn break; 15026c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn } else if (w == mWindowDetachedWallpaper) { 15036c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn windowDetachedI = i; 15044c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 15054c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 15064c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 15076c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (foundW == null && windowDetachedI >= 0) { 15086c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (DEBUG_WALLPAPER) Slog.v(TAG, 15096c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn "Found animating detached wallpaper activity: #" + i + "=" + w); 15106c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn foundW = w; 15116c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn foundI = windowDetachedI; 15126c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn } 15136c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn 1514bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 1515f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // If we are currently waiting for an app transition, and either 1516f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // the current target or the next target are involved with it, 1517f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // then hold off on doing anything with the wallpaper. 1518f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // Note that we are checking here for just whether the target 1519f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // is part of an app token... which is potentially overly aggressive 1520f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // (the app token may not be involved in the transition), but good 1521f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // enough (we'll just wait until whatever transition is pending 1522f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // executes). 1523f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn if (mWallpaperTarget != null && mWallpaperTarget.mAppToken != null) { 15248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 15253be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn "Wallpaper not changing: waiting for app anim in current target"); 15260586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn return 0; 1527f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 1528f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn if (foundW != null && foundW.mAppToken != null) { 15298a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 15303be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn "Wallpaper not changing: waiting for app anim in found target"); 15310586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn return 0; 1532f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 15337341d7a104b47996445d069a695e155a07184606Dianne Hackborn } 1534ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1535f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn if (mWallpaperTarget != foundW) { 1536f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn if (DEBUG_WALLPAPER) { 15378a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "New wallpaper target: " + foundW 15383be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn + " oldTarget: " + mWallpaperTarget); 15393be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 1540ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 15413be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mLowerWallpaperTarget = null; 15423be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mUpperWallpaperTarget = null; 1543ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 15443be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn WindowState oldW = mWallpaperTarget; 15453be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mWallpaperTarget = foundW; 1546ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 15473be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // Now what is happening... if the current and new targets are 15483be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // animating, then we are in our super special mode! 15493b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (foundW != null && oldW != null) { 15503b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn boolean oldAnim = oldW.mAnimation != null 15513b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn || (oldW.mAppToken != null && oldW.mAppToken.animation != null); 15523b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn boolean foundAnim = foundW.mAnimation != null 15533b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn || (foundW.mAppToken != null && foundW.mAppToken.animation != null); 15543be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (DEBUG_WALLPAPER) { 15558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "New animation: " + foundAnim 15563b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn + " old animation: " + oldAnim); 15573be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 15583b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (foundAnim && oldAnim) { 15593be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn int oldI = localmWindows.indexOf(oldW); 15603be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (DEBUG_WALLPAPER) { 15618a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "New i: " + foundI + " old i: " + oldI); 15623be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 15633be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (oldI >= 0) { 15643be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (DEBUG_WALLPAPER) { 15658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Animating wallpapers: old#" + oldI 15663be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn + "=" + oldW + "; new#" + foundI 15673be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn + "=" + foundW); 15683be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 1569ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 15703be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // Set the new target correctly. 15713b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (foundW.mAppToken != null && foundW.mAppToken.hiddenRequested) { 15723be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (DEBUG_WALLPAPER) { 15738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Old wallpaper still the target."); 15743be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 15753be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mWallpaperTarget = oldW; 15763be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 1577ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 15783be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // Now set the upper and lower wallpaper targets 15793be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // correctly, and make sure that we are positioning 15803be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // the wallpaper below the lower. 15813be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (foundI > oldI) { 15823be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // The new target is on top of the old one. 15833be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (DEBUG_WALLPAPER) { 15848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Found target above old target."); 15853be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 15863be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mUpperWallpaperTarget = foundW; 15873be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mLowerWallpaperTarget = oldW; 15883be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn foundW = oldW; 15893be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn foundI = oldI; 15903be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } else { 15913be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // The new target is below the old one. 15923be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (DEBUG_WALLPAPER) { 15938a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Found target below old target."); 15943be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 15953be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mUpperWallpaperTarget = oldW; 15963be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mLowerWallpaperTarget = foundW; 15973be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 15983be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 15993be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 16003be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 1601ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 16026b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn } else if (mLowerWallpaperTarget != null) { 16033be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn // Is it time to stop animating? 16046b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn boolean lowerAnimating = mLowerWallpaperTarget.mAnimation != null 16056b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn || (mLowerWallpaperTarget.mAppToken != null 16066b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn && mLowerWallpaperTarget.mAppToken.animation != null); 16076b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn boolean upperAnimating = mUpperWallpaperTarget.mAnimation != null 16086b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn || (mUpperWallpaperTarget.mAppToken != null 16096b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn && mUpperWallpaperTarget.mAppToken.animation != null); 16106b1cb352b86f2cf983026f2e6814665e12eb8452Dianne Hackborn if (!lowerAnimating || !upperAnimating) { 16113be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn if (DEBUG_WALLPAPER) { 16128a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "No longer animating wallpaper targets!"); 16133be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn } 16143be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mLowerWallpaperTarget = null; 16153be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn mUpperWallpaperTarget = null; 1616f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 1617f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 1618ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1619f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn boolean visible = foundW != null; 1620759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn if (visible) { 16217341d7a104b47996445d069a695e155a07184606Dianne Hackborn // The window is visible to the compositor... but is it visible 16227341d7a104b47996445d069a695e155a07184606Dianne Hackborn // to the user? That is what the wallpaper cares about. 162325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn visible = isWallpaperVisible(foundW); 16248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper visibility: " + visible); 1625ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 16267341d7a104b47996445d069a695e155a07184606Dianne Hackborn // If the wallpaper target is animating, we may need to copy 1627f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // its layer adjustment. Only do this if we are not transfering 1628f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn // between two wallpaper targets. 1629f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn mWallpaperAnimLayerAdjustment = 16303be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn (mLowerWallpaperTarget == null && foundW.mAppToken != null) 1631f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn ? foundW.mAppToken.animLayerAdjustment : 0; 1632ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 16336136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn final int maxLayer = mPolicy.getMaxWallpaperLayer() 16346136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn * TYPE_LAYER_MULTIPLIER 16356136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn + TYPE_LAYER_OFFSET; 1636ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 16374c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // Now w is the window we are supposed to be behind... but we 16384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // need to be sure to also be behind any of its attached windows, 16396136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn // AND any starting window associated with it, AND below the 16406136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn // maximum layer the policy allows for wallpapers. 1641f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn while (foundI > 0) { 1642e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState wb = localmWindows.get(foundI-1); 16436136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn if (wb.mBaseLayer < maxLayer && 16446136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn wb.mAttachedWindow != foundW && 1645428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn (foundW.mAttachedWindow == null || 1646428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn wb.mAttachedWindow != foundW.mAttachedWindow) && 16474c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn (wb.mAttrs.type != TYPE_APPLICATION_STARTING || 1648428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn foundW.mToken == null || wb.mToken != foundW.mToken)) { 16494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // This window is not related to the previous one in any 16504c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // interesting way, so stop here. 16514c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn break; 16524c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1653f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn foundW = wb; 1654f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn foundI--; 16554c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 165625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn } else { 16578a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "No wallpaper target"); 16584c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1659ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 16603b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (foundW == null && topCurW != null) { 16613b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // There is no wallpaper target, so it goes at the bottom. 16623b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // We will assume it is the same place as last time, if known. 16633b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn foundW = topCurW; 16643b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn foundI = topCurI+1; 16653b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else { 16663b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // Okay i is the position immediately above the wallpaper. Look at 16673b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // what is below it for later. 1668e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown foundW = foundI > 0 ? localmWindows.get(foundI-1) : null; 16693b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 1670ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1671284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (visible) { 167273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn if (mWallpaperTarget.mWallpaperX >= 0) { 167373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn mLastWallpaperX = mWallpaperTarget.mWallpaperX; 1674bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen mLastWallpaperXStep = mWallpaperTarget.mWallpaperXStep; 167573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } 167673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn if (mWallpaperTarget.mWallpaperY >= 0) { 167773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn mLastWallpaperY = mWallpaperTarget.mWallpaperY; 1678bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen mLastWallpaperYStep = mWallpaperTarget.mWallpaperYStep; 167973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } 1680284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 1681ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 16824c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // Start stepping backwards from here, ensuring that our wallpaper windows 16834c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // are correctly placed. 16844c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int curTokenIndex = mWallpaperTokens.size(); 16854c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn while (curTokenIndex > 0) { 16864c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn curTokenIndex--; 16874c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn WindowToken token = mWallpaperTokens.get(curTokenIndex); 16880586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn if (token.hidden == visible) { 16890586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn changed |= ADJUST_WALLPAPER_VISIBILITY_CHANGED; 16900586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn token.hidden = !visible; 16910586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // Need to do a layout to ensure the wallpaper now has the 16920586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // correct size. 16930586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn mLayoutNeeded = true; 16940586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn } 1695ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 16964c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int curWallpaperIndex = token.windows.size(); 16974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn while (curWallpaperIndex > 0) { 16984c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn curWallpaperIndex--; 16994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn WindowState wallpaper = token.windows.get(curWallpaperIndex); 1700ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 170172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn if (visible) { 170219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn updateWallpaperOffsetLocked(wallpaper, dw, dh, false); 170372c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn } 1704ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1705759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn // First, make sure the client has the current visibility 1706759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn // state. 1707759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn if (wallpaper.mWallpaperVisible != visible) { 1708759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn wallpaper.mWallpaperVisible = visible; 1709759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn try { 17108a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY || DEBUG_WALLPAPER) Slog.v(TAG, 1711759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn "Setting visibility of wallpaper " + wallpaper 1712759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn + ": " + visible); 1713759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn wallpaper.mClient.dispatchAppVisibility(visible); 1714759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } catch (RemoteException e) { 1715759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 1716759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 1717ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1718759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn wallpaper.mAnimLayer = wallpaper.mLayer + mWallpaperAnimLayerAdjustment; 17198a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper win " 17207341d7a104b47996445d069a695e155a07184606Dianne Hackborn + wallpaper + " anim layer: " + wallpaper.mAnimLayer); 1721ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 17224c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // First, if this window is at the current index, then all 17234c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // is well. 1724f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn if (wallpaper == foundW) { 1725f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn foundI--; 1726f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn foundW = foundI > 0 1727e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown ? localmWindows.get(foundI-1) : null; 17284c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn continue; 17294c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1730ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 17314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // The window didn't match... the current wallpaper window, 17324c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // wherever it is, is in the wrong place, so make sure it is 17334c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // not in the list. 17344c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn int oldIndex = localmWindows.indexOf(wallpaper); 17354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (oldIndex >= 0) { 17368a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Wallpaper removing at " 17379bfb707597898f54722460b48588007b682f3e2aDianne Hackborn + oldIndex + ": " + wallpaper); 17384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn localmWindows.remove(oldIndex); 1739dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 1740f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn if (oldIndex < foundI) { 1741f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn foundI--; 17424c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 17434c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1744ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 17454c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn // Now stick it in. 1746f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_WALLPAPER || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) { 1747f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn Slog.v(TAG, "Moving wallpaper " + wallpaper 1748f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn + " from " + oldIndex + " to " + foundI); 1749f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 1750ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1751f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn localmWindows.add(foundI, wallpaper); 1752dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 17530586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn changed |= ADJUST_WALLPAPER_LAYERS_CHANGED; 17544c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 17554c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 1756ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 17574c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return changed; 17584c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 17594c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn 1760c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn void setWallpaperAnimLayerAdjustmentLocked(int adj) { 17618a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG, 17627341d7a104b47996445d069a695e155a07184606Dianne Hackborn "Setting wallpaper layer adj to " + adj); 1763759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn mWallpaperAnimLayerAdjustment = adj; 1764759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn int curTokenIndex = mWallpaperTokens.size(); 1765759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn while (curTokenIndex > 0) { 1766759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn curTokenIndex--; 1767759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn WindowToken token = mWallpaperTokens.get(curTokenIndex); 1768759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn int curWallpaperIndex = token.windows.size(); 1769759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn while (curWallpaperIndex > 0) { 1770759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn curWallpaperIndex--; 1771759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn WindowState wallpaper = token.windows.get(curWallpaperIndex); 1772759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn wallpaper.mAnimLayer = wallpaper.mLayer + adj; 17738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper win " 17747341d7a104b47996445d069a695e155a07184606Dianne Hackborn + wallpaper + " anim layer: " + wallpaper.mAnimLayer); 1775759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 1776759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 1777759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 1778759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn 177919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn boolean updateWallpaperOffsetLocked(WindowState wallpaperWin, int dw, int dh, 178019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn boolean sync) { 178172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn boolean changed = false; 17827341d7a104b47996445d069a695e155a07184606Dianne Hackborn boolean rawChanged = false; 178373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn float wpx = mLastWallpaperX >= 0 ? mLastWallpaperX : 0.5f; 1784bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen float wpxs = mLastWallpaperXStep >= 0 ? mLastWallpaperXStep : -1.0f; 1785ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn int availw = wallpaperWin.mFrame.right-wallpaperWin.mFrame.left-dw; 178673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn int offset = availw > 0 ? -(int)(availw*wpx+.5f) : 0; 178773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn changed = wallpaperWin.mXOffset != offset; 178873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn if (changed) { 17898a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "Update wallpaper " 179073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn + wallpaperWin + " x: " + offset); 179173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn wallpaperWin.mXOffset = offset; 179273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } 1793bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen if (wallpaperWin.mWallpaperX != wpx || wallpaperWin.mWallpaperXStep != wpxs) { 179473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn wallpaperWin.mWallpaperX = wpx; 1795bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen wallpaperWin.mWallpaperXStep = wpxs; 179673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn rawChanged = true; 1797c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 1798ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 179973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn float wpy = mLastWallpaperY >= 0 ? mLastWallpaperY : 0.5f; 1800bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen float wpys = mLastWallpaperYStep >= 0 ? mLastWallpaperYStep : -1.0f; 180173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn int availh = wallpaperWin.mFrame.bottom-wallpaperWin.mFrame.top-dh; 180273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn offset = availh > 0 ? -(int)(availh*wpy+.5f) : 0; 180373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn if (wallpaperWin.mYOffset != offset) { 18048a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "Update wallpaper " 180573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn + wallpaperWin + " y: " + offset); 180673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn changed = true; 180773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn wallpaperWin.mYOffset = offset; 180873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } 1809bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen if (wallpaperWin.mWallpaperY != wpy || wallpaperWin.mWallpaperYStep != wpys) { 181073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn wallpaperWin.mWallpaperY = wpy; 1811bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen wallpaperWin.mWallpaperYStep = wpys; 181273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn rawChanged = true; 181372c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn } 1814ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 18157341d7a104b47996445d069a695e155a07184606Dianne Hackborn if (rawChanged) { 181672c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn try { 18178a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "Report new wp offset " 1818e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn + wallpaperWin + " x=" + wallpaperWin.mWallpaperX 1819e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn + " y=" + wallpaperWin.mWallpaperY); 182019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn if (sync) { 18217580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mWaitingOnWallpaper = wallpaperWin; 182219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 182372c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn wallpaperWin.mClient.dispatchWallpaperOffsets( 1824bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen wallpaperWin.mWallpaperX, wallpaperWin.mWallpaperY, 1825bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen wallpaperWin.mWallpaperXStep, wallpaperWin.mWallpaperYStep, sync); 182619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn if (sync) { 18277580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn if (mWaitingOnWallpaper != null) { 18287580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn long start = SystemClock.uptimeMillis(); 18297580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn if ((mLastWallpaperTimeoutTime+WALLPAPER_TIMEOUT_RECOVERY) 18307580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn < start) { 18317580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn try { 18328a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 18337580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn "Waiting for offset complete..."); 18347580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mWindowMap.wait(WALLPAPER_TIMEOUT); 18357580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } catch (InterruptedException e) { 18367580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 18378a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "Offset complete!"); 18387580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn if ((start+WALLPAPER_TIMEOUT) 18397580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn < SystemClock.uptimeMillis()) { 18408a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, "Timeout waiting for wallpaper to offset: " 18417580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn + wallpaperWin); 18427580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mLastWallpaperTimeoutTime = start; 184319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 184419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 18457580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mWaitingOnWallpaper = null; 184619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 184719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 184872c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn } catch (RemoteException e) { 184972c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn } 1850c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 1851ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1852c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn return changed; 1853c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 1854ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 185519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn void wallpaperOffsetsComplete(IBinder window) { 18567580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn synchronized (mWindowMap) { 185719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn if (mWaitingOnWallpaper != null && 185819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn mWaitingOnWallpaper.mClient.asBinder() == window) { 185919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn mWaitingOnWallpaper = null; 18607580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mWindowMap.notifyAll(); 186119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 186219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 186319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 1864ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 186573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn boolean updateWallpaperOffsetLocked(WindowState changingTarget, boolean sync) { 186681e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn final int dw = mAppDisplayWidth; 186781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn final int dh = mAppDisplayHeight; 1868ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1869c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn boolean changed = false; 1870ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1871c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn WindowState target = mWallpaperTarget; 1872c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn if (target != null) { 187373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn if (target.mWallpaperX >= 0) { 187473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn mLastWallpaperX = target.mWallpaperX; 187573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } else if (changingTarget.mWallpaperX >= 0) { 187673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn mLastWallpaperX = changingTarget.mWallpaperX; 187773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } 187873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn if (target.mWallpaperY >= 0) { 187973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn mLastWallpaperY = target.mWallpaperY; 188073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } else if (changingTarget.mWallpaperY >= 0) { 188173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn mLastWallpaperY = changingTarget.mWallpaperY; 188273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } 188373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn } 1884ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 188573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn int curTokenIndex = mWallpaperTokens.size(); 188673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn while (curTokenIndex > 0) { 188773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn curTokenIndex--; 188873e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn WindowToken token = mWallpaperTokens.get(curTokenIndex); 188973e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn int curWallpaperIndex = token.windows.size(); 189073e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn while (curWallpaperIndex > 0) { 189173e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn curWallpaperIndex--; 189273e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn WindowState wallpaper = token.windows.get(curWallpaperIndex); 189373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn if (updateWallpaperOffsetLocked(wallpaper, dw, dh, sync)) { 189473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn wallpaper.computeShownFrameLocked(); 189573e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn changed = true; 189673e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn // We only want to be synchronous with one wallpaper. 189773e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn sync = false; 1898c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 1899c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 1900c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 1901ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1902c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn return changed; 1903c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 1904ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1905e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn void updateWallpaperVisibilityLocked() { 190625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn final boolean visible = isWallpaperVisible(mWallpaperTarget); 190781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn final int dw = mAppDisplayWidth; 190881e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn final int dh = mAppDisplayHeight; 1909ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1910e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn int curTokenIndex = mWallpaperTokens.size(); 1911e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn while (curTokenIndex > 0) { 1912e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn curTokenIndex--; 1913e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn WindowToken token = mWallpaperTokens.get(curTokenIndex); 19140586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn if (token.hidden == visible) { 19150586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn token.hidden = !visible; 19160586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // Need to do a layout to ensure the wallpaper now has the 19170586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // correct size. 19180586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn mLayoutNeeded = true; 19190586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn } 1920ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1921e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn int curWallpaperIndex = token.windows.size(); 1922e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn while (curWallpaperIndex > 0) { 1923e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn curWallpaperIndex--; 1924e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn WindowState wallpaper = token.windows.get(curWallpaperIndex); 1925e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn if (visible) { 192619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn updateWallpaperOffsetLocked(wallpaper, dw, dh, false); 1927e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 1928ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 1929e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn if (wallpaper.mWallpaperVisible != visible) { 1930e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn wallpaper.mWallpaperVisible = visible; 1931e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn try { 19328a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY || DEBUG_WALLPAPER) Slog.v(TAG, 193325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn "Updating visibility of wallpaper " + wallpaper 1934e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn + ": " + visible); 1935e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn wallpaper.mClient.dispatchAppVisibility(visible); 1936e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } catch (RemoteException e) { 1937e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 1938e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 1939e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 1940e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 1941e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 194290d2db3d21d07c2a4b4cbbc558f5ec59d20098c3Dianne Hackborn 19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int addWindow(Session session, IWindow client, 19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams attrs, int viewVisibility, 194546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown Rect outContentInsets, InputChannel outInputChannel) { 19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int res = mPolicy.checkAddPermission(attrs); 19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != WindowManagerImpl.ADD_OKAY) { 19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 195006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean reportNewConfig = false; 19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState attachedWindow = null; 19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = null; 19545132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn long origId; 195506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDisplay == null) { 19585132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn throw new IllegalStateException("Display has not been initialialized"); 19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 196006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mWindowMap.containsKey(client.asBinder())) { 19628a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Window " + client + " is already added"); 19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_DUPLICATE_ADD; 19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attrs.type >= FIRST_SUB_WINDOW && attrs.type <= LAST_SUB_WINDOW) { 1967e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn attachedWindow = windowForClientLocked(null, attrs.token, false); 19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attachedWindow == null) { 19698a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add window with token that is not a window: " 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + attrs.token + ". Aborting."); 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN; 19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attachedWindow.mAttrs.type >= FIRST_SUB_WINDOW 19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && attachedWindow.mAttrs.type <= LAST_SUB_WINDOW) { 19758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add window with token that is a sub-window: " 19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + attrs.token + ". Aborting."); 19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN; 19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean addToken = false; 19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken token = mTokenMap.get(attrs.token); 19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token == null) { 19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attrs.type >= FIRST_APPLICATION_WINDOW 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && attrs.type <= LAST_APPLICATION_WINDOW) { 19868a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add application window with unknown token " 19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + attrs.token + ". Aborting."); 19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_BAD_APP_TOKEN; 19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attrs.type == TYPE_INPUT_METHOD) { 19918a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add input method window with unknown token " 19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + attrs.token + ". Aborting."); 19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_BAD_APP_TOKEN; 19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (attrs.type == TYPE_WALLPAPER) { 19968a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add wallpaper window with unknown token " 19974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn + attrs.token + ". Aborting."); 19984c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return WindowManagerImpl.ADD_BAD_APP_TOKEN; 19994c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 20006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn token = new WindowToken(this, attrs.token, -1, false); 20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addToken = true; 20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (attrs.type >= FIRST_APPLICATION_WINDOW 20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && attrs.type <= LAST_APPLICATION_WINDOW) { 20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken atoken = token.appWindowToken; 20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken == null) { 20068a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add window with non-application token " 20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + token + ". Aborting."); 20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_NOT_APP_TOKEN; 20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (atoken.removed) { 20108a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add window with exiting application token " 20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + token + ". Aborting."); 20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_APP_EXITING; 20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attrs.type == TYPE_APPLICATION_STARTING && atoken.firstWindowDrawn) { 20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // No need for this guy! 20168a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v( 20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "**** NO NEED TO START: " + attrs.getTitle()); 20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_STARTING_NOT_NEEDED; 20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (attrs.type == TYPE_INPUT_METHOD) { 20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token.windowType != TYPE_INPUT_METHOD) { 20228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add input method window with bad token " 20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + attrs.token + ". Aborting."); 20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_BAD_APP_TOKEN; 20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20264c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } else if (attrs.type == TYPE_WALLPAPER) { 20274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (token.windowType != TYPE_WALLPAPER) { 20288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add wallpaper window with bad token " 20294c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn + attrs.token + ". Aborting."); 20304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn return WindowManagerImpl.ADD_BAD_APP_TOKEN; 20314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn win = new WindowState(this, session, client, token, 20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attachedWindow, attrs, viewVisibility); 20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mDeathRecipient == null) { 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Client has apparently died, so there is no reason to 20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // continue. 20398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Adding window client " + client.asBinder() 20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " that is dead, aborting."); 20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WindowManagerImpl.ADD_APP_EXITING; 20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.adjustWindowParamsLw(win.mAttrs); 204506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = mPolicy.prepareAddWindowLw(win, attrs); 20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != WindowManagerImpl.ADD_OKAY) { 20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 205046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 205100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown if (outInputChannel != null) { 205200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown String name = win.makeInputChannelName(); 205300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown InputChannel[] inputChannels = InputChannel.openInputChannelPair(name); 205400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown win.mInputChannel = inputChannels[0]; 205500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown inputChannels[1].transferToBinderOutParameter(outInputChannel); 205600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 2057928e054931d357326613c78e62f4d850b7c442ffJeff Brown mInputManager.registerInputChannel(win.mInputChannel, win.mInputWindowHandle); 205846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // From now on, no exceptions or errors allowed! 20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = WindowManagerImpl.ADD_OKAY; 206306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 20645132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn origId = Binder.clearCallingIdentity(); 206506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (addToken) { 20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTokenMap.put(attrs.token, token); 20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.attach(); 20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowMap.put(client.asBinder(), win); 20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attrs.type == TYPE_APPLICATION_STARTING && 20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.appWindowToken != null) { 20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.appWindowToken.startingWindow = win; 20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean imMayMove = true; 207806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attrs.type == TYPE_INPUT_METHOD) { 20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodWindow = win; 20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addInputMethodWindowToListLocked(win); 20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imMayMove = false; 20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (attrs.type == TYPE_INPUT_METHOD_DIALOG) { 20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodDialogs.add(win); 20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addWindowToListInOrderLocked(win, true); 20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project adjustInputMethodDialogsLocked(); 20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imMayMove = false; 20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addWindowToListInOrderLocked(win, true); 209019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn if (attrs.type == TYPE_WALLPAPER) { 209119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn mLastWallpaperTimeoutTime = 0; 209219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn adjustWallpaperWindowsLocked(); 209319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } else if ((attrs.flags&FLAG_SHOW_WALLPAPER) != 0) { 20944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn adjustWallpaperWindowsLocked(); 20954c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 209706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mEnterAnimationPending = true; 209906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.getContentInsetHintLw(attrs, outContentInsets); 210106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInTouchMode) { 21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res |= WindowManagerImpl.ADD_FLAG_IN_TOUCH_MODE; 21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win == null || win.mAppToken == null || !win.mAppToken.clientHidden) { 21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res |= WindowManagerImpl.ADD_FLAG_APP_VISIBLE; 21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 210806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21092e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.setUpdateInputWindowsNeededLw(); 21102e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown 2111c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project boolean focusChanged = false; 21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.canReceiveKeys()) { 21133a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown focusChanged = updateFocusedWindowLocked(UPDATE_FOCUS_WILL_ASSIGN_LAYERS, 21143a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/); 2115349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown if (focusChanged) { 21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imMayMove = false; 21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 211906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imMayMove) { 212106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy moveInputMethodWindowsIfNeededLocked(false); 21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 212306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assignLayersLocked(); 21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Don't do layout here, the window must call 21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // relayout to be displayed, so we'll do it there. 212706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //dump(); 21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2130c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project if (focusChanged) { 21313a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown finishUpdateFocusedWindowAfterAssignLayersLocked(false /*updateInputWindows*/); 2132c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project } 21332e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(false /*force*/); 21343a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown 21358a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v( 21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "New client " + client.asBinder() 21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": window=" + win); 2138e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 213994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (win.isVisibleOrAdding() && updateOrientationFromAppTokensLocked(false)) { 2140e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn reportNewConfig = true; 2141e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (reportNewConfig) { 21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendNewConfiguration(); 21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21475132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn 21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 214906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 215206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeWindow(Session session, IWindow client) { 21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 2155e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn WindowState win = windowForClientLocked(session, client, false); 21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win == null) { 21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeWindowLocked(session, win); 21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 216206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeWindowLocked(Session session, WindowState win) { 21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21658a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV || DEBUG_FOCUS) Slog.v( 21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Remove " + win + " client=" 21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode( 21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mClient.asBinder())) 21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", surface=" + win.mSurface); 21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 2172c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 2173c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown win.disposeInputChannel(); 217406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v( 21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Remove " + win + ": mSurface=" + win.mSurface 21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mExiting=" + win.mExiting 21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " isAnimating=" + win.isAnimating() 21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " app-animation=" 21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (win.mAppToken != null ? win.mAppToken.animation : null) 21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " inPendingTransaction=" 21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (win.mAppToken != null ? win.mAppToken.inPendingTransaction : false) 21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mDisplayFrozen=" + mDisplayFrozen); 21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Visibility of the removed window. Will be used later to update orientation later on. 21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean wasVisible = false; 21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // First, see if we need to run an animation. If we do, we have 21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to hold off on removing the window until the animation is done. 21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the display is frozen, just remove immediately, since the 21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // animation wouldn't be seen. 2190de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn if (win.mSurface != null && !mDisplayFrozen && mPolicy.isScreenOn()) { 21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are not currently running the exit animation, we 21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // need to see about starting one. 21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wasVisible=win.isWinVisibleLw()) { 219406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int transit = WindowManagerPolicy.TRANSIT_EXIT; 21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.getAttrs().type == TYPE_APPLICATION_STARTING) { 21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project transit = WindowManagerPolicy.TRANSIT_PREVIEW_DONE; 21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Try starting an animation. 22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (applyAnimationLocked(win, transit, false)) { 22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mExiting = true; 22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mExiting || win.isAnimating()) { 22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The exit animation is running... wait for it! 22068a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "*** Running exit animation..."); 22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mExiting = true; 22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mRemoveOnExit = true; 22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 22103a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, 22113a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/); 22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 22132e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(false /*force*/); 22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mAppToken != null) { 22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mAppToken.updateReportedVisibilityLocked(); 22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //dump(); 22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeWindowInnerLocked(session, win); 22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Removing a visible window will effect the computed orientation 22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // So just update orientation if needed. 2226c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project if (wasVisible && computeForcedAppOrientationLocked() 2227e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn != mForcedAppOrientation 222894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn && updateOrientationFromAppTokensLocked(false)) { 2229e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION); 22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22313a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/); 22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 223406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void removeWindowInnerLocked(Session session, WindowState win) { 2236f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (win.mRemoved) { 2237f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn // Nothing to do. 2238f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn return; 2239f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 2240f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn 2241f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn for (int i=win.mChildWindows.size()-1; i>=0; i--) { 2242f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn WindowState cwin = win.mChildWindows.get(i); 2243f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn Slog.w(TAG, "Force-removing child win " + cwin + " from container " 2244f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn + win); 2245f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn removeWindowInnerLocked(cwin.mSession, cwin); 2246f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 2247f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn 22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mRemoved = true; 224906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInputMethodTarget == win) { 22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project moveInputMethodWindowsIfNeededLocked(false); 22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 225306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 2254bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn if (false) { 2255bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn RuntimeException e = new RuntimeException("here"); 2256bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn e.fillInStackTrace(); 22578a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Removing window " + win, e); 2258bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn } 2259ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.removeWindowLw(win); 22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.removeLocked(); 22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2263f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE) Slog.v(TAG, "removeWindowInnerLocked: " + win); 22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowMap.remove(win.mClient.asBinder()); 22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.remove(win); 2266f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn mPendingRemove.remove(win); 2267dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 22688a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Final remove of window: " + win); 22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInputMethodWindow == win) { 22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodWindow = null; 22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (win.mAttrs.type == TYPE_INPUT_METHOD_DIALOG) { 22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodDialogs.remove(win); 22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 227506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowToken token = win.mToken; 22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken atoken = win.mAppToken; 2278f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Removing " + win + " from " + token); 22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.windows.remove(win); 22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken != null) { 22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.allAppWindows.remove(win); 22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22838a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v( 22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "**** Removing window " + win + ": count=" 22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + token.windows.size()); 22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token.windows.size() == 0) { 22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!token.explicit) { 22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTokenMap.remove(token.token); 22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (atoken != null) { 22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.firstWindowDrawn = false; 22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken != null) { 22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken.startingWindow == win) { 22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.startingWindow = null; 22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (atoken.allAppWindows.size() == 0 && atoken.startingData != null) { 22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this is the last window and we had requested a starting 22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // transition window, well there is no point now. 23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.startingData = null; 23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (atoken.allAppWindows.size() == 1 && atoken.startingView != null) { 23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this is the last window except for a starting transition 23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // window, we need to get rid of the starting transition. 23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_STARTING_WINDOW) { 23058a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Schedule remove starting " + token 23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": no more real windows"); 23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = mH.obtainMessage(H.REMOVE_STARTING, atoken); 23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessage(m); 23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 231206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 231319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn if (win.mAttrs.type == TYPE_WALLPAPER) { 231419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn mLastWallpaperTimeoutTime = 0; 231519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn adjustWallpaperWindowsLocked(); 231619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } else if ((win.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0) { 2317e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn adjustWallpaperWindowsLocked(); 2318e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 2319ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mInLayout) { 23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assignLayersLocked(); 23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mAppToken != null) { 23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mAppToken.updateReportedVisibilityLocked(); 23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2328c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 23292e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(true /*force*/); 23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn static void logSurface(WindowState w, String msg, RuntimeException where) { 2333b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn String str = " SURFACE " + Integer.toHexString(w.hashCode()) 2334b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + ": " + msg + " / " + w.mAttrs.getTitle(); 2335b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (where != null) { 2336b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn Slog.i(TAG, str, where); 2337b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } else { 2338b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn Slog.i(TAG, str); 2339b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 2340b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 2341b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 23426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn void setTransparentRegionWindow(Session session, IWindow client, Region region) { 23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long origId = Binder.clearCallingIdentity(); 23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 2346e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn WindowState w = windowForClientLocked(session, client, false); 23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((w != null) && (w.mSurface != null)) { 234894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, 234994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn ">>> OPEN TRANSACTION setTransparentRegion"); 23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Surface.openTransaction(); 23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2352b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (SHOW_TRANSACTIONS) logSurface(w, 2353b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn "transparentRegionHint=" + region, null); 23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mSurface.setTransparentRegionHint(region); 23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Surface.closeTransaction(); 235794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, 235894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn "<<< CLOSE TRANSACTION setTransparentRegion"); 23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setInsetsWindow(Session session, IWindow client, 236806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy int touchableInsets, Rect contentInsets, 2369fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown Rect visibleInsets, Region touchableRegion) { 23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long origId = Binder.clearCallingIdentity(); 23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 2373e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn WindowState w = windowForClientLocked(session, client, false); 23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w != null) { 23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mGivenInsetsPending = false; 23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mGivenContentInsets.set(contentInsets); 23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mGivenVisibleInsets.set(visibleInsets); 2378fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown w.mGivenTouchableRegion.set(touchableRegion); 23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mTouchableInsets = touchableInsets; 2380ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn if (w.mGlobalScale != 1) { 2381ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn w.mGivenContentInsets.scale(w.mGlobalScale); 2382ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn w.mGivenVisibleInsets.scale(w.mGlobalScale); 2383ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn w.mGivenTouchableRegion.scale(w.mGlobalScale); 2384ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn } 23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 239306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void getWindowDisplayFrame(Session session, IWindow client, 23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect outDisplayFrame) { 23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 2397e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn WindowState win = windowForClientLocked(session, client, false); 23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win == null) { 23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outDisplayFrame.setEmpty(); 24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outDisplayFrame.set(win.mDisplayFrame); 24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2406bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen public void setWindowWallpaperPositionLocked(WindowState window, float x, float y, 2407bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen float xStep, float yStep) { 2408c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn if (window.mWallpaperX != x || window.mWallpaperY != y) { 2409c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn window.mWallpaperX = x; 2410c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn window.mWallpaperY = y; 2411bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen window.mWallpaperXStep = xStep; 2412bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen window.mWallpaperYStep = yStep; 241373e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn if (updateWallpaperOffsetLocked(window, true)) { 241473e92b4291823a7669e91483a5ce29c3d44f56b3Dianne Hackborn performLayoutAndPlaceSurfacesLocked(); 2415c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 2416c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 2417c8a0a75e1c61d1ab24bd46a8243041c107e738acDianne Hackborn } 2418ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 24197580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn void wallpaperCommandComplete(IBinder window, Bundle result) { 24207580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn synchronized (mWindowMap) { 24217580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn if (mWaitingOnWallpaper != null && 24227580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mWaitingOnWallpaper.mClient.asBinder() == window) { 24237580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mWaitingOnWallpaper = null; 24247580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn mWindowMap.notifyAll(); 24257580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 24267580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 24277580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 2428ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 24297580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn public Bundle sendWindowWallpaperCommandLocked(WindowState window, 24307580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn String action, int x, int y, int z, Bundle extras, boolean sync) { 24317580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn if (window == mWallpaperTarget || window == mLowerWallpaperTarget 24327580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn || window == mUpperWallpaperTarget) { 24337580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn boolean doWait = sync; 24347580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn int curTokenIndex = mWallpaperTokens.size(); 24357580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn while (curTokenIndex > 0) { 24367580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn curTokenIndex--; 24377580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn WindowToken token = mWallpaperTokens.get(curTokenIndex); 24387580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn int curWallpaperIndex = token.windows.size(); 24397580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn while (curWallpaperIndex > 0) { 24407580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn curWallpaperIndex--; 24417580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn WindowState wallpaper = token.windows.get(curWallpaperIndex); 24427580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn try { 24437580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn wallpaper.mClient.dispatchWallpaperCommand(action, 24447580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn x, y, z, extras, sync); 24457580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn // We only want to be synchronous with one wallpaper. 24467580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn sync = false; 24477580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } catch (RemoteException e) { 24487580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 24497580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 24507580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 2451ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 24527580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn if (doWait) { 24537580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn // XXX Need to wait for result. 24547580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 24557580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 2456ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 24577580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn return null; 24587580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn } 2459ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int relayoutWindow(Session session, IWindow client, 24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams attrs, int requestedWidth, 24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int requestedHeight, int viewVisibility, boolean insetsPending, 24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect outFrame, Rect outContentInsets, Rect outVisibleInsets, 2464694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn Configuration outConfig, Surface outSurface) { 24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean displayed = false; 24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean inTouchMode; 2467e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean configChanged; 2468ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato 2469ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato // if they don't have this permission, mask out the status bar bits 2470ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato if (attrs != null) { 2471a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (((attrs.systemUiVisibility|attrs.subtreeSystemUiVisibility) 2472a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn & StatusBarManager.DISABLE_MASK) != 0) { 2473a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR) 2474a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn != PackageManager.PERMISSION_GRANTED) { 2475a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn attrs.systemUiVisibility &= ~StatusBarManager.DISABLE_MASK; 2476a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn attrs.subtreeSystemUiVisibility &= ~StatusBarManager.DISABLE_MASK; 2477a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 2478ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato } 2479ac0ee89bd985c024870fefca9a3422c4585b62d4Joe Onorato } 24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long origId = Binder.clearCallingIdentity(); 248106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 2483e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn WindowState win = windowForClientLocked(session, client, false); 24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win == null) { 24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mRequestedWidth = requestedWidth; 24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mRequestedHeight = requestedHeight; 24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attrs != null) { 24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.adjustWindowParamsLw(attrs); 24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 249306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int attrChanges = 0; 24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flagChanges = 0; 24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attrs != null) { 24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flagChanges = win.mAttrs.flags ^= attrs.flags; 24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attrChanges = win.mAttrs.copyFrom(attrs); 24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYOUT) Slog.v(TAG, "Relayout " + win + ": " + win.mAttrs); 25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25035fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn win.mEnforceSizeCompat = (win.mAttrs.flags & FLAG_COMPATIBLE_WINDOW) != 0; 25045fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn 25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((attrChanges & WindowManager.LayoutParams.ALPHA_CHANGED) != 0) { 25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mAlpha = attrs.alpha; 25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean scaledWindow = 25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((win.mAttrs.flags & WindowManager.LayoutParams.FLAG_SCALED) != 0); 25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scaledWindow) { 25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // requested{Width|Height} Surface's physical size 25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // attrs.{width|height} Size on screen 25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mHScale = (attrs.width != requestedWidth) ? 25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (attrs.width / (float)requestedWidth) : 1.0f; 25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mVScale = (attrs.height != requestedHeight) ? 25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (attrs.height / (float)requestedHeight) : 1.0f; 25199b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn } else { 25209b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn win.mHScale = win.mVScale = 1; 25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean imMayMove = (flagChanges&( 25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM | 25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)) != 0; 252606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean focusMayChange = win.mViewVisibility != viewVisibility 25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || ((flagChanges&WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) != 0) 25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (!win.mRelayoutCalled); 253006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 25314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn boolean wallpaperMayMove = win.mViewVisibility != viewVisibility 25324c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn && (win.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0; 2533ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mRelayoutCalled = true; 25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int oldVisibility = win.mViewVisibility; 25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mViewVisibility = viewVisibility; 25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (viewVisibility == View.VISIBLE && 25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (win.mAppToken == null || !win.mAppToken.clientHidden)) { 25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayed = !win.isVisibleLw(); 25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mExiting) { 25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mExiting = false; 25423fe3851753e3623d3c7c468efa6ee17f17f9aa74Brad Fitzpatrick if (win.mAnimation != null) { 25433fe3851753e3623d3c7c468efa6ee17f17f9aa74Brad Fitzpatrick win.mAnimation.cancel(); 25443fe3851753e3623d3c7c468efa6ee17f17f9aa74Brad Fitzpatrick win.mAnimation = null; 25453fe3851753e3623d3c7c468efa6ee17f17f9aa74Brad Fitzpatrick } 25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mDestroying) { 25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mDestroying = false; 25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDestroySurface.remove(win); 25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldVisibility == View.GONE) { 25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mEnterAnimationPending = true; 25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2554694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn if (displayed) { 2555694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn if (win.mSurface != null && !win.mDrawPending 2556694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn && !win.mCommitDrawPending && !mDisplayFrozen 2557694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn && mPolicy.isScreenOn()) { 2558694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn applyEnterAnimationLocked(win); 2559694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn } 2560694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn if ((win.mAttrs.flags 2561694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn & WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON) != 0) { 2562694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn if (DEBUG_VISIBILITY) Slog.v(TAG, 2563694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn "Relayout window turning screen on: " + win); 2564694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn win.mTurnOnScreen = true; 2565694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn } 2566694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn int diff = 0; 2567694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn if (win.mConfiguration != mCurConfiguration 2568694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn && (win.mConfiguration == null 2569694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn || (diff=mCurConfiguration.diff(win.mConfiguration)) != 0)) { 2570694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn win.mConfiguration = mCurConfiguration; 2571694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn if (DEBUG_CONFIGURATION) { 2572694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn Slog.i(TAG, "Window " + win + " visible with new config: " 2573694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn + win.mConfiguration + " / 0x" 2574694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn + Integer.toHexString(diff)); 2575694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn } 2576694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn outConfig.setTo(mCurConfiguration); 2577694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn } 257893e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn } 25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((attrChanges&WindowManager.LayoutParams.FORMAT_CHANGED) != 0) { 25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // To change the format, we need to re-build the surface. 25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.destroySurfaceLocked(); 25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayed = true; 25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Surface surface = win.createSurfaceLocked(); 25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (surface != null) { 25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outSurface.copyFrom(surface); 25883b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn win.mReportDestroySurface = false; 25893b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn win.mSurfacePendingDestroy = false; 25908a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (SHOW_TRANSACTIONS) Slog.i(TAG, 25910586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn " OUT SURFACE " + outSurface + ": copied"); 25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 25930586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // For some reason there isn't a surface. Clear the 25940586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // caller's object so they see the same state. 25950586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn outSurface.release(); 25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 25982e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(true /*force*/); 2599e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown 26008a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Exception thrown when creating surface for client " 26010586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn + client + " (" + win.mAttrs.getTitle() + ")", 26020586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn e); 26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (displayed) { 26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project focusMayChange = true; 26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mAttrs.type == TYPE_INPUT_METHOD 26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && mInputMethodWindow == null) { 26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodWindow = win; 26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imMayMove = true; 26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2614558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn if (win.mAttrs.type == TYPE_BASE_APPLICATION 2615558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn && win.mAppToken != null 2616558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn && win.mAppToken.startingWindow != null) { 2617558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn // Special handling of starting window over the base 2618558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn // window of the app: propagate lock screen flags to it, 2619558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn // to provide the correct semantics while starting. 2620558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn final int mask = 2621558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 2622ef73162887943e16587b8e737b19e59348338e8cMike Lockwood | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 2623ef73162887943e16587b8e737b19e59348338e8cMike Lockwood | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON; 2624558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn WindowManager.LayoutParams sa = win.mAppToken.startingWindow.mAttrs; 2625558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn sa.flags = (sa.flags&~mask) | (win.mAttrs.flags&mask); 2626558947c9899627067d632e8a6365f77a35f433e1Dianne Hackborn } 26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mEnterAnimationPending = false; 26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mSurface != null) { 26308a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY) Slog.i(TAG, "Relayout invis " + win 26313b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn + ": mExiting=" + win.mExiting 26323b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn + " mSurfacePendingDestroy=" + win.mSurfacePendingDestroy); 26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are not currently running the exit animation, we 26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // need to see about starting one. 26353b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (!win.mExiting || win.mSurfacePendingDestroy) { 26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Try starting an animation; if there isn't one, we 26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // can destroy the surface right away. 26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int transit = WindowManagerPolicy.TRANSIT_EXIT; 26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.getAttrs().type == TYPE_APPLICATION_STARTING) { 26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project transit = WindowManagerPolicy.TRANSIT_PREVIEW_DONE; 26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26423b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (!win.mSurfacePendingDestroy && win.isWinVisibleLw() && 26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applyAnimationLocked(win, transit, false)) { 26443b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn focusMayChange = true; 26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mExiting = true; 26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (win.isAnimating()) { 26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Currently in a hide animation... turn this into 26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // an exit. 26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mExiting = true; 26506136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn } else if (win == mWallpaperTarget) { 26516136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn // If the wallpaper is currently behind this 26526136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn // window, we need to change both of them inside 26536136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn // of a transaction to avoid artifacts. 26546136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn win.mExiting = true; 26556136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn win.mAnimating = true; 26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInputMethodWindow == win) { 26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodWindow = null; 26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.destroySurfaceLocked(); 26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2664ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 26653b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (win.mSurface == null || (win.getAttrs().flags 26663b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn & WindowManager.LayoutParams.FLAG_KEEP_SURFACE_WHILE_ANIMATING) == 0 26673b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn || win.mSurfacePendingDestroy) { 26683b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // We are being called from a local process, which 26693b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // means outSurface holds its current surface. Ensure the 26703b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // surface object is cleared, but we don't want it actually 26713b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // destroyed at this point. 26723b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn win.mSurfacePendingDestroy = false; 26733b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn outSurface.release(); 26748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY) Slog.i(TAG, "Releasing surface in: " + win); 26753b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else if (win.mSurface != null) { 26768a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY) Slog.i(TAG, 26773b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn "Keeping surface, will report destroy: " + win); 26783b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn win.mReportDestroySurface = true; 26793b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn outSurface.copyFrom(win.mSurface); 26803b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (focusMayChange) { 26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //System.out.println("Focus may change: " + win.mAttrs.getTitle()); 26853a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown if (updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, 26863a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/)) { 26879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imMayMove = false; 26889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //System.out.println("Relayout " + win + ": focus=" + mCurrentFocus); 26909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 269106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 2692c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project // updateFocusedWindowLocked() already assigned layers so we only need to 2693c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project // reassign them at this point if the IM window state gets shuffled 2694c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project boolean assignLayers = false; 269506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imMayMove) { 26978abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn if (moveInputMethodWindowsIfNeededLocked(false) || displayed) { 26988abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn // Little hack here -- we -should- be able to rely on the 26998abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn // function to return true if the IME has moved and needs 27008abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn // its layer recomputed. However, if the IME was hidden 27018abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn // and isn't actually moved in the list, its layer may be 27028abd5f0d519afa787e7c64e429df17ccc661ce75Dianne Hackborn // out of data so we make sure to recompute it. 27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assignLayers = true; 27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27064c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (wallpaperMayMove) { 27070586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn if ((adjustWallpaperWindowsLocked()&ADJUST_WALLPAPER_LAYERS_CHANGED) != 0) { 27084c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn assignLayers = true; 27094c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 27104c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 271106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mGivenInsetsPending = insetsPending; 27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (assignLayers) { 27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assignLayersLocked(); 27169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 271794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn configChanged = updateOrientationFromAppTokensLocked(false); 27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 2719284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (displayed && win.mIsWallpaper) { 272081e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn updateWallpaperOffsetLocked(win, mAppDisplayWidth, mAppDisplayHeight, false); 2721284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mAppToken != null) { 27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mAppToken.updateReportedVisibilityLocked(); 27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2725ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn outFrame.set(win.mCompatFrame); 27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outContentInsets.set(win.mContentInsets); 27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outVisibleInsets.set(win.mVisibleInsets); 27288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v( 27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Relayout given client " + client.asBinder() 273006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy + ", requestedWidth=" + requestedWidth 27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", requestedHeight=" + requestedHeight 27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", viewVisibility=" + viewVisibility 27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "\nRelayout returning frame=" + outFrame 27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", surface=" + outSurface); 27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27368a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV || DEBUG_FOCUS) Slog.v( 27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Relayout of " + win + ": focusMayChange=" + focusMayChange); 27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inTouchMode = mInTouchMode; 2740e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown 27412e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(true /*force*/); 27429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2744e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (configChanged) { 27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendNewConfiguration(); 27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 274706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 274906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (inTouchMode ? WindowManagerImpl.RELAYOUT_IN_TOUCH_MODE : 0) 27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | (displayed ? WindowManagerImpl.RELAYOUT_FIRST_TIME : 0); 27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2754648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn public boolean outOfMemoryWindow(Session session, IWindow client) { 2755648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn long origId = Binder.clearCallingIdentity(); 2756648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn 2757648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn try { 2758648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn synchronized(mWindowMap) { 2759648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn WindowState win = windowForClientLocked(session, client, false); 2760648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn if (win == null) { 2761648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn return false; 2762648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn } 2763648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn return reclaimSomeSurfaceMemoryLocked(win, "from-client", false); 2764648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn } 2765648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn } finally { 2766648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn Binder.restoreCallingIdentity(origId); 2767648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn } 2768648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn } 2769648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn 27709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void finishDrawingWindow(Session session, IWindow client) { 27719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 27729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 2773e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn WindowState win = windowForClientLocked(session, client, false); 27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win != null && win.finishDrawingLocked()) { 2775759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn if ((win.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0) { 2776759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn adjustWallpaperWindowsLocked(); 2777759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } 27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27857961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov public float getWindowCompatibilityScale(IBinder windowToken) { 27867961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov synchronized (mWindowMap) { 27877961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov WindowState windowState = mWindowMap.get(windowToken); 27887961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov return (windowState != null) ? windowState.mGlobalScale : 1.0f; 27897961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov } 27907961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov } 27917961be75f4161769f620e44dec3f5911e50ebe03Svetoslav Ganov 27929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private AttributeCache.Entry getCachedAnimations(WindowManager.LayoutParams lp) { 279308121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: layout params pkg=" 27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (lp != null ? lp.packageName : null) 27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " resId=0x" + (lp != null ? Integer.toHexString(lp.windowAnimations) : null)); 27969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lp != null && lp.windowAnimations != 0) { 27979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this is a system resource, don't try to load it from the 27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // application resources. It is nice to avoid loading application 27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // resources if we can. 28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String packageName = lp.packageName != null ? lp.packageName : "android"; 28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int resId = lp.windowAnimations; 28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((resId&0xFF000000) == 0x01000000) { 28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project packageName = "android"; 28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28058a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: picked package=" 28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + packageName); 28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AttributeCache.instance().get(packageName, resId, 28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.WindowAnimation); 28099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 281206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 28133b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn private AttributeCache.Entry getCachedAnimations(String packageName, int resId) { 281408121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: package=" 28153b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn + packageName + " resId=0x" + Integer.toHexString(resId)); 28163b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (packageName != null) { 28173b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if ((resId&0xFF000000) == 0x01000000) { 28183b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn packageName = "android"; 28193b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 28208a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: picked package=" 28213b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn + packageName); 28223b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn return AttributeCache.instance().get(packageName, resId, 28233b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn com.android.internal.R.styleable.WindowAnimation); 28243b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 28253b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn return null; 28263b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 28273b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn 28286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn void applyEnterAnimationLocked(WindowState win) { 28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int transit = WindowManagerPolicy.TRANSIT_SHOW; 28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mEnterAnimationPending) { 28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mEnterAnimationPending = false; 28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project transit = WindowManagerPolicy.TRANSIT_ENTER; 28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applyAnimationLocked(win, transit, true); 28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean applyAnimationLocked(WindowState win, 28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int transit, boolean isEntrance) { 28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mLocalAnimating && win.mAnimationIsEntrance == isEntrance) { 28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are trying to apply an animation, but already running 28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // an animation of the same type, then just leave that one alone. 28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 284506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Only apply an animation if the display isn't frozen. If it is 28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // frozen, there is no reason to animate and it can cause strange 28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // artifacts when we unfreeze the display if some different animation 28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // is running. 2850de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn if (!mDisplayFrozen && mPolicy.isScreenOn()) { 28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int anim = mPolicy.selectAnimationLw(win, transit); 28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int attr = -1; 28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Animation a = null; 28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (anim != 0) { 28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a = AnimationUtils.loadAnimation(mContext, anim); 28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (transit) { 28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WindowManagerPolicy.TRANSIT_ENTER: 28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr = com.android.internal.R.styleable.WindowAnimation_windowEnterAnimation; 28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WindowManagerPolicy.TRANSIT_EXIT: 28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr = com.android.internal.R.styleable.WindowAnimation_windowExitAnimation; 28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WindowManagerPolicy.TRANSIT_SHOW: 28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr = com.android.internal.R.styleable.WindowAnimation_windowShowAnimation; 28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WindowManagerPolicy.TRANSIT_HIDE: 28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attr = com.android.internal.R.styleable.WindowAnimation_windowHideAnimation; 28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 28709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attr >= 0) { 28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a = loadAnimation(win.mAttrs, attr); 28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ANIM) Slog.v(TAG, "applyAnimation: win=" + win 28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " anim=" + anim + " attr=0x" + Integer.toHexString(attr) 28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAnimation=" + win.mAnimation 28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " isEntrance=" + isEntrance); 28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a != null) { 28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_ANIM) { 2881b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn RuntimeException e = null; 2882b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (!HIDE_STACK_CRAWLS) { 2883b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e = new RuntimeException(); 2884b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e.fillInStackTrace(); 2885b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 28868a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Loaded animation " + a + " for " + win, e); 28879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.setAnimation(a); 28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mAnimationIsEntrance = isEntrance; 28909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 28929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.clearAnimation(); 28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return win.mAnimation != null; 28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Animation loadAnimation(WindowManager.LayoutParams lp, int animAttr) { 28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int anim = 0; 29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context context = mContext; 29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (animAttr >= 0) { 29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeCache.Entry ent = getCachedAnimations(lp); 29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ent != null) { 29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project context = ent.context; 29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project anim = ent.array.getResourceId(animAttr, 0); 29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (anim != 0) { 29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AnimationUtils.loadAnimation(context, anim); 29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 291306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 29143b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn private Animation loadAnimation(String packageName, int resId) { 29153b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn int anim = 0; 29163b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn Context context = mContext; 29173b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (resId >= 0) { 29183b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn AttributeCache.Entry ent = getCachedAnimations(packageName, resId); 29193b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (ent != null) { 29203b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn context = ent.context; 29213b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn anim = resId; 29223b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 29233b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 29243b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (anim != 0) { 29253b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn return AnimationUtils.loadAnimation(context, anim); 29263b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 29273b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn return null; 29283b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 29293b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn 29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean applyAnimationLocked(AppWindowToken wtoken, 2931ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn WindowManager.LayoutParams lp, int transit, boolean enter) { 29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Only apply an animation if the display isn't frozen. If it is 29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // frozen, there is no reason to animate and it can cause strange 29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // artifacts when we unfreeze the display if some different animation 29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // is running. 2936de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn if (!mDisplayFrozen && mPolicy.isScreenOn()) { 29370a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima Animation a; 2938ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn if (mNextAppTransitionPackage != null) { 29393b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn a = loadAnimation(mNextAppTransitionPackage, enter ? 29403b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn mNextAppTransitionEnter : mNextAppTransitionExit); 29410a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima } else { 29420a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima int animAttr = 0; 29430a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima switch (transit) { 29440a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN: 29450a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima animAttr = enter 29460a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima ? com.android.internal.R.styleable.WindowAnimation_activityOpenEnterAnimation 29470a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima : com.android.internal.R.styleable.WindowAnimation_activityOpenExitAnimation; 29480a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima break; 29490a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima case WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE: 29500a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima animAttr = enter 29510a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima ? com.android.internal.R.styleable.WindowAnimation_activityCloseEnterAnimation 29520a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima : com.android.internal.R.styleable.WindowAnimation_activityCloseExitAnimation; 29530a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima break; 29540a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima case WindowManagerPolicy.TRANSIT_TASK_OPEN: 29550a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima animAttr = enter 29560a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima ? com.android.internal.R.styleable.WindowAnimation_taskOpenEnterAnimation 29570a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima : com.android.internal.R.styleable.WindowAnimation_taskOpenExitAnimation; 29580a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima break; 29590a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima case WindowManagerPolicy.TRANSIT_TASK_CLOSE: 29600a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima animAttr = enter 29610a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima ? com.android.internal.R.styleable.WindowAnimation_taskCloseEnterAnimation 29620a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima : com.android.internal.R.styleable.WindowAnimation_taskCloseExitAnimation; 29630a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima break; 29640a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima case WindowManagerPolicy.TRANSIT_TASK_TO_FRONT: 29650a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima animAttr = enter 29660a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima ? com.android.internal.R.styleable.WindowAnimation_taskToFrontEnterAnimation 29670a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima : com.android.internal.R.styleable.WindowAnimation_taskToFrontExitAnimation; 29680a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima break; 29690a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima case WindowManagerPolicy.TRANSIT_TASK_TO_BACK: 29700a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima animAttr = enter 29715a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima ? com.android.internal.R.styleable.WindowAnimation_taskToBackEnterAnimation 29720a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima : com.android.internal.R.styleable.WindowAnimation_taskToBackExitAnimation; 29730a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima break; 297425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_WALLPAPER_OPEN: 297525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn animAttr = enter 297625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn ? com.android.internal.R.styleable.WindowAnimation_wallpaperOpenEnterAnimation 297725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn : com.android.internal.R.styleable.WindowAnimation_wallpaperOpenExitAnimation; 297825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn break; 297925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_WALLPAPER_CLOSE: 298025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn animAttr = enter 298125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn ? com.android.internal.R.styleable.WindowAnimation_wallpaperCloseEnterAnimation 298225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn : com.android.internal.R.styleable.WindowAnimation_wallpaperCloseExitAnimation; 298325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn break; 298425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_OPEN: 2985f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn animAttr = enter 298625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenEnterAnimation 298725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenExitAnimation; 2988f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn break; 298925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_CLOSE: 2990f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn animAttr = enter 299125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn ? com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseEnterAnimation 299225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn : com.android.internal.R.styleable.WindowAnimation_wallpaperIntraCloseExitAnimation; 2993f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn break; 29940a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima } 2995bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn a = animAttr != 0 ? loadAnimation(lp, animAttr) : null; 29968a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ANIM) Slog.v(TAG, "applyAnimation: wtoken=" + wtoken 29970a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima + " anim=" + a 29980a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima + " animAttr=0x" + Integer.toHexString(animAttr) 29990a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima + " transit=" + transit); 30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a != null) { 30029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_ANIM) { 3003b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn RuntimeException e = null; 3004b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (!HIDE_STACK_CRAWLS) { 3005b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e = new RuntimeException(); 3006b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e.fillInStackTrace(); 3007b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 30088a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Loaded animation " + a + " for " + wtoken, e); 30099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.setAnimation(a); 30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.clearAnimation(); 30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return wtoken.animation != null; 30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Application Window Tokens 30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void validateAppTokens(List tokens) { 30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int v = tokens.size()-1; 30259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int m = mAppTokens.size()-1; 30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (v >= 0 && m >= 0) { 30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = mAppTokens.get(m); 30289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.removed) { 30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m--; 30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 30319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tokens.get(v) != wtoken.token) { 30338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Tokens out of sync: external is " + tokens.get(v) 30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " @ " + v + ", internal is " + wtoken.token + " @ " + m); 30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v--; 30379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m--; 30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (v >= 0) { 30408a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "External token not found: " + tokens.get(v) + " @ " + v); 30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v--; 30429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (m >= 0) { 30449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = mAppTokens.get(m); 30459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!wtoken.removed) { 30468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Invalid internal token: " + wtoken.token + " @ " + m); 30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m--; 30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean checkCallingPermission(String permission, String func) { 30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Quick check: if the calling permission is me, it's all okay. 30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Binder.getCallingPid() == Process.myPid()) { 30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 305706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mContext.checkCallingPermission(permission) 30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project == PackageManager.PERMISSION_GRANTED) { 30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String msg = "Permission Denial: " + func + " from pid=" 30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Binder.getCallingPid() 30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", uid=" + Binder.getCallingUid() 30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " requires " + permission; 30668a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, msg); 30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 306906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken findAppWindowToken(IBinder token) { 30719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken wtoken = mTokenMap.get(token); 30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null) { 30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return wtoken.appWindowToken; 30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 307706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 30789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addWindowToken(IBinder token, int type) { 30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 30809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "addWindowToken()")) { 3081cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 30829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 308306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 30859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken wtoken = mTokenMap.get(token); 30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken != null) { 30878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add existing input method token: " + token); 30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn wtoken = new WindowToken(this, token, type, true); 30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTokenMap.put(token, wtoken); 30924c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (type == TYPE_WALLPAPER) { 30934c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mWallpaperTokens.add(wtoken); 30944c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 309706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeWindowToken(IBinder token) { 30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "removeWindowToken()")) { 3101cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken wtoken = mTokenMap.remove(token); 31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken != null) { 31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean delayed = false; 31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!wtoken.hidden) { 31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.hidden = true; 311106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = wtoken.windows.size(); 31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed = false; 311406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = wtoken.windows.get(i); 31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.isAnimating()) { 31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delayed = true; 31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 312106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.isVisibleNow()) { 31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applyAnimationLocked(win, 31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManagerPolicy.TRANSIT_EXIT, false); 31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = true; 31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (changed) { 31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 31323a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, 31333a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/); 31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 313506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delayed) { 31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExitingTokens.add(wtoken); 31384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } else if (wtoken.windowType == TYPE_WALLPAPER) { 31394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mWallpaperTokens.remove(wtoken); 31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 314206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 31432e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(true /*force*/); 31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 31458a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to remove non-existing token: " + token); 31469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 31499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addAppToken(int addPos, IApplicationToken token, 31529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int groupId, int requestedOrientation, boolean fullscreen) { 31539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 31549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "addAppToken()")) { 3155cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3157349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 3158349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // Get the dispatching timeout here while we are not holding any locks so that it 3159349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // can be cached by the AppWindowToken. The timeout value is used later by the 3160349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // input dispatcher in code that does hold locks. If we did not cache the value 3161349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // here we would run the chance of introducing a deadlock between the window manager 3162349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // (which holds locks while updating the input dispatcher state) and the activity manager 3163349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // (which holds locks while querying the application token). 3164349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown long inputDispatchingTimeoutNanos; 3165349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown try { 3166349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown inputDispatchingTimeoutNanos = token.getKeyDispatchingTimeout() * 1000000L; 3167349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown } catch (RemoteException ex) { 3168349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown Slog.w(TAG, "Could not get dispatching timeout.", ex); 3169349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown inputDispatchingTimeoutNanos = DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS; 3170349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown } 317106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = findAppWindowToken(token.asBinder()); 31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken != null) { 31758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to add existing app token: " + token); 31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn wtoken = new AppWindowToken(this, token); 3179349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown wtoken.inputDispatchingTimeoutNanos = inputDispatchingTimeoutNanos; 31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.groupId = groupId; 31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.appFullscreen = fullscreen; 31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.requestedOrientation = requestedOrientation; 3183f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_TOKEN_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG, "addAppToken: " + wtoken); 31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTokens.add(addPos, wtoken); 31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTokenMap.put(token.asBinder(), wtoken); 318606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Application tokens start out hidden. 31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.hidden = true; 31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.hiddenRequested = true; 319006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //dump(); 31929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 319406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAppGroupId(IBinder token, int groupId) { 31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAppStartingIcon()")) { 3198cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = findAppWindowToken(token); 32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null) { 32048a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to set group id of non-existing app token: " + token); 32059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 32069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.groupId = groupId; 32089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 321006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 32119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getOrientationFromWindowsLocked() { 3212bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn if (mDisplayFrozen || mOpeningApps.size() > 0 || mClosingApps.size() > 0) { 3213bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn // If the display is frozen, some activities may be in the middle 3214bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn // of restarting, and thus have removed their old window. If the 3215bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn // window has the flag to hide the lock screen, then the lock screen 3216bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn // can re-appear and inflict its own orientation on us. Keep the 3217bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn // orientation stable until this all settles down. 3218bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn return mLastWindowForcedOrientation; 3219bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn } 3220bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn 32219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = mWindows.size() - 1; 32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (pos >= 0) { 3223e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState wtoken = mWindows.get(pos); 32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos--; 32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.mAppToken != null) { 32269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We hit an application window. so the orientation will be determined by the 32279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // app window. No point in continuing further. 3228bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn return (mLastWindowForcedOrientation=ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3230b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate if (!wtoken.isVisibleLw() || !wtoken.mPolicyVisibilityAfterAnim) { 32319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int req = wtoken.mAttrs.screenOrientation; 32349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if((req == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) || 32359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (req == ActivityInfo.SCREEN_ORIENTATION_BEHIND)){ 32369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3238bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn return (mLastWindowForcedOrientation=req); 32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3241bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn return (mLastWindowForcedOrientation=ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 32429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 324306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 32449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getOrientationFromAppTokensLocked() { 3245e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn int pos = mAppTokens.size() - 1; 3246e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn int curGroup = 0; 3247e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn int lastOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 3248e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean findingBehind = false; 3249e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean haveGroup = false; 3250e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean lastFullscreen = false; 3251e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn while (pos >= 0) { 3252e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn AppWindowToken wtoken = mAppTokens.get(pos); 3253e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn pos--; 3254bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn 3255bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn if (DEBUG_APP_ORIENTATION) Slog.v(TAG, "Checking app orientation: " + wtoken); 3256bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn 3257e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // if we're about to tear down this window and not seek for 3258e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // the behind activity, don't use it for orientation 3259e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (!findingBehind 3260e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn && (!wtoken.hidden && wtoken.hiddenRequested)) { 3261bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn if (DEBUG_ORIENTATION) Slog.v(TAG, "Skipping " + wtoken 3262bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn + " -- going to hide"); 3263e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn continue; 3264e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3265e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 3266e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (!haveGroup) { 3267e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // We ignore any hidden applications on the top. 3268e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (wtoken.hiddenRequested || wtoken.willBeHidden) { 3269bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn if (DEBUG_ORIENTATION) Slog.v(TAG, "Skipping " + wtoken 3270bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn + " -- hidden on top"); 3271105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project continue; 3272105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 3273e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn haveGroup = true; 3274e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn curGroup = wtoken.groupId; 3275e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn lastOrientation = wtoken.requestedOrientation; 3276e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } else if (curGroup != wtoken.groupId) { 3277e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // If we have hit a new application group, and the bottom 3278e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // of the previous group didn't explicitly say to use 3279e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // the orientation behind it, and the last app was 3280e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // full screen, then we'll stick with the 3281e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // user's orientation. 3282e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (lastOrientation != ActivityInfo.SCREEN_ORIENTATION_BEHIND 3283e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn && lastFullscreen) { 3284bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn if (DEBUG_ORIENTATION) Slog.v(TAG, "Done at " + wtoken 3285bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn + " -- end of group, return " + lastOrientation); 3286e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return lastOrientation; 3287e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3288e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3289e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn int or = wtoken.requestedOrientation; 3290e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // If this application is fullscreen, and didn't explicitly say 3291e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // to use the orientation behind it, then just take whatever 3292e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // orientation it has and ignores whatever is under it. 3293e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn lastFullscreen = wtoken.appFullscreen; 3294e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (lastFullscreen 3295e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn && or != ActivityInfo.SCREEN_ORIENTATION_BEHIND) { 3296bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn if (DEBUG_ORIENTATION) Slog.v(TAG, "Done at " + wtoken 3297bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn + " -- full screen, return " + or); 3298e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return or; 3299e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3300e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // If this application has requested an explicit orientation, 3301e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // then use it. 3302e5439f228f603f60febe058f633d91d5af2fff76Dianne Hackborn if (or != ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED 3303e5439f228f603f60febe058f633d91d5af2fff76Dianne Hackborn && or != ActivityInfo.SCREEN_ORIENTATION_BEHIND) { 3304bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn if (DEBUG_ORIENTATION) Slog.v(TAG, "Done at " + wtoken 3305bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn + " -- explicitly set, return " + or); 3306e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return or; 3307e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3308e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn findingBehind |= (or == ActivityInfo.SCREEN_ORIENTATION_BEHIND); 3309e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3310bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn if (DEBUG_ORIENTATION) Slog.v(TAG, "No app is requesting an orientation"); 3311e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 33129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 331306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 33149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Configuration updateOrientationFromAppTokens( 3315105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project Configuration currentConfig, IBinder freezeThisOneIfNeeded) { 3316cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 3317cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn "updateOrientationFromAppTokens()")) { 3318cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 3319cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn } 3320ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 3321e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn Configuration config = null; 33229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long ident = Binder.clearCallingIdentity(); 3323e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 33249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 33257916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn config = updateOrientationFromAppTokensLocked(currentConfig, 33267916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn freezeThisOneIfNeeded); 33277916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 33287916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 33297916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn Binder.restoreCallingIdentity(ident); 33307916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn return config; 33317916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 33327916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 33337916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn private Configuration updateOrientationFromAppTokensLocked( 33347916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn Configuration currentConfig, IBinder freezeThisOneIfNeeded) { 33357916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn Configuration config = null; 33367916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 33377916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (updateOrientationFromAppTokensLocked(false)) { 33387916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (freezeThisOneIfNeeded != null) { 33397916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn AppWindowToken wtoken = findAppWindowToken( 33407916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn freezeThisOneIfNeeded); 33417916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (wtoken != null) { 33427916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn startAppFreezingScreenLocked(wtoken, 33437916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn ActivityInfo.CONFIG_ORIENTATION); 33447916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 33457916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 33467916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn config = computeNewConfigurationLocked(); 33477916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 33487916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } else if (currentConfig != null) { 33497916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn // No obvious action we need to take, but if our current 33507916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn // state mismatches the activity manager's, update it, 33517916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn // disregarding font scale, which should remain set to 33527916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn // the value of the previous configuration. 33537916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mTempConfiguration.setToDefaults(); 33547916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mTempConfiguration.fontScale = currentConfig.fontScale; 33557916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (computeNewConfigurationLocked(mTempConfiguration)) { 33567916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (currentConfig.diff(mTempConfiguration) != 0) { 33577916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mWaitingForConfig = true; 33587916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mLayoutNeeded = true; 33597916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn startFreezingDisplayLocked(false); 33607916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn config = new Configuration(mTempConfiguration); 3361e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3362bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn } 33639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3364e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 33659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return config; 33669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 336706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 33689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 3369e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * Determine the new desired orientation of the display, returning 3370e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * a non-null new Configuration if it has changed from the current 3371e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * orientation. IF TRUE IS RETURNED SOMEONE MUST CALL 3372e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * setNewConfiguration() TO TELL THE WINDOW MANAGER IT CAN UNFREEZE THE 3373e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * SCREEN. This will typically be done for you if you call 3374e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * sendNewConfiguration(). 3375e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * 33769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The orientation is computed from non-application windows first. If none of 33779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the non-application windows specify orientation, the orientation is computed from 337806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * application tokens. 33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.view.IWindowManager#updateOrientationFromAppTokens( 33809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android.os.IBinder) 33819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 338294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn boolean updateOrientationFromAppTokensLocked(boolean inTransaction) { 33839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed = false; 33849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long ident = Binder.clearCallingIdentity(); 33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3386c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project int req = computeForcedAppOrientationLocked(); 338706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 33889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (req != mForcedAppOrientation) { 33899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForcedAppOrientation = req; 33909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //send a message to Policy indicating orientation change to take 33919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //action like disabling/enabling sensors etc., 3392c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project mPolicy.setCurrentOrientationLw(req); 3393e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (setRotationUncheckedLocked(WindowManagerPolicy.USE_LAST_ROTATION, 339494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn mLastRotationFlags | Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE, 339594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn inTransaction)) { 3396e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn changed = true; 33979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3399105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 3400e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return changed; 34019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 34029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(ident); 34039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 340506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 3406c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project int computeForcedAppOrientationLocked() { 3407c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project int req = getOrientationFromWindowsLocked(); 3408c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project if (req == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) { 3409c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project req = getOrientationFromAppTokensLocked(); 3410c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 3411c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project return req; 3412c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 341306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 3414e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn public void setNewConfiguration(Configuration config) { 3415e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 3416e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn "setNewConfiguration()")) { 3417e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 3418e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3419e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 3420e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn synchronized(mWindowMap) { 3421e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn mCurConfiguration = new Configuration(config); 3422e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn mWaitingForConfig = false; 3423e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn performLayoutAndPlaceSurfacesLocked(); 3424e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3425e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 3426e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 34279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAppOrientation(IApplicationToken token, int requestedOrientation) { 34289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 34299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAppOrientation()")) { 3430cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 34319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 343206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 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) { 34368a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to set orientation of non-existing app token: " + token); 34379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 34389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 343906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 34409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.requestedOrientation = requestedOrientation; 34419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 344306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 34449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getAppOrientation(IApplicationToken token) { 34459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 34469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = findAppWindowToken(token.asBinder()); 34479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null) { 34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 34499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 345006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return wtoken.requestedOrientation; 34529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 345406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFocusedApp(IBinder token, boolean moveFocusNow) { 34569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 34579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setFocusedApp()")) { 3458cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 34599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 34629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed = false; 34639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token == null) { 34648a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_FOCUS) Slog.v(TAG, "Clearing focused app, was " + mFocusedApp); 34659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = mFocusedApp != null; 34669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFocusedApp = null; 346700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown if (changed) { 346800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputMonitor.setFocusedAppLw(null); 3469349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown } 34709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 34719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken newFocus = findAppWindowToken(token); 34729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newFocus == null) { 34738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to set focus to non-existing app token: " + token); 34749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 34759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = mFocusedApp != newFocus; 34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFocusedApp = newFocus; 34788a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_FOCUS) Slog.v(TAG, "Set focused app to: " + mFocusedApp); 347900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown if (changed) { 348000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputMonitor.setFocusedAppLw(newFocus); 3481349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown } 34829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (moveFocusNow && changed) { 34859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 34863a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/); 34879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34927da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn public void prepareAppTransition(int transit, boolean alwaysKeepCurrent) { 34939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 34949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "prepareAppTransition()")) { 3495cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 34969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 349706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 34989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 34998a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v( 35009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Prepare app transition: transit=" + transit 35019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mNextAppTransition=" + mNextAppTransition); 3502b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn if (!mDisplayFrozen && mPolicy.isScreenOn()) { 3503bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET 3504bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn || mNextAppTransition == WindowManagerPolicy.TRANSIT_NONE) { 35059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNextAppTransition = transit; 35067da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn } else if (!alwaysKeepCurrent) { 35077da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn if (transit == WindowManagerPolicy.TRANSIT_TASK_OPEN 35087da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn && mNextAppTransition == WindowManagerPolicy.TRANSIT_TASK_CLOSE) { 35097da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn // Opening a new task always supersedes a close for the anim. 35107da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mNextAppTransition = transit; 35117da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn } else if (transit == WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN 35127da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn && mNextAppTransition == WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE) { 35137da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn // Opening a new activity always supersedes a close for the anim. 35147da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn mNextAppTransition = transit; 35157da6ac33a9de82be52e22846d5f22d502452854cDianne Hackborn } 35169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTransitionReady = false; 35189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTransitionTimeout = false; 35199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartingIconInTransition = false; 35209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSkipAppTransitionAnimation = false; 35219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.removeMessages(H.APP_TRANSITION_TIMEOUT); 35229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessageDelayed(mH.obtainMessage(H.APP_TRANSITION_TIMEOUT), 35239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5000); 35249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getPendingAppTransition() { 35299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNextAppTransition; 35309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 353106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 35323b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn public void overridePendingAppTransition(String packageName, 35333b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn int enterAnim, int exitAnim) { 35348b571a817cc953ce96750f440645f104c7f55157Dianne Hackborn if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 35353b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn mNextAppTransitionPackage = packageName; 35363b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn mNextAppTransitionEnter = enterAnim; 35373b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn mNextAppTransitionExit = exitAnim; 35383b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 35393b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 3540ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 35419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void executeAppTransition() { 35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "executeAppTransition()")) { 3544cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 354606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 35483b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (DEBUG_APP_TRANSITIONS) { 35493b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn RuntimeException e = new RuntimeException("here"); 35503b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn e.fillInStackTrace(); 35518a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Execute app transition: mNextAppTransition=" 35523b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn + mNextAppTransition, e); 35533b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 3554bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 35559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTransitionReady = true; 35569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 35579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 35599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAppStartingWindow(IBinder token, String pkg, 35642f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn int theme, CompatibilityInfo compatInfo, 35652f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn CharSequence nonLocalizedLabel, int labelRes, int icon, 35667eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn int windowFlags, IBinder transferFrom, boolean createIfNeeded) { 35679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 35689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAppStartingIcon()")) { 3569cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 35709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 35738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW) Slog.v( 35749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "setAppStartingIcon: token=" + token + " pkg=" + pkg 35759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " transferFrom=" + transferFrom); 357606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 35779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = findAppWindowToken(token); 35789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null) { 35798a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to set icon of non-existing app token: " + token); 35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 35819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the display is frozen, we won't do anything until the 35849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // actual window is displayed so there is no reason to put in 35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the starting window. 3586de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn if (mDisplayFrozen || !mPolicy.isScreenOn()) { 35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 35889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 358906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 35909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.startingData != null) { 35919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 35929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 359306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 35949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (transferFrom != null) { 35959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken ttoken = findAppWindowToken(transferFrom); 35969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ttoken != null) { 35979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState startingWindow = ttoken.startingWindow; 35989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (startingWindow != null) { 35999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mStartingIconInTransition) { 36009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In this case, the starting icon has already 36019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // been displayed, so start letting windows get 36029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // shown immediately without any more transitions. 36039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSkipAppTransitionAnimation = true; 36049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36058a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW) Slog.v(TAG, 36069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Moving existing starting from " + ttoken 36079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " to " + wtoken); 36089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 360906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 36109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Transfer the starting window over to the new 36119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // token. 36129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingData = ttoken.startingData; 36139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingView = ttoken.startingView; 36149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingWindow = startingWindow; 36159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.startingData = null; 36169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.startingView = null; 36179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.startingWindow = null; 36189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.startingMoved = true; 36199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startingWindow.mToken = wtoken; 3620ef49c57bdcdb6c808870570c205434b002431c37Dianne Hackborn startingWindow.mRootToken = wtoken; 36219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startingWindow.mAppToken = wtoken; 3622f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG, 36239bfb707597898f54722460b48588007b682f3e2aDianne Hackborn "Removing starting window: " + startingWindow); 36249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.remove(startingWindow); 3625dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 3626f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE) Slog.v(TAG, "Removing starting " + startingWindow 3627f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn + " from " + ttoken); 36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.windows.remove(startingWindow); 36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.allAppWindows.remove(startingWindow); 36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addWindowToListInOrderLocked(startingWindow, true); 363106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 36329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Propagate other interesting state between the 36339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // tokens. If the old token is displayed, we should 36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // immediately force the new one to be displayed. If 36359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it is animating, we need to move that animation to 36369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the new one. 36379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ttoken.allDrawn) { 36389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.allDrawn = true; 36399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ttoken.firstWindowDrawn) { 36419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.firstWindowDrawn = true; 36429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!ttoken.hidden) { 36449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.hidden = false; 36459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.hiddenRequested = false; 36469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.willBeHidden = false; 36479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.clientHidden != ttoken.clientHidden) { 36499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.clientHidden = ttoken.clientHidden; 36509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.sendAppVisibilityToClients(); 36519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ttoken.animation != null) { 36539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.animation = ttoken.animation; 36549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.animating = ttoken.animating; 36559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.animLayerAdjustment = ttoken.animLayerAdjustment; 36569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.animation = null; 36579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.animLayerAdjustment = 0; 36589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.updateLayers(); 36599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.updateLayers(); 36609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 366106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 36623a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, 36633a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown true /*updateInputWindows*/); 36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 36669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 36679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 36689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (ttoken.startingData != null) { 36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The previous app was getting ready to show a 36709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // starting window, but hasn't yet done so. Steal it! 36718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW) Slog.v(TAG, 36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Moving pending starting from " + ttoken 36739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " to " + wtoken); 36749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingData = ttoken.startingData; 36759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.startingData = null; 36769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ttoken.startingMoved = true; 36779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = mH.obtainMessage(H.ADD_STARTING, wtoken); 36789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Note: we really want to do sendMessageAtFrontOfQueue() because we 36799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // want to process the message ASAP, before any other queued 36809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // messages. 36819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessageAtFrontOfQueue(m); 36829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 36839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // There is no existing starting window, and the caller doesn't 36889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // want us to create one, so that's it! 36899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!createIfNeeded) { 36909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 36919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 369206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 3693284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn // If this is a translucent or wallpaper window, then don't 3694284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn // show a starting window -- the current effect (a full-screen 3695284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn // opaque starting window that fades away to the real contents 3696284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn // when it is ready) does not work for this. 3697284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (theme != 0) { 3698284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn AttributeCache.Entry ent = AttributeCache.instance().get(pkg, theme, 3699284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn com.android.internal.R.styleable.Window); 3700284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (ent.array.getBoolean( 3701284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn com.android.internal.R.styleable.Window_windowIsTranslucent, false)) { 3702284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn return; 3703284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 3704284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (ent.array.getBoolean( 37056136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn com.android.internal.R.styleable.Window_windowIsFloating, false)) { 37066136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn return; 37076136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn } 37086136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn if (ent.array.getBoolean( 3709284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn com.android.internal.R.styleable.Window_windowShowWallpaper, false)) { 3710284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn return; 3711284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 3712284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 3713ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 37149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartingIconInTransition = true; 37152f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn wtoken.startingData = new StartingData(pkg, theme, compatInfo, nonLocalizedLabel, 37167eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn labelRes, icon, windowFlags); 37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = mH.obtainMessage(H.ADD_STARTING, wtoken); 37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Note: we really want to do sendMessageAtFrontOfQueue() because we 37199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // want to process the message ASAP, before any other queued 37209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // messages. 37219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessageAtFrontOfQueue(m); 37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAppWillBeHidden(IBinder token) { 37269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 37279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAppWillBeHidden()")) { 3728cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 37299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken; 37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 37349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken = findAppWindowToken(token); 37359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null) { 37368a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to set will be hidden of non-existing app token: " + token); 37379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 37389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.willBeHidden = true; 37409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 374206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 37439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean setTokenVisibilityLocked(AppWindowToken wtoken, WindowManager.LayoutParams lp, 3744ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn boolean visible, int transit, boolean performLayout) { 37459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean delayed = false; 37469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.clientHidden == visible) { 37489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.clientHidden = !visible; 37499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.sendAppVisibilityToClients(); 37509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 375106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 37529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.willBeHidden = false; 37539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.hidden == visible) { 37549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = wtoken.allAppWindows.size(); 37559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed = false; 37568a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v( 37579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Changing app " + wtoken + " hidden=" + wtoken.hidden 37589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " performLayout=" + performLayout); 375906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 37609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean runningAppAnimation = false; 376106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 3762bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (transit != WindowManagerPolicy.TRANSIT_UNSET) { 37639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.animation == sDummyAnimation) { 37649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.animation = null; 37659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3766ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn applyAnimationLocked(wtoken, lp, transit, visible); 37679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = true; 37689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.animation != null) { 37699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delayed = runningAppAnimation = true; 37709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 377206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 37739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 37749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = wtoken.allAppWindows.get(i); 37759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win == wtoken.startingWindow) { 37769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 37779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.isAnimating()) { 37809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delayed = true; 37819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 378206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 37838a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Window " + win + ": vis=" + win.isVisible()); 37849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //win.dump(" "); 37859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (visible) { 37869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!win.isVisibleNow()) { 37879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!runningAppAnimation) { 37889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applyAnimationLocked(win, 37899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManagerPolicy.TRANSIT_ENTER, true); 37909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = true; 37929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (win.isVisibleNow()) { 37949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!runningAppAnimation) { 37959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applyAnimationLocked(win, 37969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManagerPolicy.TRANSIT_EXIT, false); 37979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = true; 37999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.hidden = wtoken.hiddenRequested = !visible; 38039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!visible) { 38049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsetAppFreezingScreenLocked(wtoken, true, true); 38059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 38069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are being set visible, and the starting window is 38079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // not yet displayed, then make sure it doesn't get displayed. 38089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState swin = wtoken.startingWindow; 38099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (swin != null && (swin.mDrawPending 38109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || swin.mCommitDrawPending)) { 38119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project swin.mPolicyVisibility = false; 38129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project swin.mPolicyVisibilityAfterAnim = false; 38139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 381506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 38168a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "setTokenVisibilityLocked: " + wtoken 38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": hidden=" + wtoken.hidden + " hiddenRequested=" 38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken.hiddenRequested); 381906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 38209b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn if (changed) { 38219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 38223a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown mInputMonitor.setUpdateInputWindowsNeededLw(); 38239b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn if (performLayout) { 38243a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, 38253a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/); 38269b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn performLayoutAndPlaceSurfacesLocked(); 38279b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn } 38282e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(false /*force*/); 38299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.animation != null) { 38339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delayed = true; 38349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 383506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 38369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return delayed; 38379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAppVisibility(IBinder token, boolean visible) { 38409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 38419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAppVisibility()")) { 3842cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 38439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken; 38469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 38489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken = findAppWindowToken(token); 38499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null) { 38508a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to set visibility of non-existing app token: " + token); 38519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 38529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_APP_TRANSITIONS || DEBUG_ORIENTATION) { 3855b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn RuntimeException e = null; 3856b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (!HIDE_STACK_CRAWLS) { 3857b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e = new RuntimeException(); 3858b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e.fillInStackTrace(); 3859b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 38608a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "setAppVisibility(" + token + ", " + visible 38619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "): mNextAppTransition=" + mNextAppTransition 38629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " hidden=" + wtoken.hidden 38639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " hiddenRequested=" + wtoken.hiddenRequested, e); 38649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 386506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 38669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are preparing an app transition, then delay changing 38679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the visibility of this token until we execute that transition. 3868b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn if (!mDisplayFrozen && mPolicy.isScreenOn() 3869b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn && mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 38709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Already in requested state, don't do anything more. 38719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.hiddenRequested != visible) { 38729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 38739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.hiddenRequested = !visible; 387506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 38768a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v( 38779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Setting dummy animation on: " + wtoken); 38789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.setDummyAnimation(); 38799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOpeningApps.remove(wtoken); 38809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClosingApps.remove(wtoken); 3881a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wtoken.waitingToShow = wtoken.waitingToHide = false; 38829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.inPendingTransaction = true; 38839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (visible) { 38849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOpeningApps.add(wtoken); 38859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingDisplayed = false; 38869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingMoved = false; 3887ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 3888195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // If the token is currently hidden (should be the 3889195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // common case), then we need to set up to wait for 3890195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // its windows to be ready. 3891195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn if (wtoken.hidden) { 3892195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn wtoken.allDrawn = false; 3893195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn wtoken.waitingToShow = true; 3894ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 3895195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn if (wtoken.clientHidden) { 3896195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // In the case where we are making an app visible 3897195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // but holding off for a transition, we still need 3898195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // to tell the client to make its windows visible so 3899195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // they get drawn. Otherwise, we will wait on 3900195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // performing the transition until all windows have 3901195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // been drawn, they never will be, and we are sad. 3902195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn wtoken.clientHidden = false; 3903195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn wtoken.sendAppVisibilityToClients(); 3904195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn } 39059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 39079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClosingApps.add(wtoken); 3908ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 3909195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // If the token is currently visible (should be the 3910195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn // common case), then set up to wait for it to be hidden. 3911195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn if (!wtoken.hidden) { 3912195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn wtoken.waitingToHide = true; 3913195f6a0ff33c140c922f1f27ee7a306d7eb8f0abDianne Hackborn } 39149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 39169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 391706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 39189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 3919e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn setTokenVisibilityLocked(wtoken, null, visible, WindowManagerPolicy.TRANSIT_UNSET, 3920ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn true); 39219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.updateReportedVisibilityLocked(); 39229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 39239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void unsetAppFreezingScreenLocked(AppWindowToken wtoken, 39279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean unfreezeSurfaceNow, boolean force) { 39289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.freezingScreen) { 39298a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, "Clear freezing of " + wtoken 39309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " force=" + force); 39319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = wtoken.allAppWindows.size(); 39329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean unfrozeWindows = false; 39339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 39349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState w = wtoken.allAppWindows.get(i); 39359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mAppFreezing) { 39369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mAppFreezing = false; 39379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mSurface != null && !w.mOrientationChanging) { 39389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mOrientationChanging = true; 39399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unfrozeWindows = true; 39419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (force || unfrozeWindows) { 39448a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, "No longer freezing: " + wtoken); 39459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.freezingScreen = false; 39469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppsFreezingScreen--; 39479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (unfreezeSurfaceNow) { 39499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (unfrozeWindows) { 39509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 39519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 39529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3953e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn stopFreezingDisplayLocked(); 39549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 395706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 39589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startAppFreezingScreenLocked(AppWindowToken wtoken, 39599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int configChanges) { 39609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_ORIENTATION) { 3961b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn RuntimeException e = null; 3962b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (!HIDE_STACK_CRAWLS) { 3963b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e = new RuntimeException(); 3964b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn e.fillInStackTrace(); 3965b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 39668a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, "Set freezing of " + wtoken.appToken 39679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": hidden=" + wtoken.hidden + " freezing=" 39689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken.freezingScreen, e); 39699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!wtoken.hiddenRequested) { 39719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!wtoken.freezingScreen) { 39729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.freezingScreen = true; 39739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppsFreezingScreen++; 39749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAppsFreezingScreen == 1) { 397594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn startFreezingDisplayLocked(false); 39769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.removeMessages(H.APP_FREEZE_TIMEOUT); 39779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessageDelayed(mH.obtainMessage(H.APP_FREEZE_TIMEOUT), 39789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5000); 39799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = wtoken.allAppWindows.size(); 39829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 39839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState w = wtoken.allAppWindows.get(i); 39849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mAppFreezing = true; 39859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 398806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 39899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startAppFreezingScreen(IBinder token, int configChanges) { 39909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 39919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAppFreezingScreen()")) { 3992cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 39939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 3996b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn if (configChanges == 0 && !mDisplayFrozen && mPolicy.isScreenOn()) { 39978a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, "Skipping set freeze of " + token); 39989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 39999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 400006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 40019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = findAppWindowToken(token); 40029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null || wtoken.appToken == null) { 40038a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to freeze screen with non-existing app token: " + wtoken); 40049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 40059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 40079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startAppFreezingScreenLocked(wtoken, configChanges); 40089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 40099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 401106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 40129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void stopAppFreezingScreen(IBinder token, boolean force) { 40139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 40149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAppFreezingScreen()")) { 4015cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 40169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 40199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = findAppWindowToken(token); 40209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null || wtoken.appToken == null) { 40219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 40229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 40248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, "Clear freezing of " + token 40259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": hidden=" + wtoken.hidden + " freezing=" + wtoken.freezingScreen); 40269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsetAppFreezingScreenLocked(wtoken, true, force); 40279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 40289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 403006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 40319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeAppToken(IBinder token) { 40329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 40339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "removeAppToken()")) { 4034cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 40359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = null; 40389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken startingToken = null; 40399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean delayed = false; 40409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 40429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 40439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken basewtoken = mTokenMap.remove(token); 40449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (basewtoken != null && (wtoken=basewtoken.appWindowToken) != null) { 40458a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Removing app token: " + wtoken); 4046e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn delayed = setTokenVisibilityLocked(wtoken, null, false, 4047ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn WindowManagerPolicy.TRANSIT_UNSET, true); 40489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.inPendingTransaction = false; 40499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOpeningApps.remove(wtoken); 4050a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wtoken.waitingToShow = false; 40519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mClosingApps.contains(wtoken)) { 40529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delayed = true; 4053bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn } else if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 40549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClosingApps.add(wtoken); 4055a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wtoken.waitingToHide = true; 40569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delayed = true; 40579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40588a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v( 40599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Removing app " + wtoken + " delayed=" + delayed 40609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " animation=" + wtoken.animation 40619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " animating=" + wtoken.animating); 40629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delayed) { 40639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // set the token aside because it has an active animation to be finished 4064f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, 4065f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn "removeAppToken make exiting: " + wtoken); 40669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExitingAppTokens.add(wtoken); 40679bfb707597898f54722460b48588007b682f3e2aDianne Hackborn } else { 40689bfb707597898f54722460b48588007b682f3e2aDianne Hackborn // Make sure there is no animation running on this token, 40699bfb707597898f54722460b48588007b682f3e2aDianne Hackborn // so any windows associated with it will be removed as 40709bfb707597898f54722460b48588007b682f3e2aDianne Hackborn // soon as their animations are complete 40719bfb707597898f54722460b48588007b682f3e2aDianne Hackborn wtoken.animation = null; 40729bfb707597898f54722460b48588007b682f3e2aDianne Hackborn wtoken.animating = false; 40739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4074f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, 4075f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn "removeAppToken: " + wtoken); 40769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTokens.remove(wtoken); 40779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.removed = true; 40789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.startingData != null) { 40799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startingToken = wtoken; 40809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsetAppFreezingScreenLocked(wtoken, true, true); 40829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFocusedApp == wtoken) { 40838a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_FOCUS) Slog.v(TAG, "Removing focused app token:" + wtoken); 40849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFocusedApp = null; 40853a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/); 408600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputMonitor.setFocusedAppLw(null); 40879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 40898a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempted to remove non-existing app token: " + token); 40909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 409106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 40929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!delayed && wtoken != null) { 40939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.updateReportedVisibilityLocked(); 40949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 40979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (startingToken != null) { 40998a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Schedule remove starting " 41009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + startingToken + ": app token removed"); 41019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = mH.obtainMessage(H.REMOVE_STARTING, startingToken); 41029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessage(m); 41039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean tmpRemoveAppWindowsLocked(WindowToken token) { 41079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NW = token.windows.size(); 41089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<NW; i++) { 41099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = token.windows.get(i); 41108a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Tmp removing app window " + win); 41119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.remove(win); 4112dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 41139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int j = win.mChildWindows.size(); 41149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (j > 0) { 41159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project j--; 4116e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState cwin = win.mChildWindows.get(j); 41178a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, 4118bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn "Tmp removing child window " + cwin); 4119bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn mWindows.remove(cwin); 41209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NW > 0; 41239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dumpAppTokensLocked() { 41269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=mAppTokens.size()-1; i>=0; i--) { 41278a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, " #" + i + ": " + mAppTokens.get(i).token); 41289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 413006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 41319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dumpWindowsLocked() { 41329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=mWindows.size()-1; i>=0; i--) { 41338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, " #" + i + ": " + mWindows.get(i)); 41349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 413606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 41379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int findWindowOffsetLocked(int tokenPos) { 41389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NW = mWindows.size(); 41399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tokenPos >= mAppTokens.size()) { 41419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = NW; 41429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i > 0) { 41439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 4144e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState win = mWindows.get(i); 41459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.getAppToken() != null) { 41469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return i+1; 41479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (tokenPos > 0) { 41529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Find the first app token below the new position that has 41539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // a window displayed. 41549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken wtoken = mAppTokens.get(tokenPos-1); 41558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, "Looking for lower windows @ " 41569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + tokenPos + " -- " + wtoken.token); 4157a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (wtoken.sendingToBottom) { 41588a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, 4159a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn "Skipping token -- currently sending to bottom"); 4160a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn tokenPos--; 4161a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn continue; 4162a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 41639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = wtoken.windows.size(); 41649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i > 0) { 41659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 41669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = wtoken.windows.get(i); 41679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int j = win.mChildWindows.size(); 41689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (j > 0) { 41699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project j--; 4170e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState cwin = win.mChildWindows.get(j); 4171a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (cwin.mSubLayer >= 0) { 41729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int pos=NW-1; pos>=0; pos--) { 41739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mWindows.get(pos) == cwin) { 41748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, 41759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Found child win @" + (pos+1)); 41769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pos+1; 41779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int pos=NW-1; pos>=0; pos--) { 41829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mWindows.get(pos) == win) { 41838a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, "Found win @" + (pos+1)); 41849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pos+1; 41859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tokenPos--; 41899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 41929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final int reAddWindowLocked(int index, WindowState win) { 41959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NCW = win.mChildWindows.size(); 41969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean added = false; 41979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j=0; j<NCW; j++) { 4198e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState cwin = win.mChildWindows.get(j); 41999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!added && cwin.mSubLayer >= 0) { 42008a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding child window at " 4201bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn + index + ": " + cwin); 4202f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn win.mRebuilding = false; 42039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.add(index, win); 42049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 42059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project added = true; 42069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42078a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding window at " 4208bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn + index + ": " + cwin); 4209f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn cwin.mRebuilding = false; 42109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.add(index, cwin); 42119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 42129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!added) { 42148a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding window at " 4215bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn + index + ": " + win); 4216f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn win.mRebuilding = false; 42179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindows.add(index, win); 42189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index++; 42199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4220dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 42219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return index; 42229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 422306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 42249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final int reAddAppWindowsLocked(int index, WindowToken token) { 42259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NW = token.windows.size(); 42269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<NW; i++) { 42279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = reAddWindowLocked(index, token.windows.get(i)); 42289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return index; 42309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void moveAppToken(int index, IBinder token) { 42339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 42349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "moveAppToken()")) { 4235cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 42369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 42398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, "Initial app tokens:"); 42409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_REORDER) dumpAppTokensLocked(); 42419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken wtoken = findAppWindowToken(token); 4242f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_TOKEN_MOVEMENT || DEBUG_REORDER) Slog.v(TAG, 4243f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn "Start moving token " + wtoken + " initially at " 4244f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn + mAppTokens.indexOf(wtoken)); 42459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken == null || !mAppTokens.remove(wtoken)) { 42468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempting to reorder token that doesn't exist: " 42479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + token + " (" + wtoken + ")"); 42489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 42499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTokens.add(index, wtoken); 42518a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, "Moved " + token + " to " + index + ":"); 4252f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn else if (DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, "Moved " + token + " to " + index); 42539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_REORDER) dumpAppTokensLocked(); 425406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 42559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 42568a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, "Removing windows in " + token + ":"); 42579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_REORDER) dumpWindowsLocked(); 42589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tmpRemoveAppWindowsLocked(wtoken)) { 42598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, "Adding windows back in:"); 42609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_REORDER) dumpWindowsLocked(); 42619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reAddAppWindowsLocked(findWindowOffsetLocked(index), wtoken); 42628a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_REORDER) Slog.v(TAG, "Final window list:"); 42639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_REORDER) dumpWindowsLocked(); 42643a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, 42653a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/); 42669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 42672e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.setUpdateInputWindowsNeededLw(); 42689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 42692e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(false /*force*/); 42709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 42729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void removeAppTokensLocked(List<IBinder> tokens) { 42769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XXX This should be done more efficiently! 42779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // (take advantage of the fact that both lists should be 42789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ordered in the same way.) 42799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = tokens.size(); 42809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 42819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder token = tokens.get(i); 42829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken wtoken = findAppWindowToken(token); 4283f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_REORDER || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, 4284f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn "Temporarily removing " + wtoken + " from " + mAppTokens.indexOf(wtoken)); 42859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mAppTokens.remove(wtoken)) { 42868a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Attempting to reorder token that doesn't exist: " 42879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + token + " (" + wtoken + ")"); 42889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 42899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 42909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4294a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn private void moveAppWindowsLocked(AppWindowToken wtoken, int tokenPos, 4295a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn boolean updateFocusAndLayout) { 4296a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // First remove all of the windows from the list. 4297a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn tmpRemoveAppWindowsLocked(wtoken); 4298a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn 4299a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // Where to start adding? 4300a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn int pos = findWindowOffsetLocked(tokenPos); 4301a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn 4302a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // And now add them back at the correct place. 4303a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn pos = reAddAppWindowsLocked(pos, wtoken); 4304a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn 4305a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (updateFocusAndLayout) { 43062e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.setUpdateInputWindowsNeededLw(); 43073a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, 43083a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/)) { 4309a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn assignLayersLocked(); 4310a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 4311a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mLayoutNeeded = true; 4312a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn performLayoutAndPlaceSurfacesLocked(); 43132e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(false /*force*/); 4314a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 4315a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 4316a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn 43179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void moveAppWindowsLocked(List<IBinder> tokens, int tokenPos) { 43189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // First remove all of the windows from the list. 43199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = tokens.size(); 43209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 43219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 43229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken token = mTokenMap.get(tokens.get(i)); 43239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token != null) { 43249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tmpRemoveAppWindowsLocked(token); 43259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Where to start adding? 43299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = findWindowOffsetLocked(tokenPos); 43309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // And now add them back at the correct place. 43329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 43339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken token = mTokenMap.get(tokens.get(i)); 43349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token != null) { 43359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = reAddAppWindowsLocked(pos, token); 43369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43392e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.setUpdateInputWindowsNeededLw(); 43403a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, 43413a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/)) { 4342a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn assignLayersLocked(); 4343a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 43449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 43459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 43462e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(false /*force*/); 43479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //dump(); 43499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void moveAppTokensToTop(List<IBinder> tokens) { 43529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 43539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "moveAppTokensToTop()")) { 4354cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 43559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 43589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 43599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeAppTokensLocked(tokens); 43609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = tokens.size(); 43619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 43629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wt = findAppWindowToken(tokens.get(i)); 43639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wt != null) { 4364f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_TOKEN_MOVEMENT || DEBUG_REORDER) Slog.v(TAG, 4365f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn "Adding next to top: " + wt); 43669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTokens.add(wt); 4367bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 4368a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToTopApps.remove(wt); 4369a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToBottomApps.remove(wt); 4370a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToTopApps.add(wt); 4371a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wt.sendingToBottom = false; 4372a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wt.sendingToTop = true; 4373a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 43749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4376ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 4377bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET) { 4378a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn moveAppWindowsLocked(tokens, mAppTokens.size()); 4379a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 43809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 43829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void moveAppTokensToBottom(List<IBinder> tokens) { 43859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 43869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "moveAppTokensToBottom()")) { 4387cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 43889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long origId = Binder.clearCallingIdentity(); 43919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 43929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeAppTokensLocked(tokens); 43939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = tokens.size(); 43949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = 0; 43959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 43969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wt = findAppWindowToken(tokens.get(i)); 43979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wt != null) { 4398f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, 4399f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn "Adding next to bottom: " + wt + " at " + pos); 44009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTokens.add(pos, wt); 4401bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 4402a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToTopApps.remove(wt); 4403a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToBottomApps.remove(wt); 4404a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToBottomApps.add(i, wt); 4405a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wt.sendingToTop = false; 4406a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wt.sendingToBottom = true; 4407a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 44089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos++; 44099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4411ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 4412bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET) { 4413a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn moveAppWindowsLocked(tokens, 0); 4414a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 44159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 44179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 44209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Misc IWindowSession methods 44219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 442206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4423284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller private boolean shouldAllowDisableKeyguard() 4424d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller { 4425284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // We fail safe and prevent disabling keyguard in the unlikely event this gets 4426284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // called before DevicePolicyManagerService has started. 4427284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller if (mAllowDisableKeyguard == ALLOW_DISABLE_UNKNOWN) { 4428284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService( 4429284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller Context.DEVICE_POLICY_SERVICE); 4430284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller if (dpm != null) { 4431284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mAllowDisableKeyguard = dpm.getPasswordQuality(null) 4432284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED ? 4433284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller ALLOW_DISABLE_YES : ALLOW_DISABLE_NO; 4434284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller } 4435284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller } 4436284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller return mAllowDisableKeyguard == ALLOW_DISABLE_YES; 4437d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller } 4438d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller 44399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void disableKeyguard(IBinder token, String tag) { 4440733fdf34b6a8a8e3983ff7663828a928d3c19944Mike Lockwood if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD) 44419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project != PackageManager.PERMISSION_GRANTED) { 44429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException("Requires DISABLE_KEYGUARD permission"); 44439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4444d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller 4445284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller synchronized (mKeyguardTokenWatcher) { 4446284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mKeyguardTokenWatcher.acquire(token, tag); 4447dd8846886aa21980ecdca7ba42deac4f7ecd8ff0Mike Lockwood } 44489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void reenableKeyguard(IBinder token) { 4451733fdf34b6a8a8e3983ff7663828a928d3c19944Mike Lockwood if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD) 44529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project != PackageManager.PERMISSION_GRANTED) { 44539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException("Requires DISABLE_KEYGUARD permission"); 44549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4455d6b5705e188e55a3b9dbb07954b16564b1a31b9fJim Miller 4456284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller synchronized (mKeyguardTokenWatcher) { 4457284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mKeyguardTokenWatcher.release(token); 4458284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller 4459284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller if (!mKeyguardTokenWatcher.isAcquired()) { 4460284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // If we are the last one to reenable the keyguard wait until 4461284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // we have actually finished reenabling until returning. 4462284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // It is possible that reenableKeyguard() can be called before 4463284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // the previous disableKeyguard() is handled, in which case 4464284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // neither mKeyguardTokenWatcher.acquired() or released() would 4465284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // be called. In that case mKeyguardDisabled will be false here 4466284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller // and we have nothing to wait for. 4467284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller while (mKeyguardDisabled) { 4468284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller try { 4469284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller mKeyguardTokenWatcher.wait(); 4470284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller } catch (InterruptedException e) { 4471284b62e1b8c3419bfd02c6fea5ba0a68146c06f8Jim Miller Thread.currentThread().interrupt(); 44729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 44799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.app.KeyguardManager#exitKeyguardSecurely 44809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 44819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void exitKeyguardSecurely(final IOnKeyguardExitResult callback) { 4482733fdf34b6a8a8e3983ff7663828a928d3c19944Mike Lockwood if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD) 44839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project != PackageManager.PERMISSION_GRANTED) { 44849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException("Requires DISABLE_KEYGUARD permission"); 44859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.exitKeyguardSecurely(new WindowManagerPolicy.OnKeyguardExitResult() { 44879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onKeyguardExitResult(boolean success) { 44889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 44899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callback.onKeyguardExitResult(success); 44909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 44919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Client has died, we don't care. 44929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }); 44959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean inKeyguardRestrictedInputMode() { 44989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPolicy.inKeyguardRestrictedKeyInputMode(); 44999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 450006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4501520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood public boolean isKeyguardLocked() { 4502520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood return mPolicy.isKeyguardLocked(); 4503520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood } 4504520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood 4505520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood public boolean isKeyguardSecure() { 4506520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood return mPolicy.isKeyguardSecure(); 4507520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood } 4508520d8bc1d840966b5519195aaa514597a662c053Mike Lockwood 4509ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn public void closeSystemDialogs(String reason) { 4510ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn synchronized(mWindowMap) { 4511ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn for (int i=mWindows.size()-1; i>=0; i--) { 4512e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 4513ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn if (w.mSurface != null) { 4514ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn try { 4515ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn w.mClient.closeSystemDialogs(reason); 4516ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn } catch (RemoteException e) { 4517ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn } 4518ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn } 4519ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn } 4520ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn } 4521ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn } 4522ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 45239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static float fixScale(float scale) { 45249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scale < 0) scale = 0; 45259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (scale > 20) scale = 20; 45269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Math.abs(scale); 45279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 452806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 45299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAnimationScale(int which, float scale) { 45309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.SET_ANIMATION_SCALE, 45319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAnimationScale()")) { 4532cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires SET_ANIMATION_SCALE permission"); 45339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 45359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scale < 0) scale = 0; 45369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (scale > 20) scale = 20; 45379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scale = Math.abs(scale); 45389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 45399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 0: mWindowAnimationScale = fixScale(scale); break; 45409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 1: mTransitionAnimationScale = fixScale(scale); break; 45419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 454206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 45439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Persist setting 45449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.obtainMessage(H.PERSIST_ANIMATION_SCALE).sendToTarget(); 45459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 454606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 45479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAnimationScales(float[] scales) { 45489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.SET_ANIMATION_SCALE, 45499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAnimationScale()")) { 4550cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires SET_ANIMATION_SCALE permission"); 45519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 45539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scales != null) { 45549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scales.length >= 1) { 45559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowAnimationScale = fixScale(scales[0]); 45569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scales.length >= 2) { 45589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTransitionAnimationScale = fixScale(scales[1]); 45599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 456106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 45629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Persist setting 45639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.obtainMessage(H.PERSIST_ANIMATION_SCALE).sendToTarget(); 45649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 456506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 45669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float getAnimationScale(int which) { 45679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 45689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 0: return mWindowAnimationScale; 45699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 1: return mTransitionAnimationScale; 45709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 45729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 457306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 45749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float[] getAnimationScales() { 45759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new float[] { mWindowAnimationScale, mTransitionAnimationScale }; 45769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 457706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 45789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getSwitchState(int sw) { 45799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 45809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "getSwitchState()")) { 4581cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 45829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45836d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getSwitchState(-1, InputDevice.SOURCE_ANY, sw); 45849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 458506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 45869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getSwitchStateForDevice(int devid, int sw) { 45879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 45889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "getSwitchStateForDevice()")) { 4589cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 45909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45916d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getSwitchState(devid, InputDevice.SOURCE_ANY, sw); 45929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 459306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 45949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getScancodeState(int sw) { 45959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 45969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "getScancodeState()")) { 4597cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 45989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45996d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getScanCodeState(-1, InputDevice.SOURCE_ANY, sw); 46009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 460106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 46029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getScancodeStateForDevice(int devid, int sw) { 46039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 46049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "getScancodeStateForDevice()")) { 4605cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 46069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46076d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getScanCodeState(devid, InputDevice.SOURCE_ANY, sw); 46089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 460906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 46101d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn public int getTrackballScancodeState(int sw) { 46111d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 46121d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn "getTrackballScancodeState()")) { 46131d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 46141d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn } 46156d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getScanCodeState(-1, InputDevice.SOURCE_TRACKBALL, sw); 46161d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn } 46171d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn 46181d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn public int getDPadScancodeState(int sw) { 46191d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 46201d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn "getDPadScancodeState()")) { 46211d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 46221d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn } 46236d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getScanCodeState(-1, InputDevice.SOURCE_DPAD, sw); 46241d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn } 46251d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn 46269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getKeycodeState(int sw) { 46279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 46289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "getKeycodeState()")) { 4629cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 46309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46316d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_ANY, sw); 46329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 463306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 46349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getKeycodeStateForDevice(int devid, int sw) { 46359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 46369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "getKeycodeStateForDevice()")) { 4637cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 46389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46396d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getKeyCodeState(devid, InputDevice.SOURCE_ANY, sw); 46409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 464106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 46421d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn public int getTrackballKeycodeState(int sw) { 46431d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 46441d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn "getTrackballKeycodeState()")) { 46451d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 46461d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn } 46476d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_TRACKBALL, sw); 46481d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn } 46491d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn 46501d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn public int getDPadKeycodeState(int sw) { 46511d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 46521d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn "getDPadKeycodeState()")) { 46531d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn throw new SecurityException("Requires READ_INPUT_STATE permission"); 46541d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn } 46556d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_DPAD, sw); 46561d62ea9d8c2646d198b6967e2c6ae3dad5c18f9eDianne Hackborn } 4657a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown 46589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasKeys(int[] keycodes, boolean[] keyExists) { 46596d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown return mInputManager.hasKeys(-1, InputDevice.SOURCE_ANY, keycodes, keyExists); 46609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 466106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4662a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown public InputChannel monitorInput(String inputChannelName) { 4663a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown if (!checkCallingPermission(android.Manifest.permission.READ_INPUT_STATE, 4664a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown "monitorInput()")) { 4665a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown throw new SecurityException("Requires READ_INPUT_STATE permission"); 4666a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown } 4667a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown return mInputManager.monitorInput(inputChannelName); 4668a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown } 4669a41ca77fabe1c7ad12ebb9b69b9e786c07d49fa0Jeff Brown 46700029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown public void setInputFilter(InputFilter filter) { 46710029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown mInputManager.setInputFilter(filter); 46720029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown } 46730029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown 46748d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown public InputDevice getInputDevice(int deviceId) { 46758d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown return mInputManager.getInputDevice(deviceId); 46768d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown } 46778d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 46788d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown public int[] getInputDeviceIds() { 46798d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown return mInputManager.getInputDeviceIds(); 46808d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown } 46818d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown 46829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enableScreenAfterBoot() { 46839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 46849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSystemBooted) { 46859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 46869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSystemBooted = true; 46889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 468906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 46909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performEnableScreen(); 46919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 469206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 46939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enableScreenIfNeededLocked() { 46949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDisplayEnabled) { 46959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 46969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mSystemBooted) { 46989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 46999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessage(mH.obtainMessage(H.ENABLE_SCREEN)); 47019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 470206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 47039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void performEnableScreen() { 47049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 47059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDisplayEnabled) { 47069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 47079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mSystemBooted) { 47099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 47109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 471106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 47129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Don't enable the screen until all existing windows 47139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // have been drawn. 47149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mWindows.size(); 47159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 4716e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 4717f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn if (w.isVisibleLw() && !w.mObscured && !w.isDrawnLw()) { 47189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 47199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 472106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 47229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDisplayEnabled = true; 47239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 47248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, "ENABLING SCREEN!"); 47259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringWriter sw = new StringWriter(); 47269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PrintWriter pw = new PrintWriter(sw); 47279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.dump(null, pw, null); 47288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, sw.toString()); 47299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 47319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder surfaceFlinger = ServiceManager.getService("SurfaceFlinger"); 47329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (surfaceFlinger != null) { 47338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "******* TELLING SURFACE FLINGER WE ARE BOOTED!"); 47349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data = Parcel.obtain(); 47359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken("android.ui.ISurfaceComposer"); 47369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project surfaceFlinger.transact(IBinder.FIRST_CALL_TRANSACTION, 47379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data, null, 0); 47389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.recycle(); 47399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 47418a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.e(TAG, "Boot completed: SurfaceFlinger is dead!"); 47429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 474406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 47459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.enableScreenAfterBoot(); 474606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 47479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make sure the last requested orientation has been applied. 4748321ae681cad03d00ad1efc6f06f74268e00172a9Dianne Hackborn setRotationUnchecked(WindowManagerPolicy.USE_LAST_ROTATION, false, 4749321ae681cad03d00ad1efc6f06f74268e00172a9Dianne Hackborn mLastRotationFlags | Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE); 47509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 475106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 47529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setInTouchMode(boolean mode) { 47539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 47549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInTouchMode = mode; 47559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47586804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick // TODO: more accounting of which pid(s) turned it on, keep count, 47596804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick // only allow disables from pids which have count on, etc. 47606804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick public void showStrictModeViolation(boolean on) { 47616804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick int pid = Binder.getCallingPid(); 47626804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick synchronized(mWindowMap) { 47636804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick // Ignoring requests to enable the red border from clients 47646804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick // which aren't on screen. (e.g. Broadcast Receivers in 47656804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick // the background..) 47666804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick if (on) { 47676804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick boolean isVisible = false; 47686804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick for (WindowState ws : mWindows) { 47696804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick if (ws.mSession.mPid == pid && ws.isVisibleLw()) { 47706804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick isVisible = true; 47716804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick break; 47726804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick } 47736804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick } 47746804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick if (!isVisible) { 47756804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick return; 47766804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick } 47776804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick } 47786804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick 477994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION showStrictModeViolation"); 47806804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick Surface.openTransaction(); 478194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn try { 478294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (mStrictModeFlash == null) { 478394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn mStrictModeFlash = new StrictModeFlash(mDisplay, mFxSession); 478494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn } 478594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn mStrictModeFlash.setVisibility(on); 478694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn } finally { 478794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn Surface.closeTransaction(); 478894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION showStrictModeViolation"); 47896804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick } 47906804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick } 47916804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick } 47926804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick 4793c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick public void setStrictModeVisualIndicatorPreference(String value) { 4794c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick SystemProperties.set(StrictMode.VISUAL_PROPERTY, value); 4795c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick } 4796c1a968a8ed45181312f7d4bcdbba0cc8ddc201baBrad Fitzpatrick 4797e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller /** 4798e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller * Takes a snapshot of the screen. In landscape mode this grabs the whole screen. 4799e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller * In portrait mode, it grabs the upper region of the screen based on the vertical dimension 4800e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller * of the target image. 4801e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller * 4802e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller * @param width the width of the target bitmap 4803e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller * @param height the height of the target bitmap 4804e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller */ 4805e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller public Bitmap screenshotApplications(IBinder appToken, int width, int height) { 48060aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn if (!checkCallingPermission(android.Manifest.permission.READ_FRAME_BUFFER, 48070aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn "screenshotApplications()")) { 48080aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn throw new SecurityException("Requires READ_FRAME_BUFFER permission"); 48090aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 48100aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 48110aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn Bitmap rawss; 48120aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 4813d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn int maxLayer = 0; 48140aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn final Rect frame = new Rect(); 48150aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 48160aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn float scale; 4817e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller int dw, dh; 48180aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int rot; 48190aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 48200aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn synchronized(mWindowMap) { 48210aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn long ident = Binder.clearCallingIdentity(); 48220aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 482381e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn dw = mAppDisplayWidth; 482481e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn dh = mAppDisplayHeight; 4825428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn 48260aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int aboveAppLayer = mPolicy.windowTypeToLayerLw( 48270aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn WindowManager.LayoutParams.TYPE_APPLICATION) * TYPE_LAYER_MULTIPLIER 48280aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn + TYPE_LAYER_OFFSET; 48290aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn aboveAppLayer += TYPE_LAYER_MULTIPLIER; 48300aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 4831428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn boolean isImeTarget = mInputMethodTarget != null 4832428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn && mInputMethodTarget.mAppToken != null 4833428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn && mInputMethodTarget.mAppToken.appToken != null 4834428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn && mInputMethodTarget.mAppToken.appToken.asBinder() == appToken; 4835428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn 48360aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn // Figure out the part of the screen that is actually the app. 4837428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn boolean including = false; 4838428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn for (int i=mWindows.size()-1; i>=0; i--) { 48390aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn WindowState ws = mWindows.get(i); 48400aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn if (ws.mSurface == null) { 48410aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn continue; 48420aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 48430aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn if (ws.mLayer >= aboveAppLayer) { 4844d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn continue; 4845d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn } 4846428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // When we will skip windows: when we are not including 4847428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // ones behind a window we didn't skip, and we are actually 4848428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // taking a screenshot of a specific app. 4849428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn if (!including && appToken != null) { 4850428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // Also, we can possibly skip this window if it is not 4851428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // an IME target or the application for the screenshot 4852428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // is not the current IME target. 4853428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn if (!ws.mIsImWindow || !isImeTarget) { 4854428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // And finally, this window is of no interest if it 4855428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // is not associated with the screenshot app. 4856428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn if (ws.mAppToken == null || ws.mAppToken.token != appToken) { 4857428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn continue; 4858428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn } 4859428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn } 4860428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn } 4861428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn 4862428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // We keep on including windows until we go past a full-screen 4863428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn // window. 4864428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn including = !ws.mIsImWindow && !ws.isFullscreen(dw, dh); 4865428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn 4866d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn if (maxLayer < ws.mAnimLayer) { 4867d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn maxLayer = ws.mAnimLayer; 4868d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn } 48692aded18b0ef9f189771f70f05091493a44ec46aeJim Miller 48702aded18b0ef9f189771f70f05091493a44ec46aeJim Miller // Don't include wallpaper in bounds calculation 48712aded18b0ef9f189771f70f05091493a44ec46aeJim Miller if (!ws.mIsWallpaper) { 4872ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn final Rect wf = ws.mFrame; 48732aded18b0ef9f189771f70f05091493a44ec46aeJim Miller final Rect cr = ws.mContentInsets; 48742aded18b0ef9f189771f70f05091493a44ec46aeJim Miller int left = wf.left + cr.left; 48752aded18b0ef9f189771f70f05091493a44ec46aeJim Miller int top = wf.top + cr.top; 48762aded18b0ef9f189771f70f05091493a44ec46aeJim Miller int right = wf.right - cr.right; 48772aded18b0ef9f189771f70f05091493a44ec46aeJim Miller int bottom = wf.bottom - cr.bottom; 48782aded18b0ef9f189771f70f05091493a44ec46aeJim Miller frame.union(left, top, right, bottom); 48792aded18b0ef9f189771f70f05091493a44ec46aeJim Miller } 48800aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 48810aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn Binder.restoreCallingIdentity(ident); 48820aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 4883dd962ee1633b1e479bca5eae83744262fb69867fDianne Hackborn // Constrain frame to the screen size. 4884dd962ee1633b1e479bca5eae83744262fb69867fDianne Hackborn frame.intersect(0, 0, dw, dh); 4885e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller 4886cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn if (frame.isEmpty() || maxLayer == 0) { 48870aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn return null; 48880aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 48890aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 48900aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn // The screenshot API does not apply the current screen rotation. 48910aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn rot = mDisplay.getRotation(); 48920aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int fw = frame.width(); 48930aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int fh = frame.height(); 48940aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 489528637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller // Constrain thumbnail to smaller of screen width or height. Assumes aspect 489628637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller // of thumbnail is the same as the screen (in landscape) or square. 489728637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller if (dw <= dh) { 489828637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller scale = width / (float) fw; // portrait 489928637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller } else { 490028637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller scale = height / (float) fh; // landscape 490128637bacfdde4b2b110462c97fdd52854c5288d5Jim Miller } 49020aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 49030aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn // The screen shot will contain the entire screen. 4904428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn dw = (int)(dw*scale); 4905428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn dh = (int)(dh*scale); 49060aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn if (rot == Surface.ROTATION_90 || rot == Surface.ROTATION_270) { 49070aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn int tmp = dw; 49080aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn dw = dh; 49090aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn dh = tmp; 49100aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn rot = (rot == Surface.ROTATION_90) ? Surface.ROTATION_270 : Surface.ROTATION_90; 49110aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 4912d2835935d2df8be70d1b37d3ef3b2fe0155b3422Dianne Hackborn rawss = Surface.screenshot(dw, dh, 0, maxLayer); 49130aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 49140aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 4915cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn if (rawss == null) { 491688b03bd2e12c10c73e455a7eccf7d1aa324049d7Dianne Hackborn Log.w(TAG, "Failure taking screenshot for (" + dw + "x" + dh 491788b03bd2e12c10c73e455a7eccf7d1aa324049d7Dianne Hackborn + ") to layer " + maxLayer); 4918cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn return null; 4919cb8f0e099c0e149b6fcc477f9b554a2688f99820Dianne Hackborn } 4920e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller 4921e70d506ab329f1f96b0ee132317aa36edea1b94eJim Miller Bitmap bm = Bitmap.createBitmap(width, height, rawss.getConfig()); 49220aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn Matrix matrix = new Matrix(); 49230aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn ScreenRotationAnimation.createRotationMatrix(rot, dw, dh, matrix); 49240aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn matrix.postTranslate(-(int)(frame.left*scale), -(int)(frame.top*scale)); 49250aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn Canvas canvas = new Canvas(bm); 49260aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn canvas.drawBitmap(rawss, matrix, null); 49276311d0a079702b29984c0d31937345be105e1a5eDianne Hackborn canvas.setBitmap(null); 49280aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 49290aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn rawss.recycle(); 49300aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn return bm; 49310aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn } 49320aae2d4e0075fd699cf40b26dca0eb2c3b3e37d2Dianne Hackborn 4933b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler public void freezeRotation() { 4934b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION, 49352ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler "freezeRotation()")) { 4936b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler throw new SecurityException("Requires SET_ORIENTATION permission"); 4937b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler } 4938b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler 49392ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler if (DEBUG_ORIENTATION) Slog.v(TAG, "freezeRotation: mRotation=" + mRotation); 49402ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler 4941b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler mPolicy.setUserRotationMode(WindowManagerPolicy.USER_ROTATION_LOCKED, mRotation); 4942b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler setRotationUnchecked(WindowManagerPolicy.USE_LAST_ROTATION, false, 0); 4943b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler } 4944b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler 4945b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler public void thawRotation() { 4946b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION, 49472ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler "thawRotation()")) { 4948b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler throw new SecurityException("Requires SET_ORIENTATION permission"); 4949b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler } 4950b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler 49512ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler if (DEBUG_ORIENTATION) Slog.v(TAG, "thawRotation: mRotation=" + mRotation); 49522ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler 49532ed6ad6aeca5f9829ea7dad4e092064ee4baad47Daniel Sandler mPolicy.setUserRotationMode(WindowManagerPolicy.USER_ROTATION_FREE, 777); // rot not used 4954b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler setRotationUnchecked(WindowManagerPolicy.USE_LAST_ROTATION, false, 0); 4955b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler } 4956b73617de462579f7c12c25a4c2747c576f00f6a2Daniel Sandler 495706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy public void setRotation(int rotation, 49581e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn boolean alwaysSendConfiguration, int animFlags) { 49599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.SET_ORIENTATION, 49601e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn "setRotation()")) { 4961cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires SET_ORIENTATION permission"); 49629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49641e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn setRotationUnchecked(rotation, alwaysSendConfiguration, animFlags); 49659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 496606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 49671e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn public void setRotationUnchecked(int rotation, 49681e880dba106b14619c3eaf94c5dc2d1a943645bcDianne Hackborn boolean alwaysSendConfiguration, int animFlags) { 49698a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if(DEBUG_ORIENTATION) Slog.v(TAG, 4970910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner "setRotationUnchecked(rotation=" + rotation + 4971910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner " alwaysSendConfiguration=" + alwaysSendConfiguration + 4972910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner " animFlags=" + animFlags); 497306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 49749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long origId = Binder.clearCallingIdentity(); 49759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed; 49769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 497794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn changed = setRotationUncheckedLocked(rotation, animFlags, false); 49789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 497906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4980e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (changed || alwaysSendConfiguration) { 49819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendNewConfiguration(); 49829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 498306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 49849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(origId); 49859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 498606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 4987e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn /** 4988e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * Apply a new rotation to the screen, respecting the requests of 4989e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * applications. Use WindowManagerPolicy.USE_LAST_ROTATION to simply 4990e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * re-evaluate the desired rotation. 4991e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * 4992e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * Returns null if the rotation has been changed. In this case YOU 4993e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * MUST CALL setNewConfiguration() TO UNFREEZE THE SCREEN. 4994e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn */ 499594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn public boolean setRotationUncheckedLocked(int rotation, int animFlags, boolean inTransaction) { 499624572375323dee79e3b456af07640ca194fd40bfJeff Brown if (mDragState != null 499724572375323dee79e3b456af07640ca194fd40bfJeff Brown || (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating())) { 499824572375323dee79e3b456af07640ca194fd40bfJeff Brown // Potential rotation during a drag or while waiting for a previous orientation 499924572375323dee79e3b456af07640ca194fd40bfJeff Brown // change to finish (rotation animation will be dismissed). 500024572375323dee79e3b456af07640ca194fd40bfJeff Brown // Don't do the rotation now, but make a note to perform the rotation later. 500189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn if (DEBUG_ORIENTATION) Slog.v(TAG, "Deferring rotation."); 500289ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn if (rotation != WindowManagerPolicy.USE_LAST_ROTATION) { 500389ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn mDeferredRotation = rotation; 500489ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn mDeferredRotationAnimFlags = animFlags; 500589ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn } 5006ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate return false; 5007ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate } 5008ccd24de8a99d29b1c5a0c41cbf00983050810d5aChristopher Tate 50099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed; 50109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rotation == WindowManagerPolicy.USE_LAST_ROTATION) { 501189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn if (mDeferredRotation != WindowManagerPolicy.USE_LAST_ROTATION) { 501289ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn rotation = mDeferredRotation; 501389ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn mRequestedRotation = rotation; 501489ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn mLastRotationFlags = mDeferredRotationAnimFlags; 501589ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn } 50169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rotation = mRequestedRotation; 50179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 50189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRequestedRotation = rotation; 5019321ae681cad03d00ad1efc6f06f74268e00172a9Dianne Hackborn mLastRotationFlags = animFlags; 50209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 502189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn mDeferredRotation = WindowManagerPolicy.USE_LAST_ROTATION; 50228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, "Overwriting rotation value from " + rotation); 5023c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project rotation = mPolicy.rotationForOrientationLw(mForcedAppOrientation, 50249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRotation, mDisplayEnabled); 50258a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, "new rotation is set to " + rotation); 5026dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn 5027dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn int desiredRotation = rotation; 5028dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn int lockedRotation = mPolicy.getLockedRotationLw(); 5029dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn if (lockedRotation >= 0 && rotation != lockedRotation) { 5030dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // We are locked in a rotation but something is requesting 5031dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // a different rotation... we will either keep the locked 5032dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // rotation if it results in the same orientation, or have to 5033dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // switch into an emulated orientation mode. 5034dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn 5035dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // First, we know that our rotation is actually going to be 5036dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // the locked rotation. 5037dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn rotation = lockedRotation; 5038dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn 5039dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // Now the difference between the desired and lockedRotation 5040dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // may mean that the orientation is different... if that is 5041dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // not the case, we can just make the desired rotation be the 5042dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // same as the new locked rotation. 5043dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn switch (lockedRotation) { 5044dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn case Surface.ROTATION_0: 5045dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn if (rotation == Surface.ROTATION_180) { 5046dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn desiredRotation = lockedRotation; 5047dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } 5048dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn break; 5049dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn case Surface.ROTATION_90: 5050dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn if (rotation == Surface.ROTATION_270) { 5051dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn desiredRotation = lockedRotation; 5052dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } 5053dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn break; 5054dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn case Surface.ROTATION_180: 5055dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn if (rotation == Surface.ROTATION_0) { 5056dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn desiredRotation = lockedRotation; 5057dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } 5058dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn break; 5059dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn case Surface.ROTATION_270: 5060dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn if (rotation == Surface.ROTATION_90) { 5061dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn desiredRotation = lockedRotation; 5062dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } 5063dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn break; 5064dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } 5065dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } 5066dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn 50679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = mDisplayEnabled && mRotation != rotation; 5068dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn if (mAltOrientation != (rotation != desiredRotation)) { 5069dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn changed = true; 5070dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn mAltOrientation = rotation != desiredRotation; 5071dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } 507206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 50739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (changed) { 50748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, 50759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Rotation changed to " + rotation 50769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " from " + mRotation 50779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " (forceApp=" + mForcedAppOrientation 50789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", req=" + mRequestedRotation + ")"); 50799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRotation = rotation; 50809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowsFreezingScreen = true; 50819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT); 50829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessageDelayed(mH.obtainMessage(H.WINDOW_FREEZE_TIMEOUT), 50839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2000); 5084e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn mWaitingForConfig = true; 5085e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn mLayoutNeeded = true; 508694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn startFreezingDisplayLocked(inTransaction); 50875fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn //Slog.i(TAG, "Setting rotation to " + rotation + ", animFlags=" + animFlags); 508800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputManager.setDisplayOrientation(0, rotation); 50899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDisplayEnabled) { 5090910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner // NOTE: We disable the rotation in the emulator because 5091910a0681226f5f4f39084d2369bee04f3408eeeaDavid 'Digit' Turner // it doesn't support hardware OpenGL emulation yet. 5092de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (CUSTOM_SCREEN_ROTATION && mScreenRotationAnimation != null 5093de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn && mScreenRotationAnimation.hasScreenshot()) { 5094a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn Surface.freezeDisplay(0); 509594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (!inTransaction) { 509694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, 509794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn ">>> OPEN TRANSACTION setRotationUnchecked"); 509894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn Surface.openTransaction(); 509994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn } 510094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn try { 510194cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (mScreenRotationAnimation != null) { 510294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn mScreenRotationAnimation.setRotation(rotation); 510394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn } 510494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn } finally { 510594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (!inTransaction) { 510694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn Surface.closeTransaction(); 510794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, 510894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn "<<< CLOSE TRANSACTION setRotationUnchecked"); 510994cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn } 5110a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn } 5111a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn Surface.setOrientation(0, rotation, animFlags); 5112a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn Surface.unfreezeDisplay(0); 5113a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn } else { 5114a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn Surface.setOrientation(0, rotation, animFlags); 5115a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn } 51167916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn rebuildBlackFrame(inTransaction); 51179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5118dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn 51199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=mWindows.size()-1; i>=0; i--) { 5120e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 51219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mSurface != null) { 51229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mOrientationChanging = true; 51239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=mRotationWatchers.size()-1; i>=0; i--) { 51269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 51279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRotationWatchers.get(i).onRotationChanged(rotation); 51289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 51299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } //end if changed 513206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 51339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return changed; 51349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 513506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 51369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getRotation() { 51379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mRotation; 51389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int watchRotation(IRotationWatcher watcher) { 51419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IBinder watcherBinder = watcher.asBinder(); 51429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder.DeathRecipient dr = new IBinder.DeathRecipient() { 51439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void binderDied() { 51449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 51459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<mRotationWatchers.size(); i++) { 51469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (watcherBinder == mRotationWatchers.get(i).asBinder()) { 5147fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu IRotationWatcher removed = mRotationWatchers.remove(i); 5148fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu if (removed != null) { 5149fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu removed.asBinder().unlinkToDeath(this, 0); 5150fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu } 51519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 51529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 515706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 51589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 51599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 51609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project watcher.asBinder().linkToDeath(dr, 0); 51619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRotationWatchers.add(watcher); 51629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 51639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Client died, no cleanup needed. 51649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 516506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 51669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mRotation; 51679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5171dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * Apps that use the compact menu panel (as controlled by the panelMenuIsCompact 5172dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * theme attribute) on devices that feature a physical options menu key attempt to position 5173dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * their menu panel window along the edge of the screen nearest the physical menu key. 5174dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * This lowers the travel distance between invoking the menu panel and selecting 5175dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * a menu option. 5176dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * 5177dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * This method helps control where that menu is placed. Its current implementation makes 5178dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * assumptions about the menu key and its relationship to the screen based on whether 5179dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * the device's natural orientation is portrait (width < height) or landscape. 5180dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * 5181dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * The menu key is assumed to be located along the bottom edge of natural-portrait 5182dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * devices and along the right edge of natural-landscape devices. If these assumptions 5183dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * do not hold for the target device, this method should be changed to reflect that. 5184dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * 5185dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell * @return A {@link Gravity} value for placing the options menu window 5186dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell */ 5187dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell public int getPreferredOptionsPanelGravity() { 5188dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell synchronized (mWindowMap) { 5189dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell final int rotation = getRotation(); 5190dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell 5191dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell if (mInitialDisplayWidth < mInitialDisplayHeight) { 5192dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell // On devices with a natural orientation of portrait 5193dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell switch (rotation) { 5194dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell default: 5195dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell case Surface.ROTATION_0: 5196dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell return Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; 5197dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell case Surface.ROTATION_90: 5198dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell return Gravity.RIGHT | Gravity.CENTER_VERTICAL; 5199dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell case Surface.ROTATION_180: 5200dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell return Gravity.CENTER_HORIZONTAL | Gravity.TOP; 5201dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell case Surface.ROTATION_270: 5202dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell return Gravity.LEFT | Gravity.CENTER_VERTICAL; 5203dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell } 5204dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell } else { 5205dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell // On devices with a natural orientation of landscape 5206dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell switch (rotation) { 5207dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell default: 5208dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell case Surface.ROTATION_0: 5209dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell return Gravity.RIGHT | Gravity.CENTER_VERTICAL; 5210dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell case Surface.ROTATION_90: 5211dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell return Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; 5212dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell case Surface.ROTATION_180: 5213dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell return Gravity.LEFT | Gravity.CENTER_VERTICAL; 5214dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell case Surface.ROTATION_270: 5215dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell return Gravity.CENTER_HORIZONTAL | Gravity.TOP; 5216dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell } 5217dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell } 5218dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell } 5219dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell } 5220dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell 5221dfee59afb3e4cdcde38f6338f9360655de76da92Adam Powell /** 52229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Starts the view server on the specified port. 52239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 52249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param port The port to listener to. 52259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 52269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if the server was successfully started, false otherwise. 52279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5228a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn * @see com.android.server.wm.ViewServer 5229a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn * @see com.android.server.wm.ViewServer#VIEW_SERVER_DEFAULT_PORT 52309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 52319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean startViewServer(int port) { 523206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy if (isSystemSecure()) { 52339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 52349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(Manifest.permission.DUMP, "startViewServer")) { 52379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 52389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (port < 1024) { 52419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 52429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mViewServer != null) { 52459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mViewServer.isRunning()) { 52469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 52479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mViewServer.start(); 52489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 52498a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "View server did not start"); 52509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 52539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 52569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mViewServer = new ViewServer(this, port); 52579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mViewServer.start(); 52589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 52598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "View server did not start"); 52609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 52629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 526406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy private boolean isSystemSecure() { 526506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy return "1".equals(SystemProperties.get(SYSTEM_SECURE, "1")) && 526606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy "0".equals(SystemProperties.get(SYSTEM_DEBUGGABLE, "0")); 526706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy } 526806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 52699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 52709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Stops the view server if it exists. 52719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 52729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if the server stopped, false if it wasn't started or 52739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * couldn't be stopped. 52749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5275a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn * @see com.android.server.wm.ViewServer 52769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 52779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean stopViewServer() { 527806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy if (isSystemSecure()) { 52799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 52809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(Manifest.permission.DUMP, "stopViewServer")) { 52839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 52849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mViewServer != null) { 52879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mViewServer.stop(); 52889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 52909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 52939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates whether the view server is running. 52949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 52959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if the server is running, false otherwise. 52969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5297a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn * @see com.android.server.wm.ViewServer 52989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 52999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isViewServerRunning() { 530006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy if (isSystemSecure()) { 53019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 53029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(Manifest.permission.DUMP, "isViewServerRunning")) { 53059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 53069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mViewServer != null && mViewServer.isRunning(); 53099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 53129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lists all availble windows in the system. The listing is written in the 53139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specified Socket's output stream with the following syntax: 53149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * windowHashCodeInHexadecimal windowName 53159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Each line of the ouput represents a different window. 53169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 53179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param client The remote client to send the listing to. 53189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return False if an error occured, true otherwise. 53199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 53209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean viewServerListWindows(Socket client) { 532106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy if (isSystemSecure()) { 53229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 53239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean result = true; 53269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5327e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState[] windows; 53289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 53299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //noinspection unchecked 5330e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown windows = mWindows.toArray(new WindowState[mWindows.size()]); 53319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BufferedWriter out = null; 53349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Any uncaught exception will crash the system process 53369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 53379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OutputStream clientStream = client.getOutputStream(); 53389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out = new BufferedWriter(new OutputStreamWriter(clientStream), 8 * 1024); 53399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = windows.length; 53419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 5342e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown final WindowState w = windows[i]; 53439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.write(Integer.toHexString(System.identityHashCode(w))); 53449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.write(' '); 53459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append(w.mAttrs.getTitle()); 53469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.write('\n'); 53479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.write("DONE.\n"); 53509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.flush(); 53519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 53529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = false; 53539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 53549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out != null) { 53559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 53569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.close(); 53579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 53589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = false; 53599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 53649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5367f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev * Returns the focused window in the following format: 5368f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev * windowHashCodeInHexadecimal windowName 5369f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev * 5370f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev * @param client The remote client to send the listing to. 5371f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev * @return False if an error occurred, true otherwise. 5372f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev */ 5373f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev boolean viewServerGetFocusedWindow(Socket client) { 5374f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev if (isSystemSecure()) { 5375f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev return false; 5376f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev } 5377f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev 5378f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev boolean result = true; 5379f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev 5380f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev WindowState focusedWindow = getFocusedWindow(); 5381f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev 5382f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev BufferedWriter out = null; 5383f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev 5384f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev // Any uncaught exception will crash the system process 5385f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev try { 5386f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev OutputStream clientStream = client.getOutputStream(); 5387f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev out = new BufferedWriter(new OutputStreamWriter(clientStream), 8 * 1024); 5388f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev 5389f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev if(focusedWindow != null) { 5390f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev out.write(Integer.toHexString(System.identityHashCode(focusedWindow))); 5391f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev out.write(' '); 5392f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev out.append(focusedWindow.mAttrs.getTitle()); 5393f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev } 5394f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev out.write('\n'); 5395f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev out.flush(); 5396f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev } catch (Exception e) { 5397f9624764711f9806cd8a8a95c4a0613995bab04aKonstantin Lopyrev result = false; 53989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 53999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out != null) { 54009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 54019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.close(); 54029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 54039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = false; 54049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 54099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 54129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sends a command to a target window. The result of the command, if any, will be 54139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * written in the output stream of the specified socket. 54149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 54159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The parameters must follow this syntax: 54169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * windowHashcode extra 54179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 54189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Where XX is the length in characeters of the windowTitle. 54199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 54209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The first parameter is the target window. The window with the specified hashcode 54219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be the target. If no target can be found, nothing happens. The extra parameters 54229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be delivered to the target window and as parameters to the command itself. 54239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 54249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param client The remote client to sent the result, if any, to. 54259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param command The command to execute. 54269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parameters The command parameters. 54279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 54289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if the command was successfully delivered, false otherwise. This does 54299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not indicate whether the command itself was successful. 54309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 54319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean viewServerWindowCommand(Socket client, String command, String parameters) { 543206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy if (isSystemSecure()) { 54339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 54349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean success = true; 54379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data = null; 54389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel reply = null; 54399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 544043b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev BufferedWriter out = null; 544143b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev 54429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Any uncaught exception will crash the system process 54439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 54449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Find the hashcode of the window 54459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = parameters.indexOf(' '); 54469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index == -1) { 54479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = parameters.length(); 54489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String code = parameters.substring(0, index); 5450236092a36216c79507ec19eb207831810caced19Romain Guy int hashCode = (int) Long.parseLong(code, 16); 54519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Extract the command's parameter after the window description 54539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index < parameters.length()) { 54549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parameters = parameters.substring(index + 1); 54559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 54569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parameters = ""; 54579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final WindowState window = findWindow(hashCode); 54609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (window == null) { 54619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 54629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = Parcel.obtain(); 54659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken("android.view.IWindow"); 54669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeString(command); 54679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeString(parameters); 54689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt(1); 54699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ParcelFileDescriptor.fromSocket(client).writeToParcel(data, 0); 54709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply = Parcel.obtain(); 54729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IBinder binder = window.mClient.asBinder(); 54749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: GET THE TRANSACTION CODE IN A SAFER MANNER 54759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project binder.transact(IBinder.FIRST_CALL_TRANSACTION, data, reply, 0); 54769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.readException(); 54789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 547943b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev if (!client.isOutputShutdown()) { 548043b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 548143b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev out.write("DONE\n"); 548243b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev out.flush(); 548343b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev } 548443b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev 54859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 54868a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Could not send command " + command + " with parameters " + parameters, e); 54879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project success = false; 54889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 54899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (data != null) { 54909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.recycle(); 54919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (reply != null) { 54939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.recycle(); 54949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 549543b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev if (out != null) { 549643b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev try { 549743b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev out.close(); 549843b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev } catch (IOException e) { 549943b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev 550043b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev } 550143b9b48f792e0b1b166af7f7fb6a32172e7f11c2Konstantin Lopyrev } 55029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return success; 55059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5507dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev public void addWindowChangeListener(WindowChangeListener listener) { 5508dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev synchronized(mWindowMap) { 5509dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowChangeListeners.add(listener); 5510dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 5511dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 5512dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev 5513dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev public void removeWindowChangeListener(WindowChangeListener listener) { 5514dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev synchronized(mWindowMap) { 5515dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowChangeListeners.remove(listener); 5516dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 5517dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 5518dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev 5519dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev private void notifyWindowsChanged() { 5520dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev WindowChangeListener[] windowChangeListeners; 5521dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev synchronized(mWindowMap) { 5522dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev if(mWindowChangeListeners.isEmpty()) { 5523dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev return; 5524dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 5525dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev windowChangeListeners = new WindowChangeListener[mWindowChangeListeners.size()]; 5526dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev windowChangeListeners = mWindowChangeListeners.toArray(windowChangeListeners); 5527dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 5528dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev int N = windowChangeListeners.length; 5529dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev for(int i = 0; i < N; i++) { 5530dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev windowChangeListeners[i].windowsChanged(); 5531dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 5532dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 5533dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev 55346e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev private void notifyFocusChanged() { 55356e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev WindowChangeListener[] windowChangeListeners; 55366e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev synchronized(mWindowMap) { 55376e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev if(mWindowChangeListeners.isEmpty()) { 55386e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev return; 55396e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev } 55406e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev windowChangeListeners = new WindowChangeListener[mWindowChangeListeners.size()]; 55416e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev windowChangeListeners = mWindowChangeListeners.toArray(windowChangeListeners); 55426e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev } 55436e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev int N = windowChangeListeners.length; 55446e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev for(int i = 0; i < N; i++) { 55456e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev windowChangeListeners[i].focusChanged(); 55466e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev } 55476e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev } 55486e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev 55499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WindowState findWindow(int hashCode) { 55509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hashCode == -1) { 55519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getFocusedWindow(); 55529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 5555e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown final ArrayList<WindowState> windows = mWindows; 55569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = windows.size(); 55579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 5559e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = windows.get(i); 55609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (System.identityHashCode(w) == hashCode) { 55619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return w; 55629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 55679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 55709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Instruct the Activity Manager to fetch the current configuration and broadcast 55719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that to config-changed listeners if appropriate. 55729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 55739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void sendNewConfiguration() { 55749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 55759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActivityManager.updateConfiguration(null); 55769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 55779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 557906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 55809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Configuration computeNewConfiguration() { 55819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 558294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn Configuration config = computeNewConfigurationLocked(); 558394cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (config == null && mWaitingForConfig) { 558494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn // Nothing changed but we are waiting for something... stop that! 558594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn mWaitingForConfig = false; 558694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn performLayoutAndPlaceSurfacesLocked(); 558794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn } 558894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn return config; 5589c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn } 5590c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn } 559106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 5592c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn Configuration computeNewConfigurationLocked() { 5593c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn Configuration config = new Configuration(); 5594c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn if (!computeNewConfigurationLocked(config)) { 5595c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn return null; 5596c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn } 5597c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn return config; 5598c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn } 559906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 560069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn private int reduceConfigWidthSize(int curSize, int rotation, float density, int dw) { 560169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn int size = (int)(mPolicy.getConfigDisplayWidth(rotation, dw) / density); 560269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (size < curSize) { 560369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn curSize = size; 560469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 560569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn return curSize; 560669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 560769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn 56085fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn private int computeSmallestWidth(boolean rotated, int dw, int dh, float density) { 56095fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn // We need to determine the smallest width that will occur under normal 56105fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn // operation. To this, start with the base screen size and compute the 56115fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn // width under the different possible rotations. We need to un-rotate 56125fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn // the current screen dimensions before doing this. 56135fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn int unrotDw, unrotDh; 56145fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (rotated) { 56155fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn unrotDw = dh; 56165fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn unrotDh = dw; 56175fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } else { 56185fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn unrotDw = dw; 56195fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn unrotDh = dh; 56205fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } 56215fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn int sw = reduceConfigWidthSize(unrotDw, Surface.ROTATION_0, density, unrotDw); 56225fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn sw = reduceConfigWidthSize(sw, Surface.ROTATION_90, density, unrotDh); 56235fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn sw = reduceConfigWidthSize(sw, Surface.ROTATION_180, density, unrotDw); 56245fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn sw = reduceConfigWidthSize(sw, Surface.ROTATION_270, density, unrotDh); 56255fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn return sw; 56265fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn } 56275fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn 562848a7651823030ed3c0f4c084b423430044425feaDianne Hackborn private int reduceCompatConfigWidthSize(int curSize, int rotation, DisplayMetrics dm, 562948a7651823030ed3c0f4c084b423430044425feaDianne Hackborn int dw, int dh) { 56302b31d53161789358de57fd396716a6503855c5daDianne Hackborn dm.noncompatWidthPixels = mPolicy.getNonDecorDisplayWidth(rotation, dw); 56312b31d53161789358de57fd396716a6503855c5daDianne Hackborn dm.noncompatHeightPixels = mPolicy.getNonDecorDisplayHeight(rotation, dh); 563248a7651823030ed3c0f4c084b423430044425feaDianne Hackborn float scale = CompatibilityInfo.computeCompatibleScaling(dm, null); 56332b31d53161789358de57fd396716a6503855c5daDianne Hackborn int size = (int)(((dm.noncompatWidthPixels / scale) / dm.density) + .5f); 563448a7651823030ed3c0f4c084b423430044425feaDianne Hackborn if (curSize == 0 || size < curSize) { 563548a7651823030ed3c0f4c084b423430044425feaDianne Hackborn curSize = size; 563648a7651823030ed3c0f4c084b423430044425feaDianne Hackborn } 563748a7651823030ed3c0f4c084b423430044425feaDianne Hackborn return curSize; 563848a7651823030ed3c0f4c084b423430044425feaDianne Hackborn } 563948a7651823030ed3c0f4c084b423430044425feaDianne Hackborn 564048a7651823030ed3c0f4c084b423430044425feaDianne Hackborn private int computeCompatSmallestWidth(boolean rotated, DisplayMetrics dm, int dw, int dh) { 564148a7651823030ed3c0f4c084b423430044425feaDianne Hackborn mTmpDisplayMetrics.setTo(dm); 564248a7651823030ed3c0f4c084b423430044425feaDianne Hackborn dm = mTmpDisplayMetrics; 564348a7651823030ed3c0f4c084b423430044425feaDianne Hackborn int unrotDw, unrotDh; 564448a7651823030ed3c0f4c084b423430044425feaDianne Hackborn if (rotated) { 564548a7651823030ed3c0f4c084b423430044425feaDianne Hackborn unrotDw = dh; 564648a7651823030ed3c0f4c084b423430044425feaDianne Hackborn unrotDh = dw; 564748a7651823030ed3c0f4c084b423430044425feaDianne Hackborn } else { 564848a7651823030ed3c0f4c084b423430044425feaDianne Hackborn unrotDw = dw; 564948a7651823030ed3c0f4c084b423430044425feaDianne Hackborn unrotDh = dh; 565048a7651823030ed3c0f4c084b423430044425feaDianne Hackborn } 565148a7651823030ed3c0f4c084b423430044425feaDianne Hackborn int sw = reduceCompatConfigWidthSize(0, Surface.ROTATION_0, dm, unrotDw, unrotDh); 565248a7651823030ed3c0f4c084b423430044425feaDianne Hackborn sw = reduceCompatConfigWidthSize(sw, Surface.ROTATION_90, dm, unrotDh, unrotDw); 565348a7651823030ed3c0f4c084b423430044425feaDianne Hackborn sw = reduceCompatConfigWidthSize(sw, Surface.ROTATION_180, dm, unrotDw, unrotDh); 565448a7651823030ed3c0f4c084b423430044425feaDianne Hackborn sw = reduceCompatConfigWidthSize(sw, Surface.ROTATION_270, dm, unrotDh, unrotDw); 565548a7651823030ed3c0f4c084b423430044425feaDianne Hackborn return sw; 565648a7651823030ed3c0f4c084b423430044425feaDianne Hackborn } 565748a7651823030ed3c0f4c084b423430044425feaDianne Hackborn 5658c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn boolean computeNewConfigurationLocked(Configuration config) { 5659c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn if (mDisplay == null) { 5660c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn return false; 56619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 566200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown 566300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputManager.getInputConfiguration(config); 5664b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate 5665b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate // Use the effective "visual" dimensions based on current rotation 5666b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate final boolean rotated = (mRotation == Surface.ROTATION_90 5667b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate || mRotation == Surface.ROTATION_270); 56687916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn final int realdw = rotated ? mBaseDisplayHeight : mBaseDisplayWidth; 56697916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn final int realdh = rotated ? mBaseDisplayWidth : mBaseDisplayHeight; 5670dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn 5671dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn if (mAltOrientation) { 5672dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn mCurDisplayWidth = realdw; 5673dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn mCurDisplayHeight = realdh; 5674dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn if (realdw > realdh) { 5675dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // Turn landscape into portrait. 5676dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn int maxw = (int)(realdh/1.3f); 5677dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn if (maxw < realdw) { 5678dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn mCurDisplayWidth = maxw; 5679dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } 5680dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } else { 5681dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // Turn portrait into landscape. 5682dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn int maxh = (int)(realdw/1.3f); 5683dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn if (maxh < realdh) { 5684dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn mCurDisplayHeight = maxh; 5685dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } 5686dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } 5687dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } else { 5688dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn mCurDisplayWidth = realdw; 5689dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn mCurDisplayHeight = realdh; 5690dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } 5691dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn 5692dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn final int dw = mCurDisplayWidth; 5693dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn final int dh = mCurDisplayHeight; 5694b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate 5695c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn int orientation = Configuration.ORIENTATION_SQUARE; 5696c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn if (dw < dh) { 5697c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn orientation = Configuration.ORIENTATION_PORTRAIT; 5698c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn } else if (dw > dh) { 5699c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn orientation = Configuration.ORIENTATION_LANDSCAPE; 5700c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn } 5701c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn config.orientation = orientation; 5702ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 5703bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown // Update real display metrics. 5704bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mDisplay.getMetricsWithSize(mRealDisplayMetrics, mCurDisplayWidth, mCurDisplayHeight); 5705dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn 5706bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown // Update application display metrics. 5707bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown final DisplayMetrics dm = mDisplayMetrics; 5708bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mAppDisplayWidth = mPolicy.getNonDecorDisplayWidth(mRotation, dw); 5709bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mAppDisplayHeight = mPolicy.getNonDecorDisplayHeight(mRotation, dh); 5710bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mDisplay.getMetricsWithSize(dm, mAppDisplayWidth, mAppDisplayHeight); 5711dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn 57125fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn mCompatibleScreenScale = CompatibilityInfo.computeCompatibleScaling(dm, 57135fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn mCompatDisplayMetrics); 57141ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima 571569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn config.screenWidthDp = (int)(mPolicy.getConfigDisplayWidth(mRotation, dw) / dm.density); 571669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn config.screenHeightDp = (int)(mPolicy.getConfigDisplayHeight(mRotation, dh) / dm.density); 57175fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn config.smallestScreenWidthDp = computeSmallestWidth(rotated, dw, dh, dm.density); 57185fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn 57195fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn config.compatScreenWidthDp = (int)(config.screenWidthDp / mCompatibleScreenScale); 57205fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn config.compatScreenHeightDp = (int)(config.screenHeightDp / mCompatibleScreenScale); 572148a7651823030ed3c0f4c084b423430044425feaDianne Hackborn config.compatSmallestScreenWidthDp = computeCompatSmallestWidth(rotated, dm, dw, dh); 572269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn 572369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn // We need to determine the smallest width that will occur under normal 572469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn // operation. To this, start with the base screen size and compute the 572569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn // width under the different possible rotations. We need to un-rotate 572669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn // the current screen dimensions before doing this. 572769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn int unrotDw, unrotDh; 572869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn if (rotated) { 572969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn unrotDw = dh; 573069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn unrotDh = dw; 573169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } else { 573269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn unrotDw = dw; 573369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn unrotDh = dh; 573469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn } 573569cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn config.smallestScreenWidthDp = reduceConfigWidthSize(unrotDw, 573669cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn Surface.ROTATION_0, dm.density, unrotDw); 573769cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn config.smallestScreenWidthDp = reduceConfigWidthSize(config.smallestScreenWidthDp, 573869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn Surface.ROTATION_90, dm.density, unrotDh); 573969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn config.smallestScreenWidthDp = reduceConfigWidthSize(config.smallestScreenWidthDp, 574069cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn Surface.ROTATION_180, dm.density, unrotDw); 574169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn config.smallestScreenWidthDp = reduceConfigWidthSize(config.smallestScreenWidthDp, 574269cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn Surface.ROTATION_270, dm.density, unrotDh); 57433fc982f41fda1f254bfbc35490d81cd82a0ed90aDianne Hackborn 5744dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // Compute the screen layout size class. 5745dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn int screenLayout; 5746dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn int longSize = dw; 5747dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn int shortSize = dh; 5748dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn if (longSize < shortSize) { 5749dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn int tmp = longSize; 5750dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn longSize = shortSize; 5751dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn shortSize = tmp; 5752dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } 5753dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn longSize = (int)(longSize/dm.density); 5754dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn shortSize = (int)(shortSize/dm.density); 5755dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn 5756dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // These semi-magic numbers define our compatibility modes for 5757dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // applications with different screens. These are guarantees to 5758dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // app developers about the space they can expect for a particular 5759dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // configuration. DO NOT CHANGE! 5760dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn if (longSize < 470) { 5761dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // This is shorter than an HVGA normal density screen (which 5762dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // is 480 pixels on its long side). 5763dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn screenLayout = Configuration.SCREENLAYOUT_SIZE_SMALL 5764dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn | Configuration.SCREENLAYOUT_LONG_NO; 5765dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } else { 5766dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // What size is this screen screen? 5767dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn if (longSize >= 960 && shortSize >= 720) { 5768dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // 1.5xVGA or larger screens at medium density are the point 5769dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // at which we consider it to be an extra large screen. 5770dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn screenLayout = Configuration.SCREENLAYOUT_SIZE_XLARGE; 5771dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } else if (longSize >= 640 && shortSize >= 480) { 5772dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // VGA or larger screens at medium density are the point 5773dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // at which we consider it to be a large screen. 5774dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn screenLayout = Configuration.SCREENLAYOUT_SIZE_LARGE; 5775723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } else { 5776dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn screenLayout = Configuration.SCREENLAYOUT_SIZE_NORMAL; 5777dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } 5778ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 5779dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // If this screen is wider than normal HVGA, or taller 5780dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // than FWVGA, then for old apps we want to run in size 5781dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // compatibility mode. 5782dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn if (shortSize > 321 || longSize > 570) { 5783dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn screenLayout |= Configuration.SCREENLAYOUT_COMPAT_NEEDED; 5784dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } 5785dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn 5786dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // Is this a long screen? 5787dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn if (((longSize*3)/5) >= (shortSize-1)) { 5788dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn // Anything wider than WVGA (5:3) is considering to be long. 5789dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn screenLayout |= Configuration.SCREENLAYOUT_LONG_YES; 5790dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn } else { 5791dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn screenLayout |= Configuration.SCREENLAYOUT_LONG_NO; 5792723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } 5793723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } 5794dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn config.screenLayout = screenLayout; 5795ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 5796597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown // Determine whether a hard keyboard is available and enabled. 57972992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown boolean hardKeyboardAvailable = config.keyboard != Configuration.KEYBOARD_NOKEYS; 57982992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown if (hardKeyboardAvailable != mHardKeyboardAvailable) { 57992992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mHardKeyboardAvailable = hardKeyboardAvailable; 58002992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mHardKeyboardEnabled = hardKeyboardAvailable; 58012992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 58022992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mH.removeMessages(H.REPORT_HARD_KEYBOARD_STATUS_CHANGE); 58032992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mH.sendEmptyMessage(H.REPORT_HARD_KEYBOARD_STATUS_CHANGE); 58042992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 58052992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown if (!mHardKeyboardEnabled) { 58062992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown config.keyboard = Configuration.KEYBOARD_NOKEYS; 58072992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 5808597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown 5809597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown // Update value of keyboardHidden, hardKeyboardHidden and navigationHidden 5810597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown // based on whether a hard or soft keyboard is present, whether navigation keys 5811597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown // are present and the lid switch state. 5812597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown config.keyboardHidden = Configuration.KEYBOARDHIDDEN_NO; 5813597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_NO; 5814597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown config.navigationHidden = Configuration.NAVIGATIONHIDDEN_NO; 5815597eec8c3d13fa68c3476b12005744c42522d960Jeff Brown mPolicy.adjustConfigurationLw(config); 5816c485a60a32342ff4e5db5c707f28a0816b4c2ff4Dianne Hackborn return true; 58179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5818a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 58192992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown public boolean isHardKeyboardAvailable() { 58202992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown synchronized (mWindowMap) { 58212992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown return mHardKeyboardAvailable; 58222992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 58232992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 58242992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 58252992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown public boolean isHardKeyboardEnabled() { 58262992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown synchronized (mWindowMap) { 58272992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown return mHardKeyboardEnabled; 58282992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 58292992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 58302992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 58312992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown public void setHardKeyboardEnabled(boolean enabled) { 58322992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown synchronized (mWindowMap) { 58332992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown if (mHardKeyboardEnabled != enabled) { 58342992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mHardKeyboardEnabled = enabled; 58352992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION); 58362992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 58372992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 58382992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 58392992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 58402992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown public void setOnHardKeyboardStatusChangeListener( 58412992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown OnHardKeyboardStatusChangeListener listener) { 58422992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown synchronized (mWindowMap) { 58432992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mHardKeyboardStatusChangeListener = listener; 58442992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 58452992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 58462992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 58472992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown void notifyHardKeyboardStatusChange() { 58482992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown final boolean available, enabled; 58492992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown final OnHardKeyboardStatusChangeListener listener; 58502992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown synchronized (mWindowMap) { 58512992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown listener = mHardKeyboardStatusChangeListener; 58522992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown available = mHardKeyboardAvailable; 58532992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown enabled = mHardKeyboardEnabled; 58542992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 58552992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown if (listener != null) { 58562992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown listener.onHardKeyboardStatusChange(available, enabled); 58572992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 58582992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 58592992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 5860a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate // ------------------------------------------------------------- 5861a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate // Drag and drop 5862a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate // ------------------------------------------------------------- 5863a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 5864a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate IBinder prepareDragSurface(IWindow window, SurfaceSession session, 586502d2b3ba9ba830a8147db2739613f7bbb2d0fcbfChristopher Tate int flags, int width, int height, Surface outSurface) { 5866a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (DEBUG_DRAG) { 5867a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate Slog.d(TAG, "prepare drag surface: w=" + width + " h=" + height 586802d2b3ba9ba830a8147db2739613f7bbb2d0fcbfChristopher Tate + " flags=" + Integer.toHexString(flags) + " win=" + window 5869a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate + " asbinder=" + window.asBinder()); 5870a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 5871a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 5872a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate final int callerPid = Binder.getCallingPid(); 5873a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate final long origId = Binder.clearCallingIdentity(); 5874a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate IBinder token = null; 5875a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 5876a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate try { 5877a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate synchronized (mWindowMap) { 5878a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate try { 5879a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (mDragState == null) { 5880a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate Surface surface = new Surface(session, callerPid, "drag surface", 0, 5881a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate width, height, PixelFormat.TRANSLUCENT, Surface.HIDDEN); 5882ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, " DRAG " 5883ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn + surface + ": CREATE"); 5884a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate outSurface.copyFrom(surface); 58857b362e431f3e17a755e56bc7dbc99bd661cb46baChris Tate final IBinder winBinder = window.asBinder(); 5886a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate token = new Binder(); 58876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn mDragState = new DragState(this, token, surface, /*flags*/ 0, winBinder); 5888a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate mDragState.mSurface = surface; 5889a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate token = mDragState.mToken = new Binder(); 5890a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 5891a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate // 5 second timeout for this window to actually begin the drag 58927b362e431f3e17a755e56bc7dbc99bd661cb46baChris Tate mH.removeMessages(H.DRAG_START_TIMEOUT, winBinder); 58937b362e431f3e17a755e56bc7dbc99bd661cb46baChris Tate Message msg = mH.obtainMessage(H.DRAG_START_TIMEOUT, winBinder); 5894a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate mH.sendMessageDelayed(msg, 5000); 5895a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } else { 5896a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate Slog.w(TAG, "Drag already in progress"); 5897a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 5898a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } catch (Surface.OutOfResourcesException e) { 5899a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate Slog.e(TAG, "Can't allocate drag surface w=" + width + " h=" + height, e); 5900a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (mDragState != null) { 5901a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate mDragState.reset(); 5902a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate mDragState = null; 5903a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 5904a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 5905a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 5906a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } finally { 5907a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate Binder.restoreCallingIdentity(origId); 5908a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 5909a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 5910a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate return token; 5911a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 5912a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 59139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 59149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Input Events and Focus Management 59159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 591646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 59176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final InputMonitor mInputMonitor = new InputMonitor(this); 59187fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 59199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void pauseKeyDispatching(IBinder _token) { 59209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 59219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "pauseKeyDispatching()")) { 5922cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 59239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 592406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 59259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 59269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken token = mTokenMap.get(_token); 59279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token != null) { 592800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputMonitor.pauseDispatchingLw(token); 59299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 59309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 59319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5932ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 59339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void resumeKeyDispatching(IBinder _token) { 59349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 59359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "resumeKeyDispatching()")) { 5936cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 5937e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan } 5938e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan 59399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 59409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken token = mTokenMap.get(_token); 59419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (token != null) { 594200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputMonitor.resumeDispatchingLw(token); 5943e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan } 5944e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan } 59459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5946e96440fa15b9158690996dd1e5ef2096099d5388Michael Chan 59479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setEventDispatching(boolean enabled) { 59489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 59499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "resumeKeyDispatching()")) { 5950cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 59519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 595206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 59539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 595400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputMonitor.setEventDispatchingLw(enabled); 59559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 59569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 595706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 59589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 59599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Injects a keystroke event into the UI. 5960bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * Even when sync is false, this method may block while waiting for current 5961bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * input events to be dispatched. 596206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * 596306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * @param ev A motion event describing the keystroke action. (Be sure to use 59649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link SystemClock#uptimeMillis()} as the timebase.) 59659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sync If true, wait for the event to be completed before returning to the caller. 59669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if event was dispatched, false if it was dropped for any reason 59679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 59689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean injectKeyEvent(KeyEvent ev, boolean sync) { 59699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long downTime = ev.getDownTime(); 59709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long eventTime = ev.getEventTime(); 597106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 59729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int action = ev.getAction(); 59739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int code = ev.getKeyCode(); 59749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int repeatCount = ev.getRepeatCount(); 59759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int metaState = ev.getMetaState(); 59769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int deviceId = ev.getDeviceId(); 59779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int scancode = ev.getScanCode(); 5978c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown int source = ev.getSource(); 5979c6ded10dd1ee08c887d0e81d683a7611fbe3ca4dMike Playle int flags = ev.getFlags(); 5980c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 5981c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown if (source == InputDevice.SOURCE_UNKNOWN) { 5982c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown source = InputDevice.SOURCE_KEYBOARD; 5983c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown } 598406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 59859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (eventTime == 0) eventTime = SystemClock.uptimeMillis(); 59869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (downTime == 0) downTime = eventTime; 598706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 59889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project KeyEvent newEvent = new KeyEvent(downTime, eventTime, action, code, repeatCount, metaState, 59894a88013a4a06a9ea80e8419f94694936e6b013f0Jean-Baptiste Queru deviceId, scancode, flags | KeyEvent.FLAG_FROM_SYSTEM, source); 599006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 59912bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final int pid = Binder.getCallingPid(); 59922bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final int uid = Binder.getCallingUid(); 59932bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final long ident = Binder.clearCallingIdentity(); 599446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 5995bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown final int result = mInputManager.injectInputEvent(newEvent, pid, uid, 5996bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown sync ? InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISH 5997bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown : InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT, 5998bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown INJECTION_TIMEOUT_MILLIS); 599946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 60002bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn Binder.restoreCallingIdentity(ident); 60017fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown return reportInjectionResult(result); 60029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 60039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 60049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 60059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inject a pointer (touch) event into the UI. 6006bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * Even when sync is false, this method may block while waiting for current 6007bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * input events to be dispatched. 600806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * 600906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * @param ev A motion event describing the pointer (touch) action. (As noted in 601006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * {@link MotionEvent#obtain(long, long, int, float, float, int)}, be sure to use 60119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link SystemClock#uptimeMillis()} as the timebase.) 60129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sync If true, wait for the event to be completed before returning to the caller. 60139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if event was dispatched, false if it was dropped for any reason 60149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 60159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean injectPointerEvent(MotionEvent ev, boolean sync) { 60162bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final int pid = Binder.getCallingPid(); 60172bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final int uid = Binder.getCallingUid(); 60182bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final long ident = Binder.clearCallingIdentity(); 601946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 6020c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown MotionEvent newEvent = MotionEvent.obtain(ev); 6021c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown if ((newEvent.getSource() & InputDevice.SOURCE_CLASS_POINTER) == 0) { 6022c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown newEvent.setSource(InputDevice.SOURCE_TOUCHSCREEN); 6023c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown } 6024c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 6025bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown final int result = mInputManager.injectInputEvent(newEvent, pid, uid, 6026bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown sync ? InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISH 6027bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown : InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT, 6028bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown INJECTION_TIMEOUT_MILLIS); 602946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 60302bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn Binder.restoreCallingIdentity(ident); 60317fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown return reportInjectionResult(result); 60329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 603306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 60349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 60359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inject a trackball (navigation device) event into the UI. 6036bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * Even when sync is false, this method may block while waiting for current 6037bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * input events to be dispatched. 603806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * 603906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * @param ev A motion event describing the trackball action. (As noted in 604006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * {@link MotionEvent#obtain(long, long, int, float, float, int)}, be sure to use 60419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link SystemClock#uptimeMillis()} as the timebase.) 60429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sync If true, wait for the event to be completed before returning to the caller. 60439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if event was dispatched, false if it was dropped for any reason 60449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 60459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean injectTrackballEvent(MotionEvent ev, boolean sync) { 60462bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final int pid = Binder.getCallingPid(); 60472bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final int uid = Binder.getCallingUid(); 60482bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn final long ident = Binder.clearCallingIdentity(); 604946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 6050c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown MotionEvent newEvent = MotionEvent.obtain(ev); 6051c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown if ((newEvent.getSource() & InputDevice.SOURCE_CLASS_TRACKBALL) == 0) { 6052c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown newEvent.setSource(InputDevice.SOURCE_TRACKBALL); 6053c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown } 6054c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown 6055bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown final int result = mInputManager.injectInputEvent(newEvent, pid, uid, 6056bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown sync ? InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_FINISH 6057bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown : InputManager.INPUT_EVENT_INJECTION_SYNC_WAIT_FOR_RESULT, 6058bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown INJECTION_TIMEOUT_MILLIS); 6059bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown 6060bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown Binder.restoreCallingIdentity(ident); 6061bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown return reportInjectionResult(result); 6062bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown } 6063bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown 6064bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown /** 6065bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * Inject an input event into the UI without waiting for dispatch to commence. 6066bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * This variant is useful for fire-and-forget input event injection. It does not 6067bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * block any longer than it takes to enqueue the input event. 6068bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * 6069bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * @param ev An input event. (Be sure to set the input source correctly.) 6070bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown * @return Returns true if event was dispatched, false if it was dropped for any reason 6071bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown */ 6072bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown public boolean injectInputEventNoWait(InputEvent ev) { 6073bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown final int pid = Binder.getCallingPid(); 6074bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown final int uid = Binder.getCallingUid(); 6075bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown final long ident = Binder.clearCallingIdentity(); 6076bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown 6077bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown final int result = mInputManager.injectInputEvent(ev, pid, uid, 6078bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown InputManager.INPUT_EVENT_INJECTION_SYNC_NONE, 6079bbda99d2086d79ac70b403cad38a47c35af84adfJeff Brown INJECTION_TIMEOUT_MILLIS); 608046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 60812bd33d74aed2abc6eb1ef7a9783cd87045598235Dianne Hackborn Binder.restoreCallingIdentity(ident); 60827fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown return reportInjectionResult(result); 60837fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown } 60847fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown 60857fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown private boolean reportInjectionResult(int result) { 608600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown switch (result) { 608700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown case InputManager.INPUT_EVENT_INJECTION_PERMISSION_DENIED: 608800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown Slog.w(TAG, "Input event injection permission denied."); 608900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown throw new SecurityException( 609000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown "Injecting to another application requires INJECT_EVENTS permission"); 609100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown case InputManager.INPUT_EVENT_INJECTION_SUCCEEDED: 609209e85dc0270ac9ce660c17ee8290ff2d136b395bChristopher Tate //Slog.v(TAG, "Input event injection succeeded."); 609300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown return true; 609400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown case InputManager.INPUT_EVENT_INJECTION_TIMED_OUT: 609500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown Slog.w(TAG, "Input event injection timed out."); 609600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown return false; 609700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown case InputManager.INPUT_EVENT_INJECTION_FAILED: 609800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown default: 609900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown Slog.w(TAG, "Input event injection failed."); 610000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown return false; 6101cfaef699e1dfb3a75d5b51f3b15816f13670fd51Dianne Hackborn } 61029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 610306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 61041a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown /** 61051a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown * Temporarily set the pointer speed. Does not save the new setting. 61061a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown * Used by the settings application. 61071a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown */ 61081a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown public void setPointerSpeed(int speed) { 61091a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown if (!checkCallingPermission(android.Manifest.permission.SET_POINTER_SPEED, 61101a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown "setPointerSpeed()")) { 61111a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown throw new SecurityException("Requires SET_POINTER_SPEED permission"); 61121a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown } 61131a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 61141a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown mInputManager.setPointerSpeed(speed); 61151a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown } 61161a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown 61179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WindowState getFocusedWindow() { 61189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 61199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getFocusedWindowLocked(); 61209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 61219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 61229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 61239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WindowState getFocusedWindowLocked() { 61249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrentFocus; 61259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 612606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 61279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean detectSafeMode() { 6128b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown if (!mInputMonitor.waitForInputDevicesReady( 6129b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS)) { 6130b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown Slog.w(TAG, "Devices still not ready after waiting " 6131b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown + INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS 6132b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown + " milliseconds before attempting to detect safe mode."); 6133b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown } 6134b09abc1dd271d0eb4ba4050d8bf9670802a7d0feJeff Brown 61359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSafeMode = mPolicy.detectSafeMode(); 61369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSafeMode; 61379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 613806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 61399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void systemReady() { 61405132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn synchronized(mWindowMap) { 61415132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn if (mDisplay != null) { 61425132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn throw new IllegalStateException("Display already initialized"); 61435132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn } 61445132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE); 61455132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn mDisplay = wm.getDefaultDisplay(); 6146bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mInitialDisplayWidth = mDisplay.getRawWidth(); 6147bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mInitialDisplayHeight = mDisplay.getRawHeight(); 61487916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn int rot = mDisplay.getRotation(); 61497916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (rot == Surface.ROTATION_90 || rot == Surface.ROTATION_270) { 61507916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn // If the screen is currently rotated, we need to swap the 61517916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn // initial width and height to get the true natural values. 61527916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn int tmp = mInitialDisplayWidth; 61537916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mInitialDisplayWidth = mInitialDisplayHeight; 61547916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mInitialDisplayHeight = tmp; 61557916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 615681e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn mBaseDisplayWidth = mCurDisplayWidth = mAppDisplayWidth = mInitialDisplayWidth; 615781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn mBaseDisplayHeight = mCurDisplayHeight = mAppDisplayHeight = mInitialDisplayHeight; 6158bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mInputManager.setDisplaySize(Display.DEFAULT_DISPLAY, 6159bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mDisplay.getRawWidth(), mDisplay.getRawHeight(), 6160bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mDisplay.getRawExternalWidth(), mDisplay.getRawExternalHeight()); 61619d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn mPolicy.setInitialDisplaySize(mInitialDisplayWidth, mInitialDisplayHeight); 61625132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn } 61635132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn 61645132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn try { 61655132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn mActivityManager.updateConfiguration(null); 61665132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn } catch (RemoteException e) { 61675132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn } 6168571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato 6169154db5f6358284d917d515f05d4474606b4896b2Dianne Hackborn mPolicy.systemReady(); 6170571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato 6171571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato synchronized (mWindowMap) { 6172571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato readForcedDisplaySizeLocked(); 6173571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato } 61745132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn } 61755132b37018c2445c74d930013c4bdaf75b20cabfDianne Hackborn 61766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // This is an animation that does nothing: it just immediately finishes 61776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // itself every time it is called. It is used as a stub animation in cases 61786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // where we want to synchronize multiple things that may be animating. 61796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn static final class DummyAnimation extends Animation { 61806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public boolean getTransformation(long currentTime, Transformation outTransformation) { 61816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return false; 61826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 61836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 61846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn static final Animation sDummyAnimation = new DummyAnimation(); 61856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 61869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 61876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Async Handler 61889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 61899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 61906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final class H extends Handler { 61916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int REPORT_FOCUS_CHANGE = 2; 61926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int REPORT_LOSING_FOCUS = 3; 61936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int ANIMATE = 4; 61946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int ADD_STARTING = 5; 61956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int REMOVE_STARTING = 6; 61966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int FINISHED_STARTING = 7; 61976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int REPORT_APPLICATION_TOKEN_WINDOWS = 8; 61986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int WINDOW_FREEZE_TIMEOUT = 11; 61996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int HOLD_SCREEN_CHANGED = 12; 62006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int APP_TRANSITION_TIMEOUT = 13; 62016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int PERSIST_ANIMATION_SCALE = 14; 62026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int FORCE_GC = 15; 62036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int ENABLE_SCREEN = 16; 62046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int APP_FREEZE_TIMEOUT = 17; 62056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int SEND_NEW_CONFIGURATION = 18; 62066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int REPORT_WINDOWS_CHANGE = 19; 62076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int DRAG_START_TIMEOUT = 20; 62086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int DRAG_END_TIMEOUT = 21; 62096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public static final int REPORT_HARD_KEYBOARD_STATUS_CHANGE = 22; 621006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 62119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Session mLastReportedHold; 621206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 62139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public H() { 62149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 621506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 62169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 62179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void handleMessage(Message msg) { 62189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (msg.what) { 62199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case REPORT_FOCUS_CHANGE: { 62209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState lastFocus; 62219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState newFocus; 622206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 62239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 62249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lastFocus = mLastFocus; 62259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newFocus = mCurrentFocus; 62269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lastFocus == newFocus) { 62279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Focus is not changing, so nothing to do. 62289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 62299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastFocus = newFocus; 62318a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Focus moving from " + lastFocus 62329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " to " + newFocus); 62339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newFocus != null && lastFocus != null 62349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && !newFocus.isDisplayedLw()) { 62358a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Delaying loss of focus..."); 62369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLosingFocus.add(lastFocus); 62379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lastFocus = null; 62389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 62419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lastFocus != newFocus) { 62429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //System.out.println("Changing focus from " + lastFocus 62439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " to " + newFocus); 62449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newFocus != null) { 62459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 62468a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Gaining focus: " + newFocus); 62479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newFocus.mClient.windowFocusChanged(true, mInTouchMode); 62489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 62499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ignore if process has died. 62509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62515e7833a571967d1dbc8618ac96ad6a379bcdf66aKonstantin Lopyrev notifyFocusChanged(); 62529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 62549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lastFocus != null) { 62559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 62568a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Losing focus: " + lastFocus); 62579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lastFocus.mClient.windowFocusChanged(false, mInTouchMode); 62589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 62599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ignore if process has died. 62609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6262664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato 6263664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato mPolicy.focusChanged(lastFocus, newFocus); 62649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 62669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 62679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case REPORT_LOSING_FOCUS: { 62689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<WindowState> losers; 626906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 62709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 62719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project losers = mLosingFocus; 62729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLosingFocus = new ArrayList<WindowState>(); 62739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 62759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = losers.size(); 62769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 62779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 62788a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "Losing delayed focus: " + losers.get(i)); 62799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project losers.get(i).mClient.windowFocusChanged(false, mInTouchMode); 62809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 62819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ignore if process has died. 62829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 62859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 62869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ANIMATE: { 62879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 62889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimationPending = false; 62899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 62909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 62929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 62939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ADD_STARTING: { 62949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken wtoken = (AppWindowToken)msg.obj; 62959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final StartingData sd = wtoken.startingData; 62969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 62979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sd == null) { 62989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Animation has been canceled... do nothing. 62999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 63009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 630106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 63028a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Add starting " 63039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken + ": pkg=" + sd.pkg); 630406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 63059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View view = null; 63069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 63079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view = mPolicy.addStartingWindow( 63082f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn wtoken.token, sd.pkg, sd.theme, sd.compatInfo, 63092f0b17573d4324832f7a20402a3d2b5920bc4866Dianne Hackborn sd.nonLocalizedLabel, sd.labelRes, sd.icon, sd.windowFlags); 63109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 63118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Exception when adding starting window", e); 63129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 63149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (view != null) { 63159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean abort = false; 63169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 63179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 63189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.removed || wtoken.startingData == null) { 63199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the window was successfully added, then 63209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we need to remove it. 63219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.startingWindow != null) { 63228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW) Slog.v(TAG, 63239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Aborted starting " + wtoken 63249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": removed=" + wtoken.removed 63259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " startingData=" + wtoken.startingData); 63269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingWindow = null; 63279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingData = null; 63289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project abort = true; 63299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 63319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingView = view; 63329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW && !abort) Slog.v(TAG, 63349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Added starting " + wtoken 63359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": startingWindow=" 63369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken.startingWindow + " startingView=" 63379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken.startingView); 63389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 63409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (abort) { 63419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 63429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.removeStartingWindow(wtoken.token, view); 63439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 63448a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Exception when removing starting window", e); 63459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 63499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 63509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case REMOVE_STARTING: { 63519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken wtoken = (AppWindowToken)msg.obj; 63529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder token = null; 63539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View view = null; 63549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 63558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Remove starting " 63569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken + ": startingWindow=" 63579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken.startingWindow + " startingView=" 63589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken.startingView); 63599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.startingWindow != null) { 63609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view = wtoken.startingView; 63619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token = wtoken.token; 63629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingData = null; 63639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingView = null; 63649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingWindow = null; 63659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (view != null) { 63689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 63699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.removeStartingWindow(token, view); 63709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 63718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Exception when removing starting window", e); 63729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 63759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 63769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FINISHED_STARTING: { 63779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder token = null; 63789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View view = null; 63799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (true) { 63809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 63819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mFinishedStarting.size(); 63829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N <= 0) { 63839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 63849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = mFinishedStarting.remove(N-1); 63869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 63878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_STARTING_WINDOW) Slog.v(TAG, 63889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Finished starting " + wtoken 63899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": startingWindow=" + wtoken.startingWindow 63909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " startingView=" + wtoken.startingView); 63919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 63929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.startingWindow == null) { 63939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 63949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 63969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view = wtoken.startingView; 63979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token = wtoken.token; 63989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingData = null; 63999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingView = null; 64009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.startingWindow = null; 64019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 64039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 64049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.removeStartingWindow(token, view); 64059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 64068a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Exception when removing starting window", e); 64079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 64109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 64119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case REPORT_APPLICATION_TOKEN_WINDOWS: { 64129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken wtoken = (AppWindowToken)msg.obj; 64139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 64149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean nowVisible = msg.arg1 != 0; 64159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean nowGone = msg.arg2 != 0; 64169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 64179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 64188a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY) Slog.v( 64199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Reporting visible in " + wtoken 64209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " visible=" + nowVisible 64219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " gone=" + nowGone); 64229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nowVisible) { 64239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.appToken.windowsVisible(); 64249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 64259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.appToken.windowsGone(); 64269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 64289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 643006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 64319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WINDOW_FREEZE_TIMEOUT: { 64329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 64338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Window freeze timeout expired."); 64349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = mWindows.size(); 64359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i > 0) { 64369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 6437e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 64389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mOrientationChanging) { 64399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mOrientationChanging = false; 64408a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Force clearing orientation change: " + w); 64419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 64449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 64469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 644706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 64489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case HOLD_SCREEN_CHANGED: { 64499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Session oldHold; 64509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Session newHold; 64519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 64529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project oldHold = mLastReportedHold; 64539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newHold = (Session)msg.obj; 64549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastReportedHold = newHold; 64559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 645606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 64579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldHold != newHold) { 64589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 64599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldHold != null) { 64609adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mBatteryStats.noteStopWakelock(oldHold.mUid, -1, 64619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "window", 64629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BatteryStats.WAKE_TYPE_WINDOW); 64639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newHold != null) { 64659adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mBatteryStats.noteStartWakelock(newHold.mUid, -1, 64669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "window", 64679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BatteryStats.WAKE_TYPE_WINDOW); 64689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 64709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 64739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 647406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 64759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case APP_TRANSITION_TIMEOUT: { 64769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 6477bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 64788a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 64799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "*** APP TRANSITION TIMEOUT"); 64809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTransitionReady = true; 64819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTransitionTimeout = true; 64829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 64839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 64869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 648706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 64889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PERSIST_ANIMATION_SCALE: { 64899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.System.putFloat(mContext.getContentResolver(), 64909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.System.WINDOW_ANIMATION_SCALE, mWindowAnimationScale); 64919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.System.putFloat(mContext.getContentResolver(), 64929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Settings.System.TRANSITION_ANIMATION_SCALE, mTransitionAnimationScale); 64939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 64949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 649506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 64969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FORCE_GC: { 64979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mWindowMap) { 64989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAnimationPending) { 64999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are animating, don't do the gc now but 65009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // delay a bit so we don't interrupt the animation. 65019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessageDelayed(mH.obtainMessage(H.FORCE_GC), 65029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2000); 65039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 65049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are currently rotating the display, it will 65069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // schedule a new message when done. 65079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDisplayFrozen) { 65089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 65099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Runtime.getRuntime().gc(); 65129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 65139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 651406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 65159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ENABLE_SCREEN: { 65169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performEnableScreen(); 65179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 65189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 651906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 65209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case APP_FREEZE_TIMEOUT: { 65219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 65228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "App freeze timeout expired."); 65239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = mAppTokens.size(); 65249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i > 0) { 65259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 65269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken tok = mAppTokens.get(i); 65279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tok.freezingScreen) { 65288a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Force clearing freeze: " + tok); 65299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsetAppFreezingScreenLocked(tok, true, true); 65309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 65349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 653506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6536e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn case SEND_NEW_CONFIGURATION: { 6537e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn removeMessages(SEND_NEW_CONFIGURATION); 6538e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn sendNewConfiguration(); 6539c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project break; 6540c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 654106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 65426e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev case REPORT_WINDOWS_CHANGE: { 6543dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev if (mWindowsChanged) { 6544dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev synchronized (mWindowMap) { 6545dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = false; 6546dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 6547dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev notifyWindowsChanged(); 6548dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 6549dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev break; 6550dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 6551dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev 6552a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate case DRAG_START_TIMEOUT: { 6553a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate IBinder win = (IBinder)msg.obj; 6554a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (DEBUG_DRAG) { 6555a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate Slog.w(TAG, "Timeout starting drag by win " + win); 6556a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 6557a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate synchronized (mWindowMap) { 6558a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate // !!! TODO: ANR the app that has failed to start the drag in time 6559a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate if (mDragState != null) { 6560d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate mDragState.unregister(); 65612e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(true /*force*/); 6562a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate mDragState.reset(); 6563a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate mDragState = null; 6564a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 6565a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 6566d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate break; 6567a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate } 6568a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate 6569d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate case DRAG_END_TIMEOUT: { 6570d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate IBinder win = (IBinder)msg.obj; 6571d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate if (DEBUG_DRAG) { 6572d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate Slog.w(TAG, "Timeout ending drag to win " + win); 6573d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate } 6574d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate synchronized (mWindowMap) { 6575d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate // !!! TODO: ANR the drag-receiving app 6576d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate mDragState.mDragResult = false; 6577d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate mDragState.endDragLw(); 6578d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate } 6579d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate break; 6580d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate } 65812992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 65822992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown case REPORT_HARD_KEYBOARD_STATUS_CHANGE: { 65832992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown notifyHardKeyboardStatusChange(); 65842992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown break; 65852992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 65869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 65909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 65919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // IWindowManager API 65929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 65939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 65949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public IWindowSession openSession(IInputMethodClient client, 65959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IInputContext inputContext) { 65969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (client == null) throw new IllegalArgumentException("null client"); 65979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (inputContext == null) throw new IllegalArgumentException("null inputContext"); 65986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn Session session = new Session(this, client, inputContext); 659946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown return session; 66009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 66029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean inputMethodClientHasFocus(IInputMethodClient client) { 66039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { 66049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The focus for the client is the window immediately below 66059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // where we would place the input method window. 66069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int idx = findDesiredInputMethodWindowIndexLocked(false); 66079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState imFocus; 66089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (idx > 0) { 6609e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown imFocus = mWindows.get(idx-1); 6610e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn //Log.i(TAG, "Desired input method target: " + imFocus); 6611e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn //Log.i(TAG, "Current focus: " + this.mCurrentFocus); 6612e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn //Log.i(TAG, "Last focus: " + this.mLastFocus); 66139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imFocus != null) { 6614e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // This may be a starting window, in which case we still want 6615e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // to count it as okay. 6616e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (imFocus.mAttrs.type == LayoutParams.TYPE_APPLICATION_STARTING 6617e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn && imFocus.mAppToken != null) { 6618e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // The client has definitely started, so it really should 6619e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // have a window in this app token. Let's look for it. 6620e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn for (int i=0; i<imFocus.mAppToken.windows.size(); i++) { 6621e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn WindowState w = imFocus.mAppToken.windows.get(i); 6622e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (w != imFocus) { 6623e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn //Log.i(TAG, "Switching to real app window: " + w); 6624e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn imFocus = w; 6625e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn break; 6626e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn } 6627e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn } 6628e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn } 6629e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn //Log.i(TAG, "IM target client: " + imFocus.mSession.mClient); 6630e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn //if (imFocus.mSession.mClient != null) { 6631e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // Log.i(TAG, "IM target client binder: " + imFocus.mSession.mClient.asBinder()); 6632e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // Log.i(TAG, "Requesting client binder: " + client.asBinder()); 6633e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn //} 66349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imFocus.mSession.mClient != null && 66359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imFocus.mSession.mClient.asBinder() == client.asBinder()) { 66369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 66379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6638e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn 6639e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // Okay, how about this... what is the current focus? 6640e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // It seems in some cases we may not have moved the IM 6641e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // target window, such as when it was in a pop-up window, 6642e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // so let's also look at the current focus. (An example: 6643e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // go to Gmail, start searching so the keyboard goes up, 6644e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // press home. Sometimes the IME won't go down.) 6645e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // Would be nice to fix this more correctly, but it's 6646e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn // way at the end of a release, and this should be good enough. 6647e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn if (mCurrentFocus != null && mCurrentFocus.mSession.mClient != null && 6648e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn mCurrentFocus.mSession.mClient.asBinder() == client.asBinder()) { 6649e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn return true; 6650e75d87266b59fc76cfb1b9bbc9a4734b8fd1664fDianne Hackborn } 66519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 66559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 665606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 665744bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn public void getDisplaySize(Point size) { 665844bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn synchronized(mWindowMap) { 665981e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn size.x = mAppDisplayWidth; 666081e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn size.y = mAppDisplayHeight; 666144bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn } 666244bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn } 666344bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn 6664bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown public void getRealDisplaySize(Point size) { 6665bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown synchronized(mWindowMap) { 6666bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown size.x = mCurDisplayWidth; 6667bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown size.y = mCurDisplayHeight; 6668bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown } 66697d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 66707d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 66717d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn public void getInitialDisplaySize(Point size) { 66727d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn synchronized(mWindowMap) { 66737d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn size.x = mInitialDisplayWidth; 66747d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn size.y = mInitialDisplayHeight; 66757d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 6676bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown } 6677bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown 667844bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn public int getMaximumSizeDimension() { 667944bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn synchronized(mWindowMap) { 668044bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn // Do this based on the raw screen size, until we are smarter. 66817916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn return mBaseDisplayWidth > mBaseDisplayHeight 66827916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn ? mBaseDisplayWidth : mBaseDisplayHeight; 66837916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 66847916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 66857916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 66867916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn public void setForcedDisplaySize(int longDimen, int shortDimen) { 66877916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn synchronized(mWindowMap) { 66887916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn int width, height; 66897916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (mInitialDisplayWidth < mInitialDisplayHeight) { 66907916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn width = shortDimen < mInitialDisplayWidth 66917916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn ? shortDimen : mInitialDisplayWidth; 66927916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn height = longDimen < mInitialDisplayHeight 66937916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn ? longDimen : mInitialDisplayHeight; 66947916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } else { 66957916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn width = longDimen < mInitialDisplayWidth 66967916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn ? longDimen : mInitialDisplayWidth; 66977916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn height = shortDimen < mInitialDisplayHeight 66987916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn ? shortDimen : mInitialDisplayHeight; 66997916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 67007916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn setForcedDisplaySizeLocked(width, height); 6701571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato Settings.Secure.putString(mContext.getContentResolver(), 6702571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato Settings.Secure.DISPLAY_SIZE_FORCED, width + "," + height); 67037916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 67047916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 67057916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 67067916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn private void rebuildBlackFrame(boolean inTransaction) { 67077916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (!inTransaction) { 67087916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, 67097916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn ">>> OPEN TRANSACTION rebuildBlackFrame"); 67107916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn Surface.openTransaction(); 67117916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 67127916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn try { 67137916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (mBlackFrame != null) { 67147916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mBlackFrame.kill(); 67157916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mBlackFrame = null; 67167916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 67177916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (mBaseDisplayWidth < mInitialDisplayWidth 67187916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn || mBaseDisplayHeight < mInitialDisplayHeight) { 67198f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn int initW, initH, baseW, baseH; 67208f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn final boolean rotated = (mRotation == Surface.ROTATION_90 67218f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn || mRotation == Surface.ROTATION_270); 67228f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn if (rotated) { 67238f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn initW = mInitialDisplayHeight; 67248f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn initH = mInitialDisplayWidth; 67258f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn baseW = mBaseDisplayHeight; 67268f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn baseH = mBaseDisplayWidth; 67278f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn } else { 67288f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn initW = mInitialDisplayWidth; 67298f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn initH = mInitialDisplayHeight; 67308f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn baseW = mBaseDisplayWidth; 67318f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn baseH = mBaseDisplayHeight; 67328f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn } 67338f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn Rect outer = new Rect(0, 0, initW, initH); 67348f7c271ac9daa35708246bf279f71db5ff103b58Dianne Hackborn Rect inner = new Rect(0, 0, baseW, baseH); 67357916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn try { 67367916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mBlackFrame = new BlackFrame(mFxSession, outer, inner, MASK_LAYER); 67377916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } catch (Surface.OutOfResourcesException e) { 67387916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 67397916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 67407916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } finally { 67417916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (!inTransaction) { 67427916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn Surface.closeTransaction(); 67437916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, 67447916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn "<<< CLOSE TRANSACTION rebuildBlackFrame"); 67457916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 67467916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 67477916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 67487916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 6749571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato private void readForcedDisplaySizeLocked() { 6750571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato final String str = Settings.Secure.getString(mContext.getContentResolver(), 6751571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato Settings.Secure.DISPLAY_SIZE_FORCED); 6752571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato if (str == null || str.length() == 0) { 6753571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato return; 6754571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato } 6755571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato final int pos = str.indexOf(','); 6756571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato if (pos <= 0 || str.lastIndexOf(',') != pos) { 6757571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato return; 6758571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato } 6759571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato int width, height; 6760571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato try { 6761571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato width = Integer.parseInt(str.substring(0, pos)); 6762571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato height = Integer.parseInt(str.substring(pos+1)); 6763571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato } catch (NumberFormatException ex) { 6764571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato return; 6765571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato } 6766571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato setForcedDisplaySizeLocked(width, height); 6767571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato } 6768571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato 67697916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn private void setForcedDisplaySizeLocked(int width, int height) { 6770571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato Slog.i(TAG, "Using new display size: " + width + "x" + height); 6771571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato 67727916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mBaseDisplayWidth = width; 67737916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mBaseDisplayHeight = height; 67747916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mPolicy.setInitialDisplaySize(mBaseDisplayWidth, mBaseDisplayHeight); 67757916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 67767916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mLayoutNeeded = true; 67777916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 67787916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn boolean configChanged = updateOrientationFromAppTokensLocked(false); 67797916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mTempConfiguration.setToDefaults(); 67807916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mTempConfiguration.fontScale = mCurConfiguration.fontScale; 67817916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (computeNewConfigurationLocked(mTempConfiguration)) { 67827916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (mCurConfiguration.diff(mTempConfiguration) != 0) { 67837916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn configChanged = true; 67847916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 67857916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 67867916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 67877916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (configChanged) { 67887916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mWaitingForConfig = true; 67897916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn startFreezingDisplayLocked(false); 67907916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION); 67917916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 67927916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 67937916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn rebuildBlackFrame(false); 67947916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 67957916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn performLayoutAndPlaceSurfacesLocked(); 67967916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 67977916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 67987916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn public void clearForcedDisplaySize() { 67997916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn synchronized(mWindowMap) { 68007916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn setForcedDisplaySizeLocked(mInitialDisplayWidth, mInitialDisplayHeight); 6801571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato Settings.Secure.putString(mContext.getContentResolver(), 6802571ae90801d943a4c0c8897d1cf74c9cfe04b1ecJoe Onorato Settings.Secure.DISPLAY_SIZE_FORCED, ""); 680344bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn } 680444bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn } 680544bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn 680681e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn public boolean canStatusBarHide() { 680781e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn return mPolicy.canStatusBarHide(); 680881e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn } 680981e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn 68109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 68119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Internals 68129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ------------------------------------------------------------- 68139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6814e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn final WindowState windowForClientLocked(Session session, IWindow client, 6815e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean throwOnError) { 6816e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return windowForClientLocked(session, client.asBinder(), throwOnError); 68179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 681806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 6819e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn final WindowState windowForClientLocked(Session session, IBinder client, 6820e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean throwOnError) { 68219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = mWindowMap.get(client); 68228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v( 68239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Looking up client " + client + ": " + win); 68249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win == null) { 6825e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn RuntimeException ex = new IllegalArgumentException( 6826e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn "Requested window " + client + " does not exist"); 6827e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (throwOnError) { 6828e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn throw ex; 6829e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 68308a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Failed looking up window", ex); 68319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 68329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (session != null && win.mSession != session) { 6834e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn RuntimeException ex = new IllegalArgumentException( 6835e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn "Requested window " + client + " is in session " + 6836e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn win.mSession + ", not " + session); 6837e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (throwOnError) { 6838e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn throw ex; 6839e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 68408a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Failed looking up window", ex); 68419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 68429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 68449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return win; 68459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6847a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn final void rebuildAppWindowListLocked() { 6848a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn int NW = mWindows.size(); 6849a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn int i; 68503b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn int lastWallpaper = -1; 68519bfb707597898f54722460b48588007b682f3e2aDianne Hackborn int numRemoved = 0; 6852ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 6853f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (mRebuildTmp.length < NW) { 6854f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn mRebuildTmp = new WindowState[NW+10]; 6855f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 6856f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn 6857a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // First remove all existing app windows. 6858a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn i=0; 6859a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn while (i < NW) { 6860e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 68613b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (w.mAppToken != null) { 6862e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState win = mWindows.remove(i); 6863f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn win.mRebuilding = true; 6864f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn mRebuildTmp[numRemoved] = win; 6865dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev mWindowsChanged = true; 68668a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, 6867bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn "Rebuild removing window: " + win); 6868a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn NW--; 68699bfb707597898f54722460b48588007b682f3e2aDianne Hackborn numRemoved++; 6870a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn continue; 68713b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_WALLPAPER 68723b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn && lastWallpaper == i-1) { 68733b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn lastWallpaper = i; 6874a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 6875a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn i++; 6876a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 6877ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 68783b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // The wallpaper window(s) typically live at the bottom of the stack, 68793b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // so skip them before adding app tokens. 68803b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn lastWallpaper++; 68813b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn i = lastWallpaper; 6882ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 6883bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn // First add all of the exiting app tokens... these are no longer 6884bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn // in the main app list, but still have windows shown. We put them 6885bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn // in the back because now that the animation is over we no longer 6886bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn // will care about them. 6887bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn int NT = mExitingAppTokens.size(); 6888a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn for (int j=0; j<NT; j++) { 6889bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn i = reAddAppWindowsLocked(i, mExitingAppTokens.get(j)); 6890bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn } 6891ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 6892bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn // And add in the still active app tokens in Z order. 6893bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn NT = mAppTokens.size(); 6894bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn for (int j=0; j<NT; j++) { 6895bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn i = reAddAppWindowsLocked(i, mAppTokens.get(j)); 6896a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 6897ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 68983b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn i -= lastWallpaper; 68999bfb707597898f54722460b48588007b682f3e2aDianne Hackborn if (i != numRemoved) { 69008a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Rebuild removed " + numRemoved 69019bfb707597898f54722460b48588007b682f3e2aDianne Hackborn + " windows but added " + i); 6902f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn for (i=0; i<numRemoved; i++) { 6903f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn WindowState ws = mRebuildTmp[i]; 6904f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (ws.mRebuilding) { 6905f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn StringWriter sw = new StringWriter(); 6906f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn PrintWriter pw = new PrintWriter(sw); 6907a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn ws.dump(pw, "", true); 6908f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn pw.flush(); 6909f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn Slog.w(TAG, "This window was lost: " + ws); 6910f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn Slog.w(TAG, sw.toString()); 6911f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 6912f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 6913f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn Slog.w(TAG, "Current app token list:"); 6914f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn dumpAppTokensLocked(); 6915f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn Slog.w(TAG, "Final window list:"); 6916f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn dumpWindowsLocked(); 69179bfb707597898f54722460b48588007b682f3e2aDianne Hackborn } 6918a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 6919ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 69209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final void assignLayersLocked() { 69219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = mWindows.size(); 69229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int curBaseLayer = 0; 69239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int curLayer = 0; 69249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 692506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 69266c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (DEBUG_LAYERS) { 69276c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn RuntimeException here = new RuntimeException("here"); 69286c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn here.fillInStackTrace(); 69296c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn Log.v(TAG, "Assigning layers", here); 69306c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn } 69316c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn 69329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 6933e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 69347341d7a104b47996445d069a695e155a07184606Dianne Hackborn if (w.mBaseLayer == curBaseLayer || w.mIsImWindow 69357341d7a104b47996445d069a695e155a07184606Dianne Hackborn || (i > 0 && w.mIsWallpaper)) { 69369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curLayer += WINDOW_LAYER_MULTIPLIER; 69379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLayer = curLayer; 69389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 69399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curBaseLayer = curLayer = w.mBaseLayer; 69409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLayer = curLayer; 69419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mTargetAppToken != null) { 69439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mAnimLayer = w.mLayer + w.mTargetAppToken.animLayerAdjustment; 69449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (w.mAppToken != null) { 69459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mAnimLayer = w.mLayer + w.mAppToken.animLayerAdjustment; 69469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 69479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mAnimLayer = w.mLayer; 69489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mIsImWindow) { 69509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mAnimLayer += mInputMethodAnimLayerAdjustment; 6951759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn } else if (w.mIsWallpaper) { 6952759a39e8d2a8b27ef07e102394629dce68aa186bDianne Hackborn w.mAnimLayer += mWallpaperAnimLayerAdjustment; 69539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69548a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYERS) Slog.v(TAG, "Assign layer " + w + ": " 69559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + w.mAnimLayer); 69569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //System.out.println( 69579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // "Assigned layer " + curLayer + " to " + w.mClient.asBinder()); 69589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 69619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mInLayout = false; 69629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final void performLayoutAndPlaceSurfacesLocked() { 69639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInLayout) { 6964cfe6524071624b6679e5fa4db847328e8d0317c8Dave Bort if (DEBUG) { 69659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Recursive call!"); 69669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69678a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "performLayoutAndPlaceSurfacesLocked called while in layout"); 69689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 69699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6971e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (mWaitingForConfig) { 6972e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // Our configuration has changed (most likely rotation), but we 6973e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // don't yet have the complete configuration to report to 6974e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn // applications. Don't do any window layout until we have it. 6975e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return; 6976e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 6977e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 6978ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn if (mDisplay == null) { 6979ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn // Not yet initialized, nothing to do. 6980ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn return; 6981ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 6982ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 69832e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn mInLayout = true; 69849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean recoveringMemory = false; 69852e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn 69862e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn try { 69872e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn if (mForceRemoves != null) { 69882e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn recoveringMemory = true; 6989f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn // Wait a little bit for things to settle down, and off we go. 69902e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn for (int i=0; i<mForceRemoves.size(); i++) { 69912e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn WindowState ws = mForceRemoves.get(i); 69922e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn Slog.i(TAG, "Force removing: " + ws); 69932e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn removeWindowInnerLocked(ws.mSession, ws); 69942e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn } 69952e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn mForceRemoves = null; 69962e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn Slog.w(TAG, "Due to memory failure, waiting a bit for next layout"); 69972e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn Object tmp = new Object(); 69982e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn synchronized (tmp) { 69992e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn try { 70002e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn tmp.wait(250); 70012e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn } catch (InterruptedException e) { 70022e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn } 70039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 70049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 70052e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn } catch (RuntimeException e) { 70062e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn Slog.e(TAG, "Unhandled exception while force removing for memory", e); 70079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 70082e7ffa54c1c0875663ffce2979cc097428b95ac4Dianne Hackborn 70099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 70109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLockedInner(recoveringMemory); 701106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 7012f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn int N = mPendingRemove.size(); 7013f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (N > 0) { 7014f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (mPendingRemoveTmp.length < N) { 7015f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn mPendingRemoveTmp = new WindowState[N+10]; 70169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7017f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn mPendingRemove.toArray(mPendingRemoveTmp); 70189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPendingRemove.clear(); 7019f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn for (int i=0; i<N; i++) { 7020f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn WindowState w = mPendingRemoveTmp[i]; 7021f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn removeWindowInnerLocked(w.mSession, w); 7022f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn } 70239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 70249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInLayout = false; 70259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assignLayersLocked(); 70269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 70279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performLayoutAndPlaceSurfacesLocked(); 70289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 70299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 70309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInLayout = false; 70319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLayoutNeeded) { 70329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestAnimationLocked(0); 70339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 70349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7035dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev if (mWindowsChanged && !mWindowChangeListeners.isEmpty()) { 70366e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev mH.removeMessages(H.REPORT_WINDOWS_CHANGE); 70376e0f65fd9c8bea91d9143f77a85b6d9c097fb3f1Konstantin Lopyrev mH.sendMessage(mH.obtainMessage(H.REPORT_WINDOWS_CHANGE)); 7038dc30101ff86648c6665bf9d4579869f5badfc2f2Konstantin Lopyrev } 70399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 70409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInLayout = false; 70418a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.e(TAG, "Unhandled exception while layout out windows", e); 70429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 70439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 70449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 70453a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown private final int performLayoutLockedInner(boolean initial, boolean updateInputWindows) { 7046b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (!mLayoutNeeded) { 7047b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn return 0; 7048b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7049b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 7050b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mLayoutNeeded = false; 7051b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 705244bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn final int dw = mCurDisplayWidth; 705344bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn final int dh = mCurDisplayHeight; 70549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 70559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mWindows.size(); 70569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 70579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 70588a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_LAYOUT) Slog.v(TAG, "performLayout: needed=" 70599b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn + mLayoutNeeded + " dw=" + dw + " dh=" + dh); 70609b52a2184e99565bcd7f77effb321c95a2a4837eDianne Hackborn 7061b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mPolicy.beginLayoutLw(dw, dh); 706206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 7063b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn int seq = mLayoutSeq+1; 7064b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (seq < 0) seq = 0; 7065b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mLayoutSeq = seq; 7066b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 7067b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // First perform layout of any root windows (not attached 7068b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // to another window). 7069b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn int topAttached = -1; 7070b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn for (i = N-1; i >= 0; i--) { 7071e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState win = mWindows.get(i); 7072b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 7073b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // Don't do layout of a window if it is not visible, or 7074b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // soon won't be visible, to avoid wasting time and funky 7075b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // changes while a window is animating away. 7076b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn final AppWindowToken atoken = win.mAppToken; 7077b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn final boolean gone = win.mViewVisibility == View.GONE 7078b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn || !win.mRelayoutCalled 7079ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn || (atoken == null && win.mRootToken.hidden) 7080b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn || (atoken != null && atoken.hiddenRequested) 7081b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn || win.mAttachedHidden 7082b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn || win.mExiting || win.mDestroying; 7083b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 70841c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn if (DEBUG_LAYOUT && !win.mLayoutAttached) { 70851c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn Slog.v(TAG, "First pass " + win 7086b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + ": gone=" + gone + " mHaveFrame=" + win.mHaveFrame 7087b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + " mLayoutAttached=" + win.mLayoutAttached); 70881c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn if (gone) Slog.v(TAG, " (mViewVisibility=" 7089b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mViewVisibility + " mRelayoutCalled=" 7090b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mRelayoutCalled + " hidden=" 7091b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mRootToken.hidden + " hiddenRequested=" 7092b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + (atoken != null && atoken.hiddenRequested) 7093b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + " mAttachedHidden=" + win.mAttachedHidden); 7094b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7095e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 7096b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // If this view is GONE, then skip it -- keep the current 7097b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // frame, and let the caller know so they can ignore it 7098b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // if they want. (We do the normal layout for INVISIBLE 7099b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // windows, since that means "perform layout as normal, 7100b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // just don't display"). 7101b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (!gone || !win.mHaveFrame) { 7102e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (!win.mLayoutAttached) { 71038e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn if (initial) { 71040f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial"); 71058e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn win.mContentChanged = false; 71068e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn } 7107e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn win.prelayout(); 7108b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mPolicy.layoutWindowLw(win, win.mAttrs, null); 7109b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn win.mLayoutSeq = seq; 7110b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (DEBUG_LAYOUT) Slog.v(TAG, "-> mFrame=" 7111b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mFrame + " mContainingFrame=" 7112b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mContainingFrame + " mDisplayFrame=" 7113b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mDisplayFrame); 7114b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } else { 7115b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (topAttached < 0) topAttached = i; 71169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 71179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7118b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 711906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 7120b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // Now perform layout of attached windows, which usually 7121b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // depend on the position of the window they are attached to. 7122b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // XXX does not deal with windows that are attached to windows 7123b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // that are themselves attached. 7124b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn for (i = topAttached; i >= 0; i--) { 7125e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState win = mWindows.get(i); 71269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7127b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (win.mLayoutAttached) { 7128b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (DEBUG_LAYOUT) Slog.v(TAG, "Second pass " + win 7129b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + " mHaveFrame=" + win.mHaveFrame 7130b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + " mViewVisibility=" + win.mViewVisibility 7131b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + " mRelayoutCalled=" + win.mRelayoutCalled); 71321c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn // If this view is GONE, then skip it -- keep the current 71331c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn // frame, and let the caller know so they can ignore it 71341c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn // if they want. (We do the normal layout for INVISIBLE 71351c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn // windows, since that means "perform layout as normal, 71361c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn // just don't display"). 7137b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if ((win.mViewVisibility != View.GONE && win.mRelayoutCalled) 7138b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn || !win.mHaveFrame) { 71398e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn if (initial) { 71400f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial"); 71418e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn win.mContentChanged = false; 71428e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn } 7143e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn win.prelayout(); 7144b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mPolicy.layoutWindowLw(win, win.mAttrs, win.mAttachedWindow); 7145b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn win.mLayoutSeq = seq; 7146b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (DEBUG_LAYOUT) Slog.v(TAG, "-> mFrame=" 7147b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mFrame + " mContainingFrame=" 7148b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mContainingFrame + " mDisplayFrame=" 7149b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + win.mDisplayFrame); 71509bfb707597898f54722460b48588007b682f3e2aDianne Hackborn } 7151958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn } 71529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7153349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 7154349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // Window frames may have changed. Tell the input dispatcher about it. 71553a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown mInputMonitor.setUpdateInputWindowsNeededLw(); 71563a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown if (updateInputWindows) { 71572e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(false /*force*/); 71583a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown } 7159b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 7160b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn return mPolicy.finishLayoutLw(); 71619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 716206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 71636804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick // "Something has changed! Let's make it correct now." 71649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final void performLayoutAndPlaceSurfacesLockedInner( 71659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean recoveringMemory) { 716634bcebca707187393263183aa4dab32728763f2fJoe Onorato if (mDisplay == null) { 716734bcebca707187393263183aa4dab32728763f2fJoe Onorato Slog.i(TAG, "skipping performLayoutAndPlaceSurfacesLockedInner with no mDisplay"); 716834bcebca707187393263183aa4dab32728763f2fJoe Onorato return; 716934bcebca707187393263183aa4dab32728763f2fJoe Onorato } 717034bcebca707187393263183aa4dab32728763f2fJoe Onorato 71719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long currentTime = SystemClock.uptimeMillis(); 7172dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn final int dw = mCurDisplayWidth; 7173dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn final int dh = mCurDisplayHeight; 717481e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn final int innerDw = mAppDisplayWidth; 717581e56d535c853d73ff537357da5b935f51cb779dDianne Hackborn final int innerDh = mAppDisplayHeight; 7176e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn 71779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 71789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7179b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn if (mFocusMayChange) { 7180b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn mFocusMayChange = false; 71813a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, 71823a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/); 7183b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn } 7184b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn 71859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Initialize state of exiting tokens. 71869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=mExitingTokens.size()-1; i>=0; i--) { 71879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExitingTokens.get(i).hasVisible = false; 71889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 71899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 71909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Initialize state of exiting applications. 71919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=mExitingAppTokens.size()-1; i>=0; i--) { 71929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExitingAppTokens.get(i).hasVisible = false; 71939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 71949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 71959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean orientationChangeComplete = true; 71969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Session holdScreen = null; 71979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float screenBrightness = -1; 7198fb73f79340375013225618a5d87f46b958f698efMike Lockwood float buttonBrightness = -1; 71999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean focusDisplayed = false; 72009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean animating = false; 7201fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn boolean createWatermark = false; 720289ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn boolean updateRotation = false; 720350660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn boolean screenRotationFinished = false; 7204fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn 7205fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn if (mFxSession == null) { 7206fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn mFxSession = new SurfaceSession(); 7207fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn createWatermark = true; 7208fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 7209fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn 721094cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION performLayoutAndPlaceSurfaces"); 72119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 72129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Surface.openTransaction(); 7213fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn 7214fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn if (createWatermark) { 7215fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn createWatermark(); 7216fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 7217fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn if (mWatermark != null) { 7218fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn mWatermark.positionSurface(dw, dh); 7219fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 72206804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick if (mStrictModeFlash != null) { 72216804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick mStrictModeFlash.positionSurface(dw, dh); 72226804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick } 7223fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn 72249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7225de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn boolean wallpaperForceHidingChanged = false; 7226b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn int repeats = 0; 7227b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn int changes = 0; 7228b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 72299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 7230b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn repeats++; 7231b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (repeats > 6) { 7232b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn Slog.w(TAG, "Animation repeat aborted after too many iterations"); 7233b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mLayoutNeeded = false; 7234b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn break; 7235b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7236b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 7237b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if ((changes&(WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER 7238b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn | WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG 7239b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn | WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT)) != 0) { 7240b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) { 7241b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if ((adjustWallpaperWindowsLocked()&ADJUST_WALLPAPER_LAYERS_CHANGED) != 0) { 7242b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn assignLayersLocked(); 7243b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mLayoutNeeded = true; 7244b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7245b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7246b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG) != 0) { 7247b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (DEBUG_LAYOUT) Slog.v(TAG, "Computing new config from layout"); 724894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (updateOrientationFromAppTokensLocked(true)) { 7249b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mLayoutNeeded = true; 7250b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION); 7251b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7252b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7253b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT) != 0) { 7254b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn mLayoutNeeded = true; 7255b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7256b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7257b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 7258b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // FIRST LOOP: Perform a layout, if needed. 7259b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (repeats < 4) { 72603a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown changes = performLayoutLockedInner(repeats == 0, false /*updateInputWindows*/); 7261b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (changes != 0) { 7262b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn continue; 7263b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7264b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } else { 7265b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn Slog.w(TAG, "Layout repeat skipped after too many iterations"); 7266b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes = 0; 7267b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } 7268b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 72699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int transactionSequence = ++mTransactionSequence; 72709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 72719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Update animations of all applications, including those 72729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // associated with exiting/removed apps 72739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean tokensAnimating = false; 72749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NAT = mAppTokens.size(); 72759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<NAT; i++) { 7276e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if (mAppTokens.get(i).stepAnimationLocked(currentTime, 7277e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn innerDw, innerDh)) { 72789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tokensAnimating = true; 72799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 72809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 72819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NEAT = mExitingAppTokens.size(); 72829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<NEAT; i++) { 7283e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if (mExitingAppTokens.get(i).stepAnimationLocked(currentTime, 7284e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn innerDw, innerDh)) { 72859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tokensAnimating = true; 72869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 72879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 72889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7289b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn // SECOND LOOP: Execute animations and update visibility of windows. 7290b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn 72918a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "*** ANIM STEP: seq=" 7292de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn + transactionSequence + " tokensAnimating=" 7293de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn + tokensAnimating); 7294de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn 72959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project animating = tokensAnimating; 72969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7297f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn if (mScreenRotationAnimation != null) { 7298f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn if (mScreenRotationAnimation.isAnimating()) { 7299f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn if (mScreenRotationAnimation.stepAnimation(currentTime)) { 7300f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn animating = true; 7301f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } else { 730250660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn screenRotationFinished = true; 730389ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn updateRotation = true; 7304f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } 7305f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } 7306f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } 7307f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn 73089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean tokenMayBeDrawn = false; 73096c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn boolean wallpaperMayChange = false; 7310b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn boolean forceHiding = false; 73116c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn WindowState windowDetachedWallpaper = null; 7312de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn WindowState windowAnimationBackground = null; 7313de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn int windowAnimationBackgroundColor = 0; 73149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 73159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.beginAnimationLw(dw, dh); 73169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7317bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn final int N = mWindows.size(); 7318ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 73199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=N-1; i>=0; i--) { 7320e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 73219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 73229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowManager.LayoutParams attrs = w.mAttrs; 73239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 73249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mSurface != null) { 73258e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn // Take care of the window being ready to display. 73266c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn if (w.commitFinishDrawingLocked(currentTime)) { 73276c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn if ((w.mAttrs.flags 73286c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) { 73298a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 73300586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn "First draw done in potential wallpaper target " + w); 73316c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn wallpaperMayChange = true; 73326c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn } 73336c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn } 7334ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 73356c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn final boolean wasAnimating = w.mAnimating; 73368e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn 7337e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn int animDw = innerDw; 7338e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn int animDh = innerDh; 73398e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn 73408e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn // If the window has moved due to its containing 73418e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn // content frame changing, then we'd like to animate 73428e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn // it. The checks here are ordered by what is least 73433fe7f2f2e35692fe563ae00f62995030f1987c4fJoe Onorato // likely to be true first. 73441c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn if (w.shouldAnimateMove()) { 73458e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn // Frame has moved, containing content frame 73468e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn // has also moved, and we're not currently animating... 73478e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn // let's do something. 73488e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn Animation a = AnimationUtils.loadAnimation(mContext, 73498e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn com.android.internal.R.anim.window_move_from_decor); 73508e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn w.setAnimation(a); 73518e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn animDw = w.mLastFrame.left - w.mFrame.left; 73528e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn animDh = w.mLastFrame.top - w.mFrame.top; 73538e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn } 73548e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn 73558e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn // Execute animation. 73568e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn final boolean nowAnimating = w.stepAnimationLocked(currentTime, 73578e11ef0d949a52fec15359ec35557b2e773b093dDianne Hackborn animDw, animDh); 73586c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn 73596c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // If this window is animating, make a note that we have 73606c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // an animating window and take care of a request to run 73616c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // a detached wallpaper animation. 73626c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (nowAnimating) { 7363de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (w.mAnimation != null) { 7364de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (w.mAnimation.getDetachWallpaper()) { 7365de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn windowDetachedWallpaper = w; 7366de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 7367de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (w.mAnimation.getBackgroundColor() != 0) { 7368de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn windowAnimationBackground = w; 7369de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn windowAnimationBackgroundColor = 7370de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn w.mAnimation.getBackgroundColor(); 7371de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 73726c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn } 73739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project animating = true; 73749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 73756c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn 73766c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // If this window's app token is running a detached wallpaper 73776c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // animation, make a note so we can ensure the wallpaper is 73786c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn // displayed behind it. 7379de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (w.mAppToken != null && w.mAppToken.animation != null) { 7380de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (w.mAppToken.animation.getDetachWallpaper()) { 7381de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn windowDetachedWallpaper = w; 7382de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 7383de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (w.mAppToken.animation.getBackgroundColor() != 0) { 7384de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn windowAnimationBackground = w; 7385de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn windowAnimationBackgroundColor = 7386de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn w.mAppToken.animation.getBackgroundColor(); 7387de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 73886c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn } 73896c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn 73906136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn if (wasAnimating && !w.mAnimating && mWallpaperTarget == w) { 73916136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn wallpaperMayChange = true; 73926136b7ef169a65a02a6660be636fcec370c68145Dianne Hackborn } 7393ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 73943b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (mPolicy.doesForceHide(w, attrs)) { 73956c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (!wasAnimating && nowAnimating) { 739620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (DEBUG_VISIBILITY) Slog.v(TAG, 73976c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn "Animation started that could impact force hide: " 739820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn + w); 73993b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn wallpaperForceHidingChanged = true; 7400b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn mFocusMayChange = true; 74013b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else if (w.isReadyForDisplay() && w.mAnimation == null) { 74023b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn forceHiding = true; 74033b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 74043b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else if (mPolicy.canBeForceHidden(w, attrs)) { 74053b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn boolean changed; 74063b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (forceHiding) { 74073b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn changed = w.hideLw(false, false); 740820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (DEBUG_VISIBILITY && changed) Slog.v(TAG, 740920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn "Now policy hidden: " + w); 74103b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else { 74113b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn changed = w.showLw(false, false); 741220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (DEBUG_VISIBILITY && changed) Slog.v(TAG, 741320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn "Now policy shown: " + w); 741420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (changed) { 741520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (wallpaperForceHidingChanged 7416b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn && w.isVisibleNow() /*w.isReadyForDisplay()*/) { 741720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn // Assume we will need to animate. If 741820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn // we don't (because the wallpaper will 741920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn // stay with the lock screen), then we will 742020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn // clean up later. 742120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn Animation a = mPolicy.createForceHideEnterAnimation(); 742220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (a != null) { 742320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn w.setAnimation(a); 742420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn } 742520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn } 742620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (mCurrentFocus == null || 742720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn mCurrentFocus.mLayer < w.mLayer) { 742820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn // We are showing on to of the current 742920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn // focus, so re-evaluate focus to make 743020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn // sure it is correct. 743120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn mFocusMayChange = true; 74323b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 74333b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 74343b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 74353b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (changed && (attrs.flags 74363b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) { 74373b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn wallpaperMayChange = true; 74383b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 74393b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 7440ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 74419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPolicy.animatingWindowLw(w, attrs); 74429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 74449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AppWindowToken atoken = w.mAppToken; 74459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken != null && (!atoken.allDrawn || atoken.freezingScreen)) { 74469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (atoken.lastTransactionSequence != transactionSequence) { 74479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.lastTransactionSequence = transactionSequence; 74489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.numInterestingWindows = atoken.numDrawnWindows = 0; 74499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.startingDisplayed = false; 74509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((w.isOnScreen() || w.mAttrs.type 74529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project == WindowManager.LayoutParams.TYPE_BASE_APPLICATION) 74539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && !w.mExiting && !w.mDestroying) { 74549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) { 74558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Eval win " + w + ": isDrawn=" 74567433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn + w.isDrawnLw() 74579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", isAnimating=" + w.isAnimating()); 74587433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn if (!w.isDrawnLw()) { 74598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "Not displayed: s=" + w.mSurface 74609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " pv=" + w.mPolicyVisibility 74619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " dp=" + w.mDrawPending 74629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " cdp=" + w.mCommitDrawPending 74639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " ah=" + w.mAttachedHidden 74649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " th=" + atoken.hiddenRequested 74659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " a=" + w.mAnimating); 74669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w != atoken.startingWindow) { 74699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!atoken.freezingScreen || !w.mAppFreezing) { 74709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.numInterestingWindows++; 74717433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn if (w.isDrawnLw()) { 74729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.numDrawnWindows++; 74738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) Slog.v(TAG, 74749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "tokenMayBeDrawn: " + atoken 74759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " freezingScreen=" + atoken.freezingScreen 74769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAppFreezing=" + w.mAppFreezing); 74779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tokenMayBeDrawn = true; 74789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74807433e8aebd86e5916839508da478f9b9d63b969eDianne Hackborn } else if (w.isDrawnLw()) { 74819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project atoken.startingDisplayed = true; 74829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (w.mReadyToShow) { 74859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.performShowLocked(); 74869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7489b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes |= mPolicy.finishAnimationLw(); 74909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 74919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tokenMayBeDrawn) { 74929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // See if any windows have been drawn, so they (and others 74939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // associated with them) can now be shown. 7494f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn final int NT = mAppTokens.size(); 74959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<NT; i++) { 7496f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn AppWindowToken wtoken = mAppTokens.get(i); 74979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wtoken.freezingScreen) { 74989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numInteresting = wtoken.numInterestingWindows; 74999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) { 75008a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY) Slog.v(TAG, 75019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "allDrawn: " + wtoken 75029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " interesting=" + numInteresting 75039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " drawn=" + wtoken.numDrawnWindows); 75049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.showAllWindowsLocked(); 75059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsetAppFreezingScreenLocked(wtoken, false, true); 75069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project orientationChangeComplete = true; 75079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 75089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (!wtoken.allDrawn) { 75099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numInteresting = wtoken.numInterestingWindows; 75109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) { 75118a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY) Slog.v(TAG, 75129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "allDrawn: " + wtoken 75139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " interesting=" + numInteresting 75149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " drawn=" + wtoken.numDrawnWindows); 75159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.allDrawn = true; 7516b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM; 75179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 75189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We can now show all of the drawn windows! 75199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mOpeningApps.contains(wtoken)) { 75209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.showAllWindowsLocked(); 75219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 75229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 75239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 75249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 75259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 75269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 75279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are ready to perform an app transition, check through 75289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // all of the app tokens to be shown and see if they are ready 75299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to go. 75309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAppTransitionReady) { 75319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NN = mOpeningApps.size(); 75329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean goodToGo = true; 75338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 75349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Checking " + NN + " opening apps (frozen=" 75359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mDisplayFrozen + " timeout=" 75369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mAppTransitionTimeout + ")..."); 75379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mDisplayFrozen && !mAppTransitionTimeout) { 75389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the display isn't frozen, wait to do anything until 75399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // all of the apps are ready. Otherwise just go because 75409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we'll unfreeze the display when everyone is ready. 75419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<NN && goodToGo; i++) { 75429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = mOpeningApps.get(i); 75438a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 75449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Check opening app" + wtoken + ": allDrawn=" 75459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken.allDrawn + " startingDisplayed=" 75469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + wtoken.startingDisplayed); 75479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!wtoken.allDrawn && !wtoken.startingDisplayed 75489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && !wtoken.startingMoved) { 75499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goodToGo = false; 75509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 75519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 75529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 75539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (goodToGo) { 75548a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO"); 75559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int transit = mNextAppTransition; 75569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSkipAppTransitionAnimation) { 7557bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn transit = WindowManagerPolicy.TRANSIT_UNSET; 75589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7559bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET; 75609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTransitionReady = false; 7561a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mAppTransitionRunning = true; 75629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTransitionTimeout = false; 75639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartingIconInTransition = false; 75649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSkipAppTransitionAnimation = false; 75659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 75669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.removeMessages(H.APP_TRANSITION_TIMEOUT); 75679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7568a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // If there are applications waiting to come to the 7569a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // top of the stack, now is the time to move their windows. 7570a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // (Note that we don't do apps going to the bottom 7571a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // here -- we want to keep their windows in the old 7572a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // Z-order until the animation completes.) 7573a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (mToTopApps.size() > 0) { 7574a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn NN = mAppTokens.size(); 7575a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn for (i=0; i<NN; i++) { 7576a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn AppWindowToken wtoken = mAppTokens.get(i); 7577a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (wtoken.sendingToTop) { 7578a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wtoken.sendingToTop = false; 7579a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn moveAppWindowsLocked(wtoken, NN, false); 7580a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 7581a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 7582a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToTopApps.clear(); 7583a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 7584ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 758525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn WindowState oldWallpaper = mWallpaperTarget; 7586ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 75873be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn adjustWallpaperWindowsLocked(); 75886c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn wallpaperMayChange = false; 7589ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 7590bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // The top-most window will supply the layout params, 7591bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // and we will determine it below. 7592bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn LayoutParams animLp = null; 7593bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn int bestAnimLayer = -1; 759408121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn boolean fullscreenAnim = false; 7595ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 75968a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 75973be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn "New wallpaper target=" + mWallpaperTarget 75983be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn + ", lower target=" + mLowerWallpaperTarget 75993be63c09309b21c01b535271625d4c39045690e5Dianne Hackborn + ", upper target=" + mUpperWallpaperTarget); 760025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn int foundWallpapers = 0; 7601bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // Do a first pass through the tokens for two 7602bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // things: 7603bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // (1) Determine if both the closing and opening 7604bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // app token sets are wallpaper targets, in which 7605bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // case special animations are needed 7606bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // (since the wallpaper needs to stay static 7607bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // behind them). 7608bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // (2) Find the layout params of the top-most 7609bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // application window in the tokens, which is 7610bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn // what will control the animation theme. 7611bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn final int NC = mClosingApps.size(); 7612bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn NN = NC + mOpeningApps.size(); 7613bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn for (i=0; i<NN; i++) { 7614bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn AppWindowToken wtoken; 7615bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn int mode; 7616bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn if (i < NC) { 7617bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn wtoken = mClosingApps.get(i); 7618bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn mode = 1; 7619bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn } else { 7620bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn wtoken = mOpeningApps.get(i-NC); 7621bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn mode = 2; 7622f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 7623bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn if (mLowerWallpaperTarget != null) { 7624bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn if (mLowerWallpaperTarget.mAppToken == wtoken 7625bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn || mUpperWallpaperTarget.mAppToken == wtoken) { 7626bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn foundWallpapers |= mode; 7627f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 7628bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn } 7629bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn if (wtoken.appFullscreen) { 7630bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn WindowState ws = wtoken.findMainWindow(); 7631bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn if (ws != null) { 7632ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn animLp = ws.mAttrs; 7633ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn bestAnimLayer = ws.mLayer; 763408121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn fullscreenAnim = true; 763508121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn } 763608121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn } else if (!fullscreenAnim) { 763708121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn WindowState ws = wtoken.findMainWindow(); 763808121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn if (ws != null) { 763908121bca5bb875707974853b57820804a9e7cd3aDianne Hackborn if (ws.mLayer > bestAnimLayer) { 7640bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn animLp = ws.mAttrs; 7641bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn bestAnimLayer = ws.mLayer; 7642bcbcaa7edd32ba67c6290d79f7e7821c4b5b39acDianne Hackborn } 7643f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 7644f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 764525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn } 7646ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 764725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn if (foundWallpapers == 3) { 76488a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 764925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn "Wallpaper animation!"); 765025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn switch (transit) { 765125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN: 765225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_TASK_OPEN: 765325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_TASK_TO_FRONT: 765425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn transit = WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_OPEN; 765525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn break; 765625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE: 765725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_TASK_CLOSE: 765825994b4306a256b88d79159106834c9f114e6943Dianne Hackborn case WindowManagerPolicy.TRANSIT_TASK_TO_BACK: 765925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn transit = WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_CLOSE; 766025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn break; 7661f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 76628a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 766325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn "New transit: " + transit); 766425994b4306a256b88d79159106834c9f114e6943Dianne Hackborn } else if (oldWallpaper != null) { 766525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn // We are transitioning from an activity with 766625994b4306a256b88d79159106834c9f114e6943Dianne Hackborn // a wallpaper to one without. 766725994b4306a256b88d79159106834c9f114e6943Dianne Hackborn transit = WindowManagerPolicy.TRANSIT_WALLPAPER_CLOSE; 76688a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 766925994b4306a256b88d79159106834c9f114e6943Dianne Hackborn "New transit away from wallpaper: " + transit); 767025994b4306a256b88d79159106834c9f114e6943Dianne Hackborn } else if (mWallpaperTarget != null) { 767125994b4306a256b88d79159106834c9f114e6943Dianne Hackborn // We are transitioning from an activity without 767225994b4306a256b88d79159106834c9f114e6943Dianne Hackborn // a wallpaper to now showing the wallpaper 767325994b4306a256b88d79159106834c9f114e6943Dianne Hackborn transit = WindowManagerPolicy.TRANSIT_WALLPAPER_OPEN; 76748a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 767525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn "New transit into wallpaper: " + transit); 7676f8fbdb6b920562473dc47046924ac8ffed0b8dafDianne Hackborn } 7677ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 7678de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn // If all closing windows are obscured, then there is 7679de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn // no need to do an animation. This is the case, for 7680de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn // example, when this transition is being done behind 7681de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn // the lock screen. 7682de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn if (!mPolicy.allowAppAnimationsLw()) { 7683de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn animLp = null; 7684de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn } 7685de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn 76869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NN = mOpeningApps.size(); 76879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<NN; i++) { 76889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = mOpeningApps.get(i); 76898a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 76909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Now opening app" + wtoken); 76919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.reportedVisible = false; 76929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.inPendingTransaction = false; 769383360b3167f2c394125b74f655bc577070cb9ccaDianne Hackborn wtoken.animation = null; 7694e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn setTokenVisibilityLocked(wtoken, animLp, true, 7695ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn transit, false); 76969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.updateReportedVisibilityLocked(); 7697a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wtoken.waitingToShow = false; 76989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.showAllWindowsLocked(); 76999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 77009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NN = mClosingApps.size(); 77019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<NN; i++) { 77029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken wtoken = mClosingApps.get(i); 77038a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 77049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Now closing app" + wtoken); 77059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.inPendingTransaction = false; 770683360b3167f2c394125b74f655bc577070cb9ccaDianne Hackborn wtoken.animation = null; 7707e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn setTokenVisibilityLocked(wtoken, animLp, false, 7708ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn transit, false); 77099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.updateReportedVisibilityLocked(); 7710a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wtoken.waitingToHide = false; 77119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Force the allDrawn flag, because we want to start 77129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this guy's animations regardless of whether it's 77139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // gotten drawn. 77149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wtoken.allDrawn = true; 77159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 77169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 77178b571a817cc953ce96750f440645f104c7f55157Dianne Hackborn mNextAppTransitionPackage = null; 7718ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 77199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOpeningApps.clear(); 77209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClosingApps.clear(); 77219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 77229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This has changed the visibility of windows, so perform 77239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // a new layout to get them all up-to-date. 772494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT 772594cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn | WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG; 77269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutNeeded = true; 772720583ff9d49257bd4ccc60e7b6337661e34ed887Dianne Hackborn if (!moveInputMethodWindowsIfNeededLocked(true)) { 772820583ff9d49257bd4ccc60e7b6337661e34ed887Dianne Hackborn assignLayersLocked(); 772920583ff9d49257bd4ccc60e7b6337661e34ed887Dianne Hackborn } 77303a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES, 77313a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/); 7732b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn mFocusMayChange = false; 77339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 77349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7735ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 773616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn int adjResult = 0; 773716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn 7738a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (!animating && mAppTransitionRunning) { 7739a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // We have finished the animation of an app transition. To do 7740a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // this, we have delayed a lot of operations like showing and 7741a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // hiding apps, moving apps in Z-order, etc. The app token list 7742a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // reflects the correct Z-order, but the window list may now 7743a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // be out of sync with it. So here we will just rebuild the 7744a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // entire app window list. Fun! 7745a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mAppTransitionRunning = false; 7746a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // Clear information about apps that were moving. 7747a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToBottomApps.clear(); 7748ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 7749a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn rebuildAppWindowListLocked(); 7750b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT; 775116064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn adjResult |= ADJUST_WALLPAPER_LAYERS_CHANGED; 7752a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn moveInputMethodWindowsIfNeededLocked(false); 7753a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn wallpaperMayChange = true; 7754c9568e3989f1491abaa7960eca986af12743cb05Suchi Amalapurapu // Since the window list has been rebuilt, focus might 7755c9568e3989f1491abaa7960eca986af12743cb05Suchi Amalapurapu // have to be recomputed since the actual order of windows 7756c9568e3989f1491abaa7960eca986af12743cb05Suchi Amalapurapu // might have changed again. 7757b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn mFocusMayChange = true; 7758a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 7759ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 7760b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (wallpaperForceHidingChanged && changes == 0 && !mAppTransitionReady) { 77613b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // At this point, there was a window with a wallpaper that 77623b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // was force hiding other windows behind it, but now it 77633b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // is going away. This may be simple -- just animate 77643b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // away the wallpaper and its window -- or it may be 77653b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // hard -- the wallpaper now needs to be shown behind 77663b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // something that was hidden. 77673b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn WindowState oldWallpaper = mWallpaperTarget; 7768de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn if (mLowerWallpaperTarget != null 7769de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn && mLowerWallpaperTarget.mAppToken != null) { 77708a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 7771de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn "wallpaperForceHiding changed with lower=" 7772de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn + mLowerWallpaperTarget); 77738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 7774de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn "hidden=" + mLowerWallpaperTarget.mAppToken.hidden + 7775de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn " hiddenRequested=" + mLowerWallpaperTarget.mAppToken.hiddenRequested); 7776de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn if (mLowerWallpaperTarget.mAppToken.hidden) { 7777de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn // The lower target has become hidden before we 7778de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn // actually started the animation... let's completely 7779de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn // re-evaluate everything. 7780de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn mLowerWallpaperTarget = mUpperWallpaperTarget = null; 7781b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM; 7782de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn } 7783de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn } 778416064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn adjResult |= adjustWallpaperWindowsLocked(); 77853b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn wallpaperMayChange = false; 7786de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn wallpaperForceHidingChanged = false; 77878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, "****** OLD: " + oldWallpaper 7788de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn + " NEW: " + mWallpaperTarget 7789de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn + " LOWER: " + mLowerWallpaperTarget); 77903b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (mLowerWallpaperTarget == null) { 77913b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // Whoops, we don't need a special wallpaper animation. 77923b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // Clear them out. 77933b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn forceHiding = false; 77943b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn for (i=N-1; i>=0; i--) { 7795e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 77963b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (w.mSurface != null) { 77973b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn final WindowManager.LayoutParams attrs = w.mAttrs; 7798c03d28b9e96f667d29ec6e480bed171bbd07169dSuchi Amalapurapu if (mPolicy.doesForceHide(w, attrs) && w.isVisibleLw()) { 77998a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_FOCUS) Slog.i(TAG, "win=" + w + " force hides other windows"); 78003b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn forceHiding = true; 78013b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else if (mPolicy.canBeForceHidden(w, attrs)) { 78023b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (!w.mAnimating) { 78033b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // We set the animation above so it 78043b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn // is not yet running. 78053b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn w.clearAnimation(); 78063b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 78073b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 78083b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 78093b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 78103b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 78113b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 7812ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 78136c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (mWindowDetachedWallpaper != windowDetachedWallpaper) { 78146c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (DEBUG_WALLPAPER) Slog.v(TAG, 78156c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn "Detached wallpaper changed from " + mWindowDetachedWallpaper 78166c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn + windowDetachedWallpaper); 78176c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn mWindowDetachedWallpaper = windowDetachedWallpaper; 78186c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn wallpaperMayChange = true; 78196c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn } 78206c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn 7821de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (windowAnimationBackgroundColor != 0) { 7822de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (mWindowAnimationBackgroundSurface == null) { 7823de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mWindowAnimationBackgroundSurface = new DimSurface(mFxSession); 7824de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 7825de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mWindowAnimationBackgroundSurface.show(dw, dh, 7826de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn windowAnimationBackground.mAnimLayer - LAYER_OFFSET_DIM, 7827de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn windowAnimationBackgroundColor); 7828de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } else if (mWindowAnimationBackgroundSurface != null) { 7829de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mWindowAnimationBackgroundSurface.hide(); 7830de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 7831de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn 78326c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn if (wallpaperMayChange) { 78338a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 78340586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn "Wallpaper may change! Adjusting"); 783516064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn adjResult |= adjustWallpaperWindowsLocked(); 78363b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 7837ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 78383b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if ((adjResult&ADJUST_WALLPAPER_LAYERS_CHANGED) != 0) { 78398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 78403b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn "Wallpaper layer changed: assigning layers + relayout"); 7841b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT; 78423b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn assignLayersLocked(); 78433b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else if ((adjResult&ADJUST_WALLPAPER_VISIBILITY_CHANGED) != 0) { 78448a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_WALLPAPER) Slog.v(TAG, 78453b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn "Wallpaper visibility changed: relayout"); 7846b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT; 78473b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 7848ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 7849b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn if (mFocusMayChange) { 7850b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn mFocusMayChange = false; 78513a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown if (updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES, 78523a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown false /*updateInputWindows*/)) { 7853b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM; 78543b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn adjResult = 0; 7855a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 78566c3f571a1498f513dd53a67313a79bff877d3160Dianne Hackborn } 78573b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn 78583b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (mLayoutNeeded) { 7859b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_LAYOUT; 78603b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 7861ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 7862b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "*** ANIM STEP: changes=0x" 7863b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + Integer.toHexString(changes)); 7864b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn } while (changes != 0); 78659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 78669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // THIRD LOOP: Update the surfaces of all windows. 78679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 78689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean someoneLosingFocus = mLosingFocus.size() != 0; 78699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 78709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean obscured = false; 78719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean blurring = false; 78729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean dimming = false; 78739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean covered = false; 78749ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn boolean syswin = false; 78759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7876bdd52b264af8f562dd368d40b66771c88d45127fDianne Hackborn final int N = mWindows.size(); 7877ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 78789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=N-1; i>=0; i--) { 7879e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState w = mWindows.get(i); 78809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 78819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean displayed = false; 78829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowManager.LayoutParams attrs = w.mAttrs; 78839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int attrFlags = attrs.flags; 78849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 78859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mSurface != null) { 7886ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // XXX NOTE: The logic here could be improved. We have 7887ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // the decision about whether to resize a window separated 7888ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // from whether to hide the surface. This can cause us to 7889ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // resize a surface even if we are going to hide it. You 7890ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // can see this by (1) holding device in landscape mode on 7891ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // home screen; (2) tapping browser icon (device will rotate 7892ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // to landscape; (3) tap home. The wallpaper will be resized 7893ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // in step 2 but then immediately hidden, causing us to 7894ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // have to resize and then redraw it again in step 3. It 7895ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // would be nice to figure out how to avoid this, but it is 7896ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // difficult because we do need to resize surfaces in some 7897ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // cases while they are hidden such as when first showing a 7898ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn // window. 7899ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn 79009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.computeShownFrameLocked(); 79018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v( 79029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Placing surface #" + i + " " + w.mSurface 7903ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn + ": new=" + w.mShownFrame); 79049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7905fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown if (w.mSurface != null) { 7906b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn int width, height; 7907b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn if ((w.mAttrs.flags & w.mAttrs.FLAG_SCALED) != 0) { 7908b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn // for a scaled surface, we just want to use 7909b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn // the requested size. 7910b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn width = w.mRequestedWidth; 7911b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn height = w.mRequestedHeight; 7912b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn } else { 7913b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn width = w.mCompatFrame.width(); 7914b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn height = w.mCompatFrame.height(); 7915b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn } 7916b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn 7917b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn if (width < 1) { 7918b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn width = 1; 7919b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn } 7920b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn if (height < 1) { 7921b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn height = 1; 7922b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn } 7923b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn final boolean surfaceResized = w.mSurfaceW != width || w.mSurfaceH != height; 7924b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn if (surfaceResized) { 7925b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn w.mSurfaceW = width; 7926b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn w.mSurfaceH = height; 7927b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn } 7928b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn 7929fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown if (w.mSurfaceX != w.mShownFrame.left 7930fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown || w.mSurfaceY != w.mShownFrame.top) { 7931fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown try { 7932fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown if (SHOW_TRANSACTIONS) logSurface(w, 7933fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown "POS " + w.mShownFrame.left 7934fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + ", " + w.mShownFrame.top, null); 7935fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown w.mSurfaceX = w.mShownFrame.left; 7936fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown w.mSurfaceY = w.mShownFrame.top; 7937fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown w.mSurface.setPosition(w.mShownFrame.left, w.mShownFrame.top); 7938fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown } catch (RuntimeException e) { 7939fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown Slog.w(TAG, "Error positioning surface of " + w 7940fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + " pos=(" + w.mShownFrame.left 7941fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + "," + w.mShownFrame.top + ")", e); 7942fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown if (!recoveringMemory) { 7943648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn reclaimSomeSurfaceMemoryLocked(w, "position", true); 7944fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown } 7945fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown } 7946fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown } 7947fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown 7948b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn if (surfaceResized) { 79499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7950b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (SHOW_TRANSACTIONS) logSurface(w, 7951b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn "SIZE " + width + "x" + height, null); 7952ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn w.mSurfaceResized = true; 79539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mSurface.setSize(width, height); 79549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 79559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If something goes wrong with the surface (such 79569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // as running out of memory), don't take down the 79579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // entire system. 7958fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown Slog.e(TAG, "Error resizing surface of " + w 7959fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + " size=(" + width + "x" + height + ")", e); 79609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!recoveringMemory) { 7961648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn reclaimSomeSurfaceMemoryLocked(w, "size", true); 79629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 79639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 79649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 79659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7966fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown 7967e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (!w.mAppFreezing && w.mLayoutSeq == mLayoutSeq) { 7968b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn w.mContentInsetsChanged |= 79699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project !w.mLastContentInsets.equals(w.mContentInsets); 7970b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn w.mVisibleInsetsChanged |= 79719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project !w.mLastVisibleInsets.equals(w.mVisibleInsets); 7972e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean configChanged = 7973e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn w.mConfiguration != mCurConfiguration 7974e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn && (w.mConfiguration == null 7975e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn || mCurConfiguration.diff(w.mConfiguration) != 0); 7976694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn if (DEBUG_CONFIGURATION && configChanged) { 7977694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn Slog.v(TAG, "Win " + w + " config changed: " 7978694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn + mCurConfiguration); 7979694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn } 79808a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v(TAG, "Resizing " + w 7981e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn + ": configChanged=" + configChanged 7982b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn + " last=" + w.mLastFrame + " frame=" + w.mFrame); 7983b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn w.mLastFrame.set(w.mFrame); 7984b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn if (w.mContentInsetsChanged 7985e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn || w.mVisibleInsetsChanged 7986ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn || w.mSurfaceResized 7987e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn || configChanged) { 7988fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown if (DEBUG_RESIZE || DEBUG_ORIENTATION) { 7989fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown Slog.v(TAG, "Resize reasons: " 7990fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + " contentInsetsChanged=" + w.mContentInsetsChanged 7991fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + " visibleInsetsChanged=" + w.mVisibleInsetsChanged 7992fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + " surfaceResized=" + w.mSurfaceResized 7993fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown + " configChanged=" + configChanged); 7994fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown } 7995fbae722d2a4e3f606a101a118b1b506dc6ecc29bJeff Brown 79969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastContentInsets.set(w.mContentInsets); 79979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastVisibleInsets.set(w.mVisibleInsets); 79980586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // If the screen is currently frozen, then keep 79990586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // it frozen until this window draws at its new 80000586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // orientation. 80010586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn if (mDisplayFrozen) { 80028a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, 80030586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn "Resizing while display frozen: " + w); 80040586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn w.mOrientationChanging = true; 8005e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (!mWindowsFreezingScreen) { 80060586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn mWindowsFreezingScreen = true; 80070586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // XXX should probably keep timeout from 80080586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn // when we first froze the display. 80090586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT); 80100586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn mH.sendMessageDelayed(mH.obtainMessage( 80110586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn H.WINDOW_FREEZE_TIMEOUT), 2000); 80120586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn } 80130586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn } 80149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the orientation is changing, then we need to 80159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // hold off on unfreezing the display until this 80169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // window has been redrawn; to do that, we need 80179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to go through the process of getting informed 80189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // by the application when it has finished drawing. 80199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mOrientationChanging) { 80208a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, 80219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Orientation start waiting for draw in " 80229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + w + ", surface " + w.mSurface); 80239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mDrawPending = true; 80249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mCommitDrawPending = false; 80259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mReadyToShow = false; 80269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mAppToken != null) { 80279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mAppToken.allDrawn = false; 80289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8030b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn if (!mResizingWindows.contains(w)) { 8031b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn if (DEBUG_RESIZE || DEBUG_ORIENTATION) Slog.v(TAG, 8032b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn "Resizing window " + w + " to " + w.mSurfaceW 8033b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn + "x" + w.mSurfaceH); 8034b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn mResizingWindows.add(w); 8035b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn } 80369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (w.mOrientationChanging) { 80379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!w.mDrawPending && !w.mCommitDrawPending) { 80388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, 80399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Orientation not waiting for draw in " 80409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + w + ", surface " + w.mSurface); 80419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mOrientationChanging = false; 80429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 80463b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (w.mAttachedHidden || !w.isReadyForDisplay()) { 80479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!w.mLastHidden) { 80489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //dump(); 80499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastHidden = true; 8050b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (SHOW_TRANSACTIONS) logSurface(w, 8051b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn "HIDE (performLayout)", null); 80529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mSurface != null) { 805316064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn w.mSurfaceShown = false; 80549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 80559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mSurface.hide(); 80569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 80578a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Exception hiding surface in " + w); 80589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we are waiting for this window to handle an 80629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // orientation change, well, it is hidden, so 80639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // doesn't really matter. Note that this does 80649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // introduce a potential glitch if the window 80659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // becomes unhidden before it has drawn for the 80669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // new orientation. 80679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mOrientationChanging) { 80689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mOrientationChanging = false; 80698a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, 80709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Orientation change skips hidden " + w); 80719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 80729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (w.mLastLayer != w.mAnimLayer 80739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mLastAlpha != w.mShownAlpha 80749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mLastDsDx != w.mDsDx 80759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mLastDtDx != w.mDtDx 80769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mLastDsDy != w.mDsDy 80779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mLastDtDy != w.mDtDy 80789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mLastHScale != w.mHScale 80799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mLastVScale != w.mVScale 80809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || w.mLastHidden) { 80819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayed = true; 80829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastAlpha = w.mShownAlpha; 80839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastLayer = w.mAnimLayer; 80849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastDsDx = w.mDsDx; 80859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastDtDx = w.mDtDx; 80869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastDsDy = w.mDsDy; 80879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastDtDy = w.mDtDy; 80889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastHScale = w.mHScale; 80899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastVScale = w.mVScale; 8090b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (SHOW_TRANSACTIONS) logSurface(w, 8091b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn "alpha=" + w.mShownAlpha + " layer=" + w.mAnimLayer 80920586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn + " matrix=[" + (w.mDsDx*w.mHScale) 80930586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn + "," + (w.mDtDx*w.mVScale) 80940586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn + "][" + (w.mDsDy*w.mHScale) 8095b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn + "," + (w.mDtDy*w.mVScale) + "]", null); 80969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mSurface != null) { 80979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 809816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn w.mSurfaceAlpha = w.mShownAlpha; 80999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mSurface.setAlpha(w.mShownAlpha); 810016064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn w.mSurfaceLayer = w.mAnimLayer; 81019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mSurface.setLayer(w.mAnimLayer); 81029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mSurface.setMatrix( 81039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mDsDx*w.mHScale, w.mDtDx*w.mVScale, 81049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mDsDy*w.mHScale, w.mDtDy*w.mVScale); 81059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 81068a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Error updating surface in " + w, e); 81079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!recoveringMemory) { 8108648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn reclaimSomeSurfaceMemoryLocked(w, "update", true); 81099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 81139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mLastHidden && !w.mDrawPending 81149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && !w.mCommitDrawPending 81159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && !w.mReadyToShow) { 8116b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn if (SHOW_TRANSACTIONS) logSurface(w, 8117b8b11a0b1d82e24f7a79f2e1672e7f5cf1611a55Dianne Hackborn "SHOW (performLayout)", null); 81188a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + w 81199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " during relayout"); 81209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (showSurfaceRobustlyLocked(w)) { 81219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mHasDrawn = true; 81229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mLastHidden = false; 81239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 81249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mOrientationChanging = false; 81259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mSurface != null) { 81289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mToken.hasVisible = true; 81299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 81319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayed = true; 81329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 81349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (displayed) { 81359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!covered) { 8136980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy if (attrs.width == LayoutParams.MATCH_PARENT 8137980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy && attrs.height == LayoutParams.MATCH_PARENT) { 81389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project covered = true; 81399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mOrientationChanging) { 81429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mDrawPending || w.mCommitDrawPending) { 81439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project orientationChangeComplete = false; 81448a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, 81459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Orientation continue waiting for draw in " + w); 81469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 81479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mOrientationChanging = false; 81488a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, 81499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Orientation change complete in " + w); 81509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mToken.hasVisible = true; 81539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (w.mOrientationChanging) { 81558a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION) Slog.v(TAG, 81569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Orientation change skips hidden " + w); 81579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w.mOrientationChanging = false; 81589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 81600f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn if (w.mContentChanged) { 81610f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn //Slog.i(TAG, "Window " + this + " clearing mContentChanged - done placing"); 81620f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn w.mContentChanged = false; 81630f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn } 81640f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn 81659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean canBeSeen = w.isDisplayedLw(); 81669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 81679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (someoneLosingFocus && w == mCurrentFocus && canBeSeen) { 81689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project focusDisplayed = true; 81699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8171e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn final boolean obscuredChanged = w.mObscured != obscured; 8172ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 81739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Update effect. 81747341d7a104b47996445d069a695e155a07184606Dianne Hackborn if (!(w.mObscured=obscured)) { 81759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w.mSurface != null) { 81769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((attrFlags&FLAG_KEEP_SCREEN_ON) != 0) { 81779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project holdScreen = w.mSession; 81789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81799ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn if (!syswin && w.mAttrs.screenBrightness >= 0 81809ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn && screenBrightness < 0) { 81819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project screenBrightness = w.mAttrs.screenBrightness; 81829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8183fb73f79340375013225618a5d87f46b958f698efMike Lockwood if (!syswin && w.mAttrs.buttonBrightness >= 0 8184fb73f79340375013225618a5d87f46b958f698efMike Lockwood && buttonBrightness < 0) { 8185fb73f79340375013225618a5d87f46b958f698efMike Lockwood buttonBrightness = w.mAttrs.buttonBrightness; 8186fb73f79340375013225618a5d87f46b958f698efMike Lockwood } 818746af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood if (canBeSeen 818846af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood && (attrs.type == WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG 818946af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood || attrs.type == WindowManager.LayoutParams.TYPE_KEYGUARD 819046af6a8b1f270b86f4e4a53b2c80fd20d8981af8Mike Lockwood || attrs.type == WindowManager.LayoutParams.TYPE_SYSTEM_ERROR)) { 81919ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn syswin = true; 81929ed4a4b0d7dadeadd57bd81e2cc538670d9654b9Dianne Hackborn } 81939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81941ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima 819525994b4306a256b88d79159106834c9f114e6943Dianne Hackborn boolean opaqueDrawn = canBeSeen && w.isOpaqueDrawn(); 8196e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn if (opaqueDrawn && w.isFullscreen(innerDw, innerDh)) { 81979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This window completely covers everything behind it, 81989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // so we want to leave all of them as unblurred (for 81999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // performance reasons). 82009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project obscured = true; 82013b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } else if (canBeSeen && !obscured && 82029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (attrFlags&FLAG_BLUR_BEHIND|FLAG_DIM_BEHIND) != 0) { 82038a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v(TAG, "Win " + w 82049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": blurring=" + blurring 82059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " obscured=" + obscured 82069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " displayed=" + displayed); 82079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((attrFlags&FLAG_DIM_BEHIND) != 0) { 82089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!dimming) { 82098a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "DIM BEHIND: " + w); 82109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dimming = true; 82110a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima if (mDimAnimator == null) { 82120a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima mDimAnimator = new DimAnimator(mFxSession); 82139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 821448a7651823030ed3c0f4c084b423430044425feaDianne Hackborn mDimAnimator.show(innerDw, innerDh); 82151c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn mDimAnimator.updateParameters(mContext.getResources(), 82161c24e957ad8624753f9d89b578d9d34d7ac5f80bDianne Hackborn w, currentTime); 82179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 82189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 82199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((attrFlags&FLAG_BLUR_BEHIND) != 0) { 82209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!blurring) { 82218a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i(TAG, "BLUR BEHIND: " + w); 82229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project blurring = true; 82239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBlurSurface == null) { 82249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 822506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy mBlurSurface = new Surface(mFxSession, 0, 82265d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian "BlurSurface", 82279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -1, 16, 16, 82289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PixelFormat.OPAQUE, 82299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Surface.FX_SURFACE_BLUR); 82309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 82318a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.e(TAG, "Exception creating Blur surface", e); 82329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8233ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, " BLUR " 8234ac1471a4fff660710f88afc679c4119fdf8dc417Dianne Hackborn + mBlurSurface + ": CREATE"); 82359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 82369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBlurSurface != null) { 823716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, " BLUR " 823816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn + mBlurSurface + ": pos=(0,0) (" + 823916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn dw + "x" + dh + "), layer=" + (w.mAnimLayer-1)); 82409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBlurSurface.setPosition(0, 0); 82419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBlurSurface.setSize(dw, dh); 8242de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mBlurSurface.setLayer(w.mAnimLayer-LAYER_OFFSET_BLUR); 824316064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn if (!mBlurShown) { 824416064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn try { 824516064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, " BLUR " 824616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn + mBlurSurface + ": SHOW"); 824716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn mBlurSurface.show(); 824816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn } catch (RuntimeException e) { 824916064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn Slog.w(TAG, "Failure showing blur surface", e); 825016064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn } 825116064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn mBlurShown = true; 82529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 82539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 82549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 82559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 82569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 82579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8258ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 8259e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn if (obscuredChanged && mWallpaperTarget == w) { 8260e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn // This is the wallpaper target and its obscured state 8261e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn // changed... make sure the current wallaper's visibility 8262e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn // has been updated accordingly. 8263e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn updateWallpaperVisibilityLocked(); 8264e9e9bca842473f2e9d343d4248be98f8731a79d1Dianne Hackborn } 82659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8266ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 82670a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima if (mDimAnimator != null && mDimAnimator.mDimShown) { 8268de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn animating |= mDimAnimator.updateSurface(dimming, currentTime, 8269de2606dcd36e9dfa49c42dbc68c539505d5ff8d4Dianne Hackborn mDisplayFrozen || !mPolicy.isScreenOn()); 82709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 827106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 82729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!blurring && mBlurShown) { 82738a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (SHOW_TRANSACTIONS) Slog.i(TAG, " BLUR " + mBlurSurface 82749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": HIDE"); 82759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 82769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBlurSurface.hide(); 82779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalArgumentException e) { 82788a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Illegal argument exception hiding blur surface"); 82799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 82809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBlurShown = false; 82819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 82827916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn 82837916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (mBlackFrame != null) { 82847916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn if (mScreenRotationAnimation != null) { 82857916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mBlackFrame.setMatrix( 82867916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mScreenRotationAnimation.getEnterTransformation().getMatrix()); 82877916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } else { 82887916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn mBlackFrame.clearMatrix(); 82897916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 82907916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn } 82919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 82928a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.e(TAG, "Unhandled exception in Window Manager", e); 82939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 82949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 82959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Surface.closeTransaction(); 829606882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 829794cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (SHOW_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION performLayoutAndPlaceSurfaces"); 829894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn 8299b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn if (mWatermark != null) { 8300b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn mWatermark.drawIfNeeded(); 8301b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } 8302b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn 83038a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_ORIENTATION && mDisplayFrozen) Slog.v(TAG, 83049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "With display frozen, orientationChangeComplete=" 83059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + orientationChangeComplete); 83069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (orientationChangeComplete) { 83079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mWindowsFreezingScreen) { 83089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowsFreezingScreen = false; 83099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT); 83109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8311e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn stopFreezingDisplayLocked(); 83129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 831306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 83149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i = mResizingWindows.size(); 83159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i > 0) { 83169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 83179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 83189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = mResizingWindows.get(i); 83199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8320ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn if (DEBUG_RESIZE || DEBUG_ORIENTATION) Slog.v(TAG, 8321ffb3d939cc78cae523f14a0f8ab37061b5bffc20Dianne Hackborn "Reporting new frame to " + win + ": " + win.mCompatFrame); 8322694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn int diff = 0; 8323e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn boolean configChanged = 8324e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn win.mConfiguration != mCurConfiguration 8325e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn && (win.mConfiguration == null 8326694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn || (diff=mCurConfiguration.diff(win.mConfiguration)) != 0); 8327694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn if ((DEBUG_RESIZE || DEBUG_ORIENTATION || DEBUG_CONFIGURATION) 8328694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn && configChanged) { 83298a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, "Sending new config to window " + win + ": " 8330b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn + win.mSurfaceW + "x" + win.mSurfaceH 8331694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn + " / " + mCurConfiguration + " / 0x" 8332694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn + Integer.toHexString(diff)); 8333e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 8334694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn win.mConfiguration = mCurConfiguration; 8335b961cd2c80abf1d2834e5ad690904da4fe56d755Dianne Hackborn win.mClient.resized(win.mSurfaceW, win.mSurfaceH, win.mLastContentInsets, 8336e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn win.mLastVisibleInsets, win.mDrawPending, 8337e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn configChanged ? win.mConfiguration : null); 83389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mContentInsetsChanged = false; 83399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mVisibleInsetsChanged = false; 8340ac3587d7ced544091264a35249dbd3f9531a3cabDianne Hackborn win.mSurfaceResized = false; 83419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 83429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mOrientationChanging = false; 83439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 83449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (i > 0); 83459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResizingWindows.clear(); 83469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 834706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 83489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Destroy the surface of any windows that are no longer visible. 83497341d7a104b47996445d069a695e155a07184606Dianne Hackborn boolean wallpaperDestroyed = false; 83509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i = mDestroySurface.size(); 83519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i > 0) { 83529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 83539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 83549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win = mDestroySurface.get(i); 83559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mDestroying = false; 83569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInputMethodWindow == win) { 83579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodWindow = null; 83589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 83597341d7a104b47996445d069a695e155a07184606Dianne Hackborn if (win == mWallpaperTarget) { 83607341d7a104b47996445d069a695e155a07184606Dianne Hackborn wallpaperDestroyed = true; 83617341d7a104b47996445d069a695e155a07184606Dianne Hackborn } 83629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.destroySurfaceLocked(); 83639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (i > 0); 83649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDestroySurface.clear(); 83659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 83669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 83679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Time to remove any exiting tokens? 83689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=mExitingTokens.size()-1; i>=0; i--) { 83699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken token = mExitingTokens.get(i); 83709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!token.hasVisible) { 83719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExitingTokens.remove(i); 83724c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn if (token.windowType == TYPE_WALLPAPER) { 83734c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn mWallpaperTokens.remove(token); 83744c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 83759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 83769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 83779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 83789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Time to remove any exiting applications? 83799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=mExitingAppTokens.size()-1; i>=0; i--) { 83809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken token = mExitingAppTokens.get(i); 83819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!token.hasVisible && !mClosingApps.contains(token)) { 83829bfb707597898f54722460b48588007b682f3e2aDianne Hackborn // Make sure there is no animation running on this token, 83839bfb707597898f54722460b48588007b682f3e2aDianne Hackborn // so any windows associated with it will be removed as 83849bfb707597898f54722460b48588007b682f3e2aDianne Hackborn // soon as their animations are complete 83859bfb707597898f54722460b48588007b682f3e2aDianne Hackborn token.animation = null; 83869bfb707597898f54722460b48588007b682f3e2aDianne Hackborn token.animating = false; 8387f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, 8388f99f9c5f92dbcdf5f6e9c93847a5dae4c35a817eDianne Hackborn "performLayout: App token exiting now removed" + token); 83899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTokens.remove(token); 83909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExitingAppTokens.remove(i); 83919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 83929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 83939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8394a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn boolean needRelayout = false; 8395ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 8396a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (!animating && mAppTransitionRunning) { 8397a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // We have finished the animation of an app transition. To do 8398a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // this, we have delayed a lot of operations like showing and 8399a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // hiding apps, moving apps in Z-order, etc. The app token list 8400a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // reflects the correct Z-order, but the window list may now 8401a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // be out of sync with it. So here we will just rebuild the 8402a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // entire app window list. Fun! 8403a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mAppTransitionRunning = false; 8404a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn needRelayout = true; 8405a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn rebuildAppWindowListLocked(); 840616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn assignLayersLocked(); 8407a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn // Clear information about apps that were moving. 8408a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn mToBottomApps.clear(); 8409a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 8410ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 84119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (focusDisplayed) { 84129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendEmptyMessage(H.REPORT_LOSING_FOCUS); 84139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84147341d7a104b47996445d069a695e155a07184606Dianne Hackborn if (wallpaperDestroyed) { 84150586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn needRelayout = adjustWallpaperWindowsLocked() != 0; 84167341d7a104b47996445d069a695e155a07184606Dianne Hackborn } 8417a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn if (needRelayout) { 84187341d7a104b47996445d069a695e155a07184606Dianne Hackborn requestAnimationLocked(0); 84197341d7a104b47996445d069a695e155a07184606Dianne Hackborn } else if (animating) { 84209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestAnimationLocked(currentTime+(1000/60)-SystemClock.uptimeMillis()); 84219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8422eb857f12d605659b385d168ef1ea7d4ba5193585Jeff Brown 84233a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown // Finally update all input windows now that the window changes have stabilized. 84242e44b0788f450f06c0d4e3b8dc26aff43ead587dJeff Brown mInputMonitor.updateInputWindowsLw(true /*force*/); 8425eb857f12d605659b385d168ef1ea7d4ba5193585Jeff Brown 84268e03b7566c42621fda01186b66b019142eb84fbfJeff Brown setHoldScreenLocked(holdScreen != null); 8427428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn if (!mDisplayFrozen) { 8428428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn if (screenBrightness < 0 || screenBrightness > 1.0f) { 8429428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn mPowerManager.setScreenBrightnessOverride(-1); 8430428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn } else { 8431428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn mPowerManager.setScreenBrightnessOverride((int) 8432428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn (screenBrightness * Power.BRIGHTNESS_ON)); 8433428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn } 8434428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn if (buttonBrightness < 0 || buttonBrightness > 1.0f) { 8435428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn mPowerManager.setButtonBrightnessOverride(-1); 8436428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn } else { 8437428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn mPowerManager.setButtonBrightnessOverride((int) 8438428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn (buttonBrightness * Power.BRIGHTNESS_ON)); 8439428ecb65b52438e390d48b98d649b1dbb29bb28dDianne Hackborn } 8440fb73f79340375013225618a5d87f46b958f698efMike Lockwood } 84419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (holdScreen != mHoldingScreenOn) { 84429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHoldingScreenOn = holdScreen; 84439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = mH.obtainMessage(H.HOLD_SCREEN_CHANGED, holdScreen); 84449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessage(m); 84459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8446ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 844793e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn if (mTurnOnScreen) { 8448b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn if (DEBUG_VISIBILITY) Slog.v(TAG, "Turning screen on after layout!"); 844993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn mPowerManager.userActivity(SystemClock.uptimeMillis(), false, 845093e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn LocalPowerManager.BUTTON_EVENT, true); 845193e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn mTurnOnScreen = false; 845293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn } 8453f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn 845450660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn if (screenRotationFinished && mScreenRotationAnimation != null) { 845550660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn mScreenRotationAnimation.kill(); 845650660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn mScreenRotationAnimation = null; 845750660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn } 845850660e27283e33da7fb226f454cf704d1e0a5bb8Dianne Hackborn 845989ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn if (updateRotation) { 846089ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation"); 846189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn boolean changed = setRotationUncheckedLocked( 846289ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn WindowManagerPolicy.USE_LAST_ROTATION, 0, false); 846389ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn if (changed) { 84643e4f9d0452a2592338c15cf1b6d774761b929a28Dianne Hackborn mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION); 846589ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn } 846689ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn } 846789ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn 8468f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn // Check to see if we are now in a state where the screen should 8469f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn // be enabled, because the window obscured flags have changed. 8470f3bea9cb756203e027dcb6668cbaae3a92caa38fDianne Hackborn enableScreenIfNeededLocked(); 84719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 847246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 847346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /** 847446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Must be called with the main window manager lock held. 847546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 847646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown void setHoldScreenLocked(boolean holding) { 847746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown boolean state = mHoldingScreenWakeLock.isHeld(); 847846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (holding != state) { 847946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown if (holding) { 84800601eb7953cbf77d92826bef3ca37e208d922de7Daniel Sandler mPolicy.screenOnStartedLw(); 848146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mHoldingScreenWakeLock.acquire(); 848246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } else { 848346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mPolicy.screenOnStoppedLw(); 848446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown mHoldingScreenWakeLock.release(); 848546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 848646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 848746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown } 84889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 84899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void requestAnimationLocked(long delay) { 84909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mAnimationPending) { 84919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimationPending = true; 84929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessageDelayed(mH.obtainMessage(H.ANIMATE), delay); 84939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 84949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 849506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 84969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 84979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Have the surface flinger show a surface, robustly dealing with 84989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * error conditions. In particular, if there is not enough memory 84999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to show the surface, then we will try to get rid of other surfaces 85009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in order to succeed. 850106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy * 85029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if the surface was successfully shown. 85039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 85049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean showSurfaceRobustlyLocked(WindowState win) { 85059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 85069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.mSurface != null) { 850716064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn win.mSurfaceShown = true; 85089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mSurface.show(); 850993e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn if (win.mTurnOnScreen) { 8510b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn if (DEBUG_VISIBILITY) Slog.v(TAG, 8511b601ce14f9bee3ba6ee017729ea6f926586f2c8dDianne Hackborn "Show surface turning screen on: " + win); 851293e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn win.mTurnOnScreen = false; 851393e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn mTurnOnScreen = true; 851493e462b79d6896da10e15e74c5aec6beb098dddfDianne Hackborn } 85159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 85179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 851894cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn Slog.w(TAG, "Failure showing surface " + win.mSurface + " in " + win, e); 85199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 852006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 8521648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn reclaimSomeSurfaceMemoryLocked(win, "show", true); 852206882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 85239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 85249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 852506882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 8526648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn boolean reclaimSomeSurfaceMemoryLocked(WindowState win, String operation, boolean secure) { 85279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Surface surface = win.mSurface; 8528648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn boolean leakedSurface = false; 8529648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn boolean killedApps = false; 853006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 8531ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker EventLog.writeEvent(EventLogTags.WM_NO_SURFACE_MEMORY, win.toString(), 85329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mSession.mPid, operation); 853306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 85349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mForceRemoves == null) { 85359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForceRemoves = new ArrayList<WindowState>(); 85369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 853706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 85389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long callingIdentity = Binder.clearCallingIdentity(); 85399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 85409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // There was some problem... first, do a sanity check of the 85419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // window list to make sure we haven't left any dangling surfaces 85429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // around. 85439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = mWindows.size(); 85448a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, "Out of memory for surface! Looking for leaks..."); 85459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 8546e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState ws = mWindows.get(i); 85479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ws.mSurface != null) { 85489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mSessions.contains(ws.mSession)) { 85498a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "LEAKED SURFACE (session doesn't exist): " 85509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ws + " surface=" + ws.mSurface 85519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " token=" + win.mToken 85529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " pid=" + ws.mSession.mPid 85539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " uid=" + ws.mSession.mUid); 855494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (SHOW_TRANSACTIONS) logSurface(ws, "LEAK DESTROY", null); 85550586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn ws.mSurface.destroy(); 855616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn ws.mSurfaceShown = false; 85579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ws.mSurface = null; 85589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForceRemoves.add(ws); 85599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 85609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 85619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project leakedSurface = true; 856294cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn } else if (ws.mAppToken != null && ws.mAppToken.clientHidden) { 85638a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "LEAKED SURFACE (app token hidden): " 85649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ws + " surface=" + ws.mSurface 85659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " token=" + win.mAppToken); 856694cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn if (SHOW_TRANSACTIONS) logSurface(ws, "LEAK DESTROY", null); 85670586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn ws.mSurface.destroy(); 856816064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn ws.mSurfaceShown = false; 85699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ws.mSurface = null; 85709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project leakedSurface = true; 85719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 857406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 85759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!leakedSurface) { 85768a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "No leaked surfaces; killing applicatons!"); 85779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SparseIntArray pidCandidates = new SparseIntArray(); 85789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 8579e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown WindowState ws = mWindows.get(i); 85809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ws.mSurface != null) { 85819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pidCandidates.append(ws.mSession.mPid, ws.mSession.mPid); 85829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pidCandidates.size() > 0) { 85859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] pids = new int[pidCandidates.size()]; 85869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<pids.length; i++) { 85879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pids[i] = pidCandidates.keyAt(i); 85889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8590648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn if (mActivityManager.killPids(pids, "Free memory", secure)) { 85919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project killedApps = true; 85929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 85949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 859706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 85989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (leakedSurface || killedApps) { 85999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We managed to reclaim some memory, so get rid of the trouble 86009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // surface and ask the app to request another one. 86018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(TAG, "Looks like we have reclaimed some memory, clearing surface for retry."); 86029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (surface != null) { 86035fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) logSurface(win, 86045fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn "RECOVER DESTROY", null); 86050586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn surface.destroy(); 860616064f9f183e4a07cd361042dad660aadf84dc9cDianne Hackborn win.mSurfaceShown = false; 86079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mSurface = null; 86089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 860906882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 86109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 86119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project win.mClient.dispatchGetNewSurface(); 86129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 86139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 86149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 86159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 86169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(callingIdentity); 86179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8618648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn 8619648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn return leakedSurface || killedApps; 86209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 862106882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 86223a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown private boolean updateFocusedWindowLocked(int mode, boolean updateInputWindows) { 86239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState newFocus = computeFocusedWindowLocked(); 86249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrentFocus != newFocus) { 86259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This check makes sure that we don't already have the focus 86269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // change message pending. 86279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.removeMessages(H.REPORT_FOCUS_CHANGE); 86289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendEmptyMessage(H.REPORT_FOCUS_CHANGE); 86298a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v( 86309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Changing focus from " + mCurrentFocus + " to " + newFocus); 86319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowState oldFocus = mCurrentFocus; 86329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentFocus = newFocus; 86339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLosingFocus.remove(newFocus); 863406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 86359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowState imWindow = mInputMethodWindow; 86369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newFocus != imWindow && oldFocus != imWindow) { 8637c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project if (moveInputMethodWindowsIfNeededLocked( 86389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mode != UPDATE_FOCUS_WILL_ASSIGN_LAYERS && 8639c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project mode != UPDATE_FOCUS_WILL_PLACE_SURFACES)) { 8640c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project mLayoutNeeded = true; 8641c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project } 86429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mode == UPDATE_FOCUS_PLACING_SURFACES) { 86433a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown performLayoutLockedInner(true /*initial*/, updateInputWindows); 8644c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project } else if (mode == UPDATE_FOCUS_WILL_PLACE_SURFACES) { 8645c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project // Client will do the layout, but we need to assign layers 8646c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project // for handleNewWindowLocked() below. 8647c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project assignLayersLocked(); 86489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 86499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8650349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 8651349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown if (mode != UPDATE_FOCUS_WILL_ASSIGN_LAYERS) { 8652349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // If we defer assigning layers, then the caller is responsible for 8653349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // doing this part. 86543a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown finishUpdateFocusedWindowAfterAssignLayersLocked(updateInputWindows); 8655c474dec3ffa1c0fe37edb3e701684188f7e8e7bcThe Android Open Source Project } 86569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 86579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 86589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 86599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8660349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 86613a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown private void finishUpdateFocusedWindowAfterAssignLayersLocked(boolean updateInputWindows) { 86623a22cd90bc5413314295df5688385b5ced7d8167Jeff Brown mInputMonitor.setInputFocusLw(mCurrentFocus, updateInputWindows); 8663349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown } 86649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 86659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WindowState computeFocusedWindowLocked() { 86669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState result = null; 86679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowState win; 86689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 86699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = mWindows.size() - 1; 86709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int nextAppIndex = mAppTokens.size()-1; 86719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowToken nextApp = nextAppIndex >= 0 86729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? mAppTokens.get(nextAppIndex) : null; 86739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 86749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i >= 0) { 8675e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown win = mWindows.get(i); 86769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 86778a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV || DEBUG_FOCUS) Slog.v( 86789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Looking for focus: " + i 86799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " = " + win 86809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", flags=" + win.mAttrs.flags 86819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", canReceive=" + win.canReceiveKeys()); 86829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 86839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppWindowToken thisApp = win.mAppToken; 868406882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 86859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this window's application has been removed, just skip it. 86869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (thisApp != null && thisApp.removed) { 86879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 86889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 86899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 869006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 86919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If there is a focused app, don't allow focus to go to any 86929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // windows below it. If this is an application window, step 86939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // through the app tokens until we find its app. 86949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (thisApp != null && nextApp != null && thisApp != nextApp 86959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && win.mAttrs.type != TYPE_APPLICATION_STARTING) { 86969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int origAppIndex = nextAppIndex; 86979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (nextAppIndex > 0) { 86989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nextApp == mFocusedApp) { 86999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Whoops, we are below the focused app... no focus 87009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // for you! 87018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV || DEBUG_FOCUS) Slog.v( 87029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Reached focused app: " + mFocusedApp); 87039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 87049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 87059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nextAppIndex--; 87069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nextApp = mAppTokens.get(nextAppIndex); 87079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nextApp == thisApp) { 87089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 87099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 87109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 87119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (thisApp != nextApp) { 87129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Uh oh, the app token doesn't exist! This shouldn't 87139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // happen, but if it does we can get totally hosed... 87149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // so restart at the original app. 87159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nextAppIndex = origAppIndex; 87169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nextApp = mAppTokens.get(nextAppIndex); 87179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 87189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 87199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 87209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Dispatch to this window if it is wants key events. 87219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (win.canReceiveKeys()) { 87228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (DEBUG_FOCUS) Slog.v( 87239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Found focus @ " + i + " = " + win); 87249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = win; 87259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 87269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 87279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 87289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 87299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 87309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 87319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 87329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 87339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 873494cb2ebfc3e789384a4c32b24ac1522cdcb3ae79Dianne Hackborn private void startFreezingDisplayLocked(boolean inTransaction) { 87359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDisplayFrozen) { 87369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 87379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 873806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 87399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenFrozenLock.acquire(); 874006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 87419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDisplayFrozen = true; 8742349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 874300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputMonitor.freezeInputDispatchingLw(); 8744349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown 8745bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { 8746bfe319e06aa56c081d0d94d64a8181291d7f7388Dianne Hackborn mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET; 87473b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn mNextAppTransitionPackage = null; 87489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAppTransitionReady = true; 87499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 875006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 87519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (PROFILE_ORIENTATION) { 87529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project File file = new File("/data/system/frozen"); 87539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Debug.startMethodTracing(file.toString(), 8 * 1024 * 1024); 87549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8755a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn 8756a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn if (CUSTOM_SCREEN_ROTATION) { 8757f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) { 8758f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mScreenRotationAnimation.kill(); 8759f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mScreenRotationAnimation = null; 8760f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } 8761a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn if (mScreenRotationAnimation == null) { 8762f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mScreenRotationAnimation = new ScreenRotationAnimation(mContext, 8763bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mFxSession, inTransaction, mCurDisplayWidth, mCurDisplayHeight, 8764bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mDisplay.getRotation()); 8765a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn } 8766de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (!mScreenRotationAnimation.hasScreenshot()) { 8767de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn Surface.freezeDisplay(0); 8768de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 8769a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn } else { 8770a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn Surface.freezeDisplay(0); 8771a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn } 87729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 877306882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 87749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void stopFreezingDisplayLocked() { 87759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mDisplayFrozen) { 87769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 87779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 877806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 8779e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn if (mWaitingForConfig || mAppsFreezingScreen > 0 || mWindowsFreezingScreen) { 8780e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn return; 8781e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 8782e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 87839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDisplayFrozen = false; 87849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.removeMessages(H.APP_FREEZE_TIMEOUT); 87859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (PROFILE_ORIENTATION) { 87869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Debug.stopMethodTracing(); 87879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8788a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn 878989ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn boolean updateRotation = false; 879089ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn 8791de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (CUSTOM_SCREEN_ROTATION && mScreenRotationAnimation != null 8792de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn && mScreenRotationAnimation.hasScreenshot()) { 8793de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (mScreenRotationAnimation.dismiss(mFxSession, MAX_ANIMATION_DURATION, 8794bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mTransitionAnimationScale, mCurDisplayWidth, mCurDisplayHeight)) { 8795de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn requestAnimationLocked(0); 8796de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } else { 8797de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mScreenRotationAnimation = null; 8798de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn updateRotation = true; 8799a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn } 8800a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn } else { 8801de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (mScreenRotationAnimation != null) { 8802de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mScreenRotationAnimation.kill(); 8803de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mScreenRotationAnimation = null; 8804de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 8805de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn updateRotation = true; 8806a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn Surface.unfreezeDisplay(0); 8807a111187a5b4dc5d287e29ced7d65e8d20edca140Dianne Hackborn } 880806882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 880900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputMonitor.thawInputDispatchingLw(); 88109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8811420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn boolean configChanged; 8812420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn 8813b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate // While the display is frozen we don't re-compute the orientation 8814b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate // to avoid inconsistent states. However, something interesting 8815b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate // could have actually changed during that time so re-evaluate it 8816b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate // now to catch that. 8817420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn configChanged = updateOrientationFromAppTokensLocked(false); 8818b696aee7b30487feaf6188675a3f01e13ac65a13Christopher Tate 88199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // A little kludge: a lot could have happened while the 88209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // display was frozen, so now that we are coming back we 88219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // do a gc so that any remote references the system 88229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // processes holds on others can be released if they are 88239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // no longer needed. 88249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.removeMessages(H.FORCE_GC); 88259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mH.sendMessageDelayed(mH.obtainMessage(H.FORCE_GC), 88269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2000); 882706882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 88289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenFrozenLock.release(); 882989ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn 883089ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn if (updateRotation) { 883189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation"); 8832420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn configChanged |= setRotationUncheckedLocked( 883389ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn WindowManagerPolicy.USE_LAST_ROTATION, 0, false); 8834420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn } 8835420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn 8836420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn if (configChanged) { 8837420829ef78c5d86e470fc445279c7c10be6b5dbeDianne Hackborn mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION); 883889ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn } 88399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 884006882f8effe0f69fb689c46b4fe876329ce60adaRomain Guy 8841b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn static int getPropertyInt(String[] tokens, int index, int defUnits, int defDps, 8842b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn DisplayMetrics dm) { 8843b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn if (index < tokens.length) { 8844b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn String str = tokens[index]; 8845b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn if (str != null && str.length() > 0) { 8846b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn try { 8847b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn int val = Integer.parseInt(str); 8848b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn return val; 8849b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } catch (Exception e) { 8850b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } 8851b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } 8852fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 8853fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn if (defUnits == TypedValue.COMPLEX_UNIT_PX) { 8854fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn return defDps; 8855fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 8856fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn int val = (int)TypedValue.applyDimension(defUnits, defDps, dm); 8857fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn return val; 8858fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 8859fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn 8860fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn void createWatermark() { 8861fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn if (mWatermark != null) { 8862fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn return; 8863fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 8864fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn 8865b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn File file = new File("/system/etc/setup.conf"); 8866b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn FileInputStream in = null; 8867b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn try { 8868b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn in = new FileInputStream(file); 8869b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn DataInputStream ind = new DataInputStream(in); 8870b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn String line = ind.readLine(); 8871b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn if (line != null) { 8872b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn String[] toks = line.split("%"); 8873b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn if (toks != null && toks.length > 0) { 8874bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown mWatermark = new Watermark(mRealDisplayMetrics, mFxSession, toks); 8875b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } 8876b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } 8877b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } catch (FileNotFoundException e) { 8878b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } catch (IOException e) { 8879b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } finally { 8880b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn if (in != null) { 8881b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn try { 8882b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn in.close(); 8883b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } catch (IOException e) { 8884b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } 8885b9fb1705e805b7074f5ccc3bf398181706854bfbDianne Hackborn } 8886fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 8887fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn } 8888fb86ce93079db4465a61489275c65bcf8ce4669eDianne Hackborn 88899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8890664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato public void statusBarVisibilityChanged(int visibility) { 889105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown mInputManager.setSystemUiVisibility(visibility); 8892664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato synchronized (mWindowMap) { 8893664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato final int N = mWindows.size(); 8894664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato for (int i = 0; i < N; i++) { 8895664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato WindowState ws = mWindows.get(i); 8896664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato try { 8897664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato if (ws.getAttrs().hasSystemUiListeners) { 8898664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato ws.mClient.dispatchSystemUiVisibilityChanged(visibility); 8899664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato } 8900664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato } catch (RemoteException e) { 8901664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato // so sorry 8902664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato } 8903664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato } 8904664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato } 8905664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato } 8906664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato 8907a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn void dumpInput(FileDescriptor fd, PrintWriter pw, boolean dumpAll) { 8908a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("WINDOW MANAGER INPUT (dumpsys window input)"); 890900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown mInputManager.dump(pw); 8910a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 8911a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 8912a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn void dumpPolicyLocked(FileDescriptor fd, PrintWriter pw, String[] args, boolean dumpAll) { 8913a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("WINDOW MANAGER POLICY STATE (dumpsys window policy)"); 8914a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn mPolicy.dump(" ", fd, pw, args); 8915a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 8916a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 8917a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn void dumpTokensLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll) { 8918a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("WINDOW MANAGER TOKENS (dumpsys window tokens)"); 8919a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mTokenMap.size() > 0) { 8920a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" All tokens:"); 8921a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn Iterator<WindowToken> it = mTokenMap.values().iterator(); 8922a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn while (it.hasNext()) { 8923a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowToken token = it.next(); 8924a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Token "); pw.print(token.token); 8925a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 8926a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(':'); 8927a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn token.dump(pw, " "); 8928a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 8929a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 89309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 89319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8932a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 8933a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mWallpaperTokens.size() > 0) { 8934a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 8935a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" Wallpaper tokens:"); 8936a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mWallpaperTokens.size()-1; i>=0; i--) { 8937a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowToken token = mWallpaperTokens.get(i); 8938a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Wallpaper #"); pw.print(i); 8939a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(' '); pw.print(token); 8940a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 8941a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(':'); 8942a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn token.dump(pw, " "); 8943a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 8944a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 89459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 89469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8947a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 8948a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mAppTokens.size() > 0) { 8949a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 8950a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" Application tokens in Z order:"); 8951a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mAppTokens.size()-1; i>=0; i--) { 8952a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" App #"); pw.print(i); pw.print(": "); 8953a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(mAppTokens.get(i)); 89549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8955a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 8956a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mFinishedStarting.size() > 0) { 8957a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 8958a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" Finishing start of application tokens:"); 8959a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mFinishedStarting.size()-1; i>=0; i--) { 8960a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowToken token = mFinishedStarting.get(i); 8961a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Finished Starting #"); pw.print(i); 8962a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(' '); pw.print(token); 8963a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 8964a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(':'); 8965a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn token.dump(pw, " "); 8966a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 8967a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 89689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 89699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8970a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 8971a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mExitingTokens.size() > 0) { 8972a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 8973a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" Exiting tokens:"); 8974a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mExitingTokens.size()-1; i>=0; i--) { 8975a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowToken token = mExitingTokens.get(i); 8976a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Exiting #"); pw.print(i); 8977a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(' '); pw.print(token); 8978a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 8979a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(':'); 8980a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn token.dump(pw, " "); 8981a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 8982a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 89839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 89849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8985a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 8986a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mExitingAppTokens.size() > 0) { 8987a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 8988a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" Exiting application tokens:"); 8989a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mExitingAppTokens.size()-1; i>=0; i--) { 8990a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowToken token = mExitingAppTokens.get(i); 8991a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Exiting App #"); pw.print(i); 8992a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(' '); pw.print(token); 8993a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 8994a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(':'); 89959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.dump(pw, " "); 8996a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 8997a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 89989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 89999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9000a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9001a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9002a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mOpeningApps.size() > 0) { 9003a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mOpeningApps="); pw.println(mOpeningApps); 9004a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9005a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mClosingApps.size() > 0) { 9006a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mClosingApps="); pw.println(mClosingApps); 9007a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9008a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mToTopApps.size() > 0) { 9009a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mToTopApps="); pw.println(mToTopApps); 9010a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9011a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mToBottomApps.size() > 0) { 9012a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mToBottomApps="); pw.println(mToBottomApps); 9013a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9014a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9015a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 9016a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn void dumpSessionsLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll) { 9017a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("WINDOW MANAGER SESSIONS (dumpsys window sessions)"); 9018a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mSessions.size() > 0) { 9019a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn Iterator<Session> it = mSessions.iterator(); 9020a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn while (it.hasNext()) { 9021a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn Session s = it.next(); 9022a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Session "); pw.print(s); pw.println(':'); 9023a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn s.dump(pw, " "); 9024a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9025a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9026a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9027a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 9028a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn void dumpWindowsLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll, 9029a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn ArrayList<WindowState> windows) { 9030a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("WINDOW MANAGER WINDOWS (dumpsys window windows)"); 9031a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mWindows.size()-1; i>=0; i--) { 9032a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowState w = mWindows.get(i); 9033a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (windows == null || windows.contains(w)) { 9034a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Window #"); pw.print(i); pw.print(' '); 9035a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(w); pw.println(":"); 9036a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn w.dump(pw, " ", dumpAll); 9037a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9038a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9039a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mInputMethodDialogs.size() > 0) { 9040a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9041a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" Input method dialogs:"); 9042a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mInputMethodDialogs.size()-1; i>=0; i--) { 9043a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowState w = mInputMethodDialogs.get(i); 9044a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (windows == null || windows.contains(w)) { 9045a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" IM Dialog #"); pw.print(i); pw.print(": "); pw.println(w); 90464c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 90474c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn } 9048a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9049a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mPendingRemove.size() > 0) { 9050a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9051a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" Remove pending for:"); 9052a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mPendingRemove.size()-1; i>=0; i--) { 9053a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowState w = mPendingRemove.get(i); 9054a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (windows == null || windows.contains(w)) { 9055a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Remove #"); pw.print(i); pw.print(' '); 9056a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(w); 9057a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9058a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(":"); 9059a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn w.dump(pw, " ", true); 9060a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 9061a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9062a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 90639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 90649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9065a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9066a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mForceRemoves != null && mForceRemoves.size() > 0) { 9067a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9068a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" Windows force removing:"); 9069a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mForceRemoves.size()-1; i>=0; i--) { 9070a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowState w = mForceRemoves.get(i); 9071a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Removing #"); pw.print(i); pw.print(' '); 9072a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(w); 9073a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9074a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(":"); 9075a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn w.dump(pw, " ", true); 9076a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 9077a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 90789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 90799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9080a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9081a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mDestroySurface.size() > 0) { 9082a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9083a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" Windows waiting to destroy their surface:"); 9084a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mDestroySurface.size()-1; i>=0; i--) { 9085a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowState w = mDestroySurface.get(i); 9086a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (windows == null || windows.contains(w)) { 9087a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Destroy #"); pw.print(i); pw.print(' '); 9088a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(w); 9089a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9090a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(":"); 9091a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn w.dump(pw, " ", true); 9092a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 9093a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9094a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 90959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 90969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9097a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9098a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mLosingFocus.size() > 0) { 9099a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9100a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" Windows losing focus:"); 9101a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mLosingFocus.size()-1; i>=0; i--) { 9102a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowState w = mLosingFocus.get(i); 9103a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (windows == null || windows.contains(w)) { 9104a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Losing #"); pw.print(i); pw.print(' '); 9105a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(w); 9106a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9107a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(":"); 9108a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn w.dump(pw, " ", true); 9109a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 9110a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9111a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9112a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9113a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9114a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9115a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mResizingWindows.size() > 0) { 9116a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9117a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" Windows waiting to resize:"); 9118a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mResizingWindows.size()-1; i>=0; i--) { 9119a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowState w = mResizingWindows.get(i); 9120a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (windows == null || windows.contains(w)) { 9121a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Resizing #"); pw.print(i); pw.print(' '); 9122a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(w); 9123a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9124a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(":"); 9125a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn w.dump(pw, " ", true); 9126a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 9127a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9128a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 91299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 91309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9131a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9132a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9133a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mDisplay != null) { 9134a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" Display: init="); pw.print(mInitialDisplayWidth); pw.print("x"); 9135a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(mInitialDisplayHeight); pw.print(" base="); 9136a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(mBaseDisplayWidth); pw.print("x"); pw.print(mBaseDisplayHeight); 9137a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" cur="); 9138a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(mCurDisplayWidth); pw.print("x"); pw.print(mCurDisplayHeight); 9139a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" app="); 9140a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(mAppDisplayWidth); pw.print("x"); pw.print(mAppDisplayHeight); 9141a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" raw="); pw.print(mDisplay.getRawWidth()); 9142a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print("x"); pw.println(mDisplay.getRawHeight()); 9143a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 9144a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" NO DISPLAY"); 9145a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9146a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mCurConfiguration="); pw.println(this.mCurConfiguration); 9147a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mCurrentFocus="); pw.println(mCurrentFocus); 9148a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mLastFocus != mCurrentFocus) { 91491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mLastFocus="); pw.println(mLastFocus); 9150a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9151a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mFocusedApp="); pw.println(mFocusedApp); 9152a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mInputMethodTarget != null) { 91531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mInputMethodTarget="); pw.println(mInputMethodTarget); 9154a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9155a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mInTouchMode="); pw.print(mInTouchMode); 9156a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mLayoutSeq="); pw.println(mLayoutSeq); 9157a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9158a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mInputMethodWindow != null) { 9159a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mInputMethodWindow="); pw.println(mInputMethodWindow); 9160a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9161f21adf6fc19bc9c6908c6f1aaae203389f104bfaDianne Hackborn pw.print(" mWallpaperTarget="); pw.println(mWallpaperTarget); 9162284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn if (mLowerWallpaperTarget != null && mUpperWallpaperTarget != null) { 9163284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn pw.print(" mLowerWallpaperTarget="); pw.println(mLowerWallpaperTarget); 9164284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn pw.print(" mUpperWallpaperTarget="); pw.println(mUpperWallpaperTarget); 9165284ac93aa30642fda87d5c40263a1263677c21cdDianne Hackborn } 91666c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn if (mWindowDetachedWallpaper != null) { 91676c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn pw.print(" mWindowDetachedWallpaper="); pw.println(mWindowDetachedWallpaper); 91686c8e20f96ae26533eb8081f4eab845ec710f9c9bDianne Hackborn } 9169a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mLastWallpaperX="); pw.print(mLastWallpaperX); 9170a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mLastWallpaperY="); pw.println(mLastWallpaperY); 9171a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mInputMethodAnimLayerAdjustment != 0 || 9172a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn mWallpaperAnimLayerAdjustment != 0) { 9173a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mInputMethodAnimLayerAdjustment="); 9174a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(mInputMethodAnimLayerAdjustment); 9175a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.print(" mWallpaperAnimLayerAdjustment="); 9176a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(mWallpaperAnimLayerAdjustment); 9177a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9178de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn if (mWindowAnimationBackgroundSurface != null) { 9179de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn pw.println(" mWindowAnimationBackgroundSurface:"); 9180de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mWindowAnimationBackgroundSurface.printTo(" ", pw); 9181de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn } 91821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mSystemBooted="); pw.print(mSystemBooted); 91831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mDisplayEnabled="); pw.println(mDisplayEnabled); 91841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mLayoutNeeded="); pw.print(mLayoutNeeded); 91851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mBlurShown="); pw.println(mBlurShown); 91860a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima if (mDimAnimator != null) { 9187de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn pw.println(" mDimAnimator:"); 9188de75cb4738376c4cfe15c56aba7cd78d90e3100eDianne Hackborn mDimAnimator.printTo(" ", pw); 91890a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima } else { 9190a2e92266b3f768f74ab7fcb42972a22d6c739b39Dianne Hackborn pw.println( " no DimAnimator "); 91910a5d2c469108ee8d45d55c10ad5ce5f746afaa1fMitsuru Oshima } 91921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mDisplayFrozen="); pw.print(mDisplayFrozen); 91931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mWindowsFreezingScreen="); pw.print(mWindowsFreezingScreen); 9194e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn pw.print(" mAppsFreezingScreen="); pw.print(mAppsFreezingScreen); 9195e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn pw.print(" mWaitingForConfig="); pw.println(mWaitingForConfig); 91961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mRotation="); pw.print(mRotation); 9197dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn pw.print(" mRequestedRotation="); pw.print(mRequestedRotation); 9198dacea8ce503369e7b82ff1c0e1a5a8a48863a25aDianne Hackborn pw.print(" mAltOrientation="); pw.println(mAltOrientation); 9199bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn pw.print(" mLastWindowForcedOrientation"); pw.print(mLastWindowForcedOrientation); 9200bc7386c2615a7c496deea59ac1b5ab2da7f7b61fDianne Hackborn pw.print(" mForcedAppOrientation="); pw.println(mForcedAppOrientation); 920189ba6750e5310c4da51786bd7eb559a43cab3982Dianne Hackborn pw.print(" mDeferredRotation="); pw.print(mDeferredRotation); 92029d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn pw.print(", mDeferredRotationAnimFlags="); pw.println(mDeferredRotationAnimFlags); 92031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mAnimationPending="); pw.print(mAnimationPending); 92041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mWindowAnimationScale="); pw.print(mWindowAnimationScale); 92051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mTransitionWindowAnimationScale="); pw.println(mTransitionAnimationScale); 92061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mNextAppTransition=0x"); 92071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(Integer.toHexString(mNextAppTransition)); 92089d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn pw.print(" mAppTransitionReady="); pw.println(mAppTransitionReady); 92099d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn pw.print(" mAppTransitionRunning="); pw.print(mAppTransitionRunning); 92109d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn pw.print(" mAppTransitionTimeout="); pw.println( mAppTransitionTimeout); 92113b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn if (mNextAppTransitionPackage != null) { 92123b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn pw.print(" mNextAppTransitionPackage="); 92133b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn pw.print(mNextAppTransitionPackage); 92149d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn pw.print(" mNextAppTransitionEnter=0x"); 92153b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn pw.print(Integer.toHexString(mNextAppTransitionEnter)); 92169d13264f6b5818812e61d66baaada599b8ad1fafDianne Hackborn pw.print(" mNextAppTransitionExit=0x"); 92173b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn pw.print(Integer.toHexString(mNextAppTransitionExit)); 92183b3e145d3c41fd68974e08f799b1fd1f8f060cf0Dianne Hackborn } 92191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" mStartingIconInTransition="); pw.print(mStartingIconInTransition); 92201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(", mSkipAppTransitionAnimation="); pw.println(mSkipAppTransitionAnimation); 9221a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9222a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9223a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 9224a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn boolean dumpWindows(FileDescriptor fd, PrintWriter pw, String name, String[] args, 9225a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn int opti, boolean dumpAll) { 9226a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn ArrayList<WindowState> windows = new ArrayList<WindowState>(); 9227a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if ("visible".equals(name)) { 9228a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn synchronized(mWindowMap) { 9229a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mWindows.size()-1; i>=0; i--) { 9230a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowState w = mWindows.get(i); 9231a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (w.mSurfaceShown) { 9232a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn windows.add(w); 9233a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9234a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 92351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 9236a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 9237a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn int objectId = 0; 9238a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn // See if this is an object ID. 9239a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn try { 9240a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn objectId = Integer.parseInt(name, 16); 9241a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn name = null; 9242a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } catch (RuntimeException e) { 92431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 9244a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn synchronized(mWindowMap) { 9245a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn for (int i=mWindows.size()-1; i>=0; i--) { 9246a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn WindowState w = mWindows.get(i); 9247a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (name != null) { 9248a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (w.mAttrs.getTitle().toString().contains(name)) { 9249a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn windows.add(w); 9250a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9251a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else if (System.identityHashCode(w) == objectId) { 9252a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn windows.add(w); 9253a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9254a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9255a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 9256a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9257a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 9258a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (windows.size() <= 0) { 9259a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn return false; 9260a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9261a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 9262a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn synchronized(mWindowMap) { 9263a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpWindowsLocked(fd, pw, dumpAll, windows); 9264a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9265a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn return true; 9266a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9267a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 9268a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn @Override 9269a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 9270a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (mContext.checkCallingOrSelfPermission("android.permission.DUMP") 9271a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn != PackageManager.PERMISSION_GRANTED) { 9272a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("Permission Denial: can't dump WindowManager from from pid=" 9273a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn + Binder.getCallingPid() 9274a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn + ", uid=" + Binder.getCallingUid()); 9275a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn return; 9276a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9277a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 9278a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn boolean dumpAll = false; 9279a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 9280a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn int opti = 0; 9281a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn while (opti < args.length) { 9282a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn String opt = args[opti]; 9283a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (opt == null || opt.length() <= 0 || opt.charAt(0) != '-') { 9284a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn break; 9285a8f6018d6c2d28313f9550fa8fcb39c2f607e09cDianne Hackborn } 9286a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn opti++; 9287a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if ("-a".equals(opt)) { 9288a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpAll = true; 9289a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else if ("-h".equals(opt)) { 9290a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("Window manager dump options:"); 9291a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" [-a] [-h] [cmd] ..."); 9292a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" cmd may be one of:"); 9293a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" i[input]: input subsystem state"); 9294a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" p[policy]: policy state"); 9295a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" s[essions]: active sessions"); 9296a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" t[okens]: token list"); 9297a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" w[indows]: window list"); 9298a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" cmd may also be a NAME to dump windows. NAME may"); 9299a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" be a partial substring in a window name, a"); 9300a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" Window hex object identifier, or"); 9301a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" \"all\" for all windows, or"); 9302a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" \"visible\" for the visible windows."); 9303a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(" -a: include all available server state."); 9304a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn return; 930587fc30828209afa25be69ac7053241f4eaeb3378Dianne Hackborn } else { 9306a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("Unknown argument: " + opt + "; use -h for help"); 9307a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9308a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9309a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 9310a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn // Is the caller requesting to dump a particular piece of data? 9311a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (opti < args.length) { 9312a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn String cmd = args[opti]; 9313a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn opti++; 9314a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if ("input".equals(cmd) || "i".equals(cmd)) { 9315a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpInput(fd, pw, true); 9316a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn return; 9317a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else if ("policy".equals(cmd) || "p".equals(cmd)) { 9318a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn synchronized(mWindowMap) { 9319a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpPolicyLocked(fd, pw, args, true); 9320a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9321a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn return; 9322a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else if ("sessions".equals(cmd) || "s".equals(cmd)) { 9323a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn synchronized(mWindowMap) { 9324a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpSessionsLocked(fd, pw, true); 9325a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9326a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn return; 9327a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else if ("tokens".equals(cmd) || "t".equals(cmd)) { 9328a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn synchronized(mWindowMap) { 9329a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpTokensLocked(fd, pw, true); 9330a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9331a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn return; 9332a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else if ("windows".equals(cmd) || "w".equals(cmd)) { 9333a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn synchronized(mWindowMap) { 9334a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpWindowsLocked(fd, pw, true, null); 9335a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9336a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn return; 9337a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else if ("all".equals(cmd) || "a".equals(cmd)) { 9338a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn synchronized(mWindowMap) { 9339a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpWindowsLocked(fd, pw, true, null); 9340a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9341a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn return; 9342a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } else { 9343a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn // Dumping a single name? 9344a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (!dumpWindows(fd, pw, cmd, args, opti, dumpAll)) { 9345a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("Bad window command, or no windows match: " + cmd); 9346a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("Use -h for help."); 9347a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9348a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn return; 9349a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9350a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9351a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 9352a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpInput(fd, pw, dumpAll); 9353a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn 9354a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn synchronized(mWindowMap) { 9355a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9356a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("-------------------------------------------------------------------------------"); 9357a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9358a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpPolicyLocked(fd, pw, args, dumpAll); 9359a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9360a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9361a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("-------------------------------------------------------------------------------"); 9362a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9363a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpSessionsLocked(fd, pw, dumpAll); 9364a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9365a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9366a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("-------------------------------------------------------------------------------"); 9367a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn } 9368a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpTokensLocked(fd, pw, dumpAll); 9369a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println(); 9370a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn if (dumpAll) { 9371a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn pw.println("-------------------------------------------------------------------------------"); 937287fc30828209afa25be69ac7053241f4eaeb3378Dianne Hackborn } 9373a44abeb125a0c8a8e5a065f868d316e41354286aDianne Hackborn dumpWindowsLocked(fd, pw, dumpAll, null); 93749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 93759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 93769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9377349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown // Called by the heartbeat to ensure locks are not held indefnitely (for deadlock detection). 93789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void monitor() { 93799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mWindowMap) { } 9380983ee099de60e0288997e33e3fea5c4ff647f5cdMike Lockwood synchronized (mKeyguardTokenWatcher) { } 9381ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn } 9382ab5c49c7e7f5f61040650109a76f38a443fb852dDoug Zongker 93832992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown public interface OnHardKeyboardStatusChangeListener { 93842992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown public void onHardKeyboardStatusChange(boolean available, boolean enabled); 93852992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 93869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9387